remote_fused_graph_rewriter_transform_test.cc revision d5f4d9bbac520ad9eae6614fe678e9d1568435a4
19ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. 29ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 39ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerLicensed under the Apache License, Version 2.0 (the "License"); 49ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFloweryou may not use this file except in compliance with the License. 59ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerYou may obtain a copy of the License at 69ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 79ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower http://www.apache.org/licenses/LICENSE-2.0 89ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 99ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerUnless required by applicable law or agreed to in writing, software 109ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerdistributed under the License is distributed on an "AS IS" BASIS, 119ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 129ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerSee the License for the specific language governing permissions and 139ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerlimitations under the License. 149ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower==============================================================================*/ 159ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 169ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/cc/ops/const_op.h" 179ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/cc/ops/image_ops.h" 189ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/cc/ops/nn_ops.h" 199ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/cc/ops/standard_ops.h" 209ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/common_runtime/function.h" 219ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/framework/tensor_shape.h" 229ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/framework/tensor_testutil.h" 239ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/graph/default_device.h" 249ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/graph/node_builder.h" 259ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/graph/testlib.h" 26d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower#include "tensorflow/core/kernels/i_remote_fused_graph_executor.h" 279ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/kernels/remote_fused_graph_execute_op_test_utils.h" 289ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/kernels/remote_fused_graph_execute_utils.h" 299ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/lib/core/status_test_util.h" 309ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/platform/test.h" 319ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/public/session.h" 329ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/tools/graph_transforms/transform_utils.h" 339ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 349ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowernamespace tensorflow { 359ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowernamespace graph_transforms { 369ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 379ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower// Declared here so we don't have to put it in a public header. 389ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerStatus FuseRemoteGraph(const GraphDef& input_graph_def, 399ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower const TransformFuncContext& context, 409ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower GraphDef* output_graph_def); 419ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 421c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlowerStatus PlaceRemoteGraphArguments(const GraphDef& input_graph_def, 431c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower const TransformFuncContext& context, 441c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower GraphDef* output_graph_def); 451c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower 469ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowernamespace { 479ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerconstexpr const char* const REMOTE_FUSED_GRAPH_EXECUTOR_NAME = 489ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower "remote_fused_graph_executor_name"; 499ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerconstexpr const char* const REMOTE_FUSED_GRAPH_NODE_NAME = 509ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower "remote_fused_graph_node_name"; 51d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlowerconstexpr const char* const REMOTE_FUSED_EXECUTOR_NAME0 = 52d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower "fuse_test_remote_fused_graph_executor0"; 53d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlowerconstexpr const char* const REMOTE_FUSED_EXECUTOR_NAME1 = 54d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower "fuse_test_remote_fused_graph_executor1"; 55d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower 56d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlowerStatus BuildRemoteFusedGraphExecutor0( 57d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower std::unique_ptr<IRemoteFusedGraphExecutor>* executor) { 58d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower executor->reset( 59d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower new TestRemoteFusedGraphExecutor({"Mul"}, REMOTE_FUSED_EXECUTOR_NAME0)); 60d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower return Status::OK(); 61d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower} 62d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower 63d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlowerStatus BuildRemoteFusedGraphExecutor1( 64d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower std::unique_ptr<IRemoteFusedGraphExecutor>* executor) { 65d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower executor->reset(new TestRemoteFusedGraphExecutor( 66d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower {"Const", "Mul"}, REMOTE_FUSED_EXECUTOR_NAME1)); 67d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower return Status::OK(); 68d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower} 699ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 709ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerclass FuseRemoteGraphMultipleAddOpsRewriterTest : public ::testing::Test { 719ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower protected: 729ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower void SetUp() final { 739ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower TF_ASSERT_OK(RemoteFusedGraphExecuteOpTestUtils::BuildMultipleAddGraph( 749ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower &input_graph_def_)); 751c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower RemoteFusedGraphExecuteUtils::ExecutorBuildRegistrar 76d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower hexagon_remote_fused_graph_executor_build( 771c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower REMOTE_FUSED_GRAPH_EXECUTOR_NAME, 781c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower [](std::unique_ptr<IRemoteFusedGraphExecutor>* executor) -> Status { 791c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower return Status::OK(); 801c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower }); 81d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower RemoteFusedGraphExecuteUtils::ExecutorBuildRegistrar 82d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower test_remote_fused_graph_executor_build0(REMOTE_FUSED_EXECUTOR_NAME0, 83d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower BuildRemoteFusedGraphExecutor0); 84d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower 85d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower RemoteFusedGraphExecuteUtils::ExecutorBuildRegistrar 86d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower test_remote_fused_graph_executor_build1(REMOTE_FUSED_EXECUTOR_NAME1, 87d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower BuildRemoteFusedGraphExecutor1); 889ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower } 899ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 909ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower void TearDown() final {} 919ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 921c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower Status Fuse() { return FuseInternal(/*only_place_args=*/false); } 931c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower 941c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower Status PlaceFuseArgs() { return FuseInternal(/*only_place_args*/ true); } 951c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower 961c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower Status FuseWithPlacedArgs() { 971c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower const std::vector<std::pair<string, Tensor>> input_tensors{ 981c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower {"A", {DT_FLOAT, {1, 1, 1, 1}}}}; 991c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower return RemoteFusedGraphExecuteUtils::FuseRemoteGraphByPlacedArguments( 1001c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower input_graph_def_with_fuse_args_, input_tensors, &output_graph_def_); 1011c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower } 1021c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower 1031c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower Status FuseInternal(bool only_place_args) { 1049ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower TransformFuncContext context; 1059ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower context.input_names = inputs_; 1069ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower context.output_names = outputs_; 1079ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 1089ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower if (!input_types_.empty()) { 1099ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower context.params.insert(std::pair<string, std::vector<string>>( 1109ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower {RemoteFusedGraphExecuteUtils::TRANSFORM_ARG_INPUT_TYPES, 1119ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower {input_types_}})); 1129ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower } 1139ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower if (!input_shapes_.empty()) { 1149ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower context.params.insert(std::pair<string, std::vector<string>>( 1159ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower {RemoteFusedGraphExecuteUtils::TRANSFORM_ARG_INPUT_SHAPES, 1169ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower {input_shapes_}})); 1179ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower } 1189ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower if (!fused_node_names_str_.empty()) { 1199ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower context.params.insert(std::pair<string, std::vector<string>>( 1209ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower {RemoteFusedGraphExecuteUtils::TRANSFORM_ARG_FUSED_NODES, 1219ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower {fused_node_names_str_}})); 1229ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower } 1239ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 1249ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower if (!border_inputs_str_.empty()) { 1259ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower context.params.insert(std::pair<string, std::vector<string>>( 1269ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower {RemoteFusedGraphExecuteUtils::TRANSFORM_ARG_BORDER_INPUTS, 1279ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower {border_inputs_str_}})); 1289ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower } 1299ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower if (!border_outputs_str_.empty()) { 1309ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower context.params.insert(std::pair<string, std::vector<string>>( 1319ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower {RemoteFusedGraphExecuteUtils::TRANSFORM_ARG_BORDER_OUTPUTS, 1329ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower {border_outputs_str_}})); 1339ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower } 1349ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 135f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower if (!fused_op_types_str_.empty()) { 136f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower context.params.insert(std::pair<string, std::vector<string>>( 137f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower {RemoteFusedGraphExecuteUtils::TRANSFORM_ARG_FUSED_OP_TYPES, 138f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower {fused_op_types_str_}})); 139f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower } 140f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower 141d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower if (fuse_by_executor_) { 142d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower context.params.insert(std::pair<string, std::vector<string>>( 143d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower {RemoteFusedGraphExecuteUtils::TRANSFORM_ARG_FUSE_BY_EXECUTOR, 144d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower {"true"}})); 145d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower } 146d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower 1479ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower context.params.insert(std::pair<string, std::vector<string>>( 1489ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower {RemoteFusedGraphExecuteUtils:: 1499ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower TRANSFORM_ARG_REMOTE_FUSED_GRAPH_EXECUTOR_NAME, 150d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower {remote_fused_graph_executor_name_}})); 1519ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower context.params.insert(std::pair<string, std::vector<string>>( 1529ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower {RemoteFusedGraphExecuteUtils:: 1539ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower TRANSFORM_ARG_REMOTE_FUSED_GRAPH_NODE_NAME, 1549ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower {REMOTE_FUSED_GRAPH_NODE_NAME}})); 1559ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 1561c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower if (only_place_args) { 1571c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower return PlaceRemoteGraphArguments(input_graph_def_, context, 1581c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower &input_graph_def_with_fuse_args_); 1591c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower } else { 1601c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower return FuseRemoteGraph(input_graph_def_, context, &output_graph_def_); 1611c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower } 1629ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower } 1639ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 1649ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower void SetInputShapeType() { 1659ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower input_types_ = "float"; 1669ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower input_shapes_ = "1,1,1,1"; 1679ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower } 1689ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 169f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower void ReplaceOpType(const std::unordered_set<string>& op_name, 170f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower const string& new_op_type) { 171f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower for (NodeDef& node_def : *input_graph_def_.mutable_node()) { 172f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower if (op_name.count(node_def.name()) > 0) { 173f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower node_def.set_op(new_op_type); 174f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower } 175f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower } 176f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower } 177f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower 1789ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower void CheckGraph(int expected_node_count, int expected_cluster_count) { 1799ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower EXPECT_EQ(expected_node_count, output_graph_def_.node_size()); 1809ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 1819ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower int cluster_count = 0; 1829ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower for (const NodeDef& node_def : output_graph_def_.node()) { 1839ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower const string& name = node_def.name(); 1849ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower if (StringPiece(name).starts_with(REMOTE_FUSED_GRAPH_NODE_NAME)) { 1859ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower ++cluster_count; 1869ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower RemoteFusedGraphExecuteInfo info; 1879ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower string serialized_proto; 1889ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower TF_ASSERT_OK( 1899ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower GetNodeAttr(node_def, 1909ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower RemoteFusedGraphExecuteUtils:: 1919ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower ATTR_SERIALIZED_REMOTE_FUSED_GRAPH_EXECUTE_INFO, 1929ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower &serialized_proto)); 1939ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower info.ParseFromString(serialized_proto); 194d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower CHECK_EQ(remote_fused_graph_executor_name_, info.executor_name()); 1959ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower } 1969ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower } 1979ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower EXPECT_EQ(expected_cluster_count, cluster_count); 1989ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower } 1999ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 2009ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower public: 2019ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower const std::vector<string> inputs_{"A"}; 2029ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower const std::vector<string> outputs_{"K"}; 2039ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower GraphDef input_graph_def_; 2049ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower string input_types_; 2059ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower string input_shapes_; 2061c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower GraphDef input_graph_def_with_fuse_args_; 2079ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower GraphDef output_graph_def_; 2089ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower string fused_node_names_str_; 2099ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower string border_inputs_str_; 2109ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower string border_outputs_str_; 211f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower string fused_op_types_str_; 212d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower string remote_fused_graph_executor_name_{REMOTE_FUSED_GRAPH_EXECUTOR_NAME}; 213d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower bool fuse_by_executor_{false}; 2149ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower}; 2159ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 2169ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, 2179ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower FuseRemoteGraphByNodesWithShapeType_HIJ) { 2189ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower SetInputShapeType(); 2199ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower fused_node_names_str_ = "H,I,J"; 2209ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower TF_ASSERT_OK(Fuse()); 2219ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower CheckGraph(9, 1); 2229ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower} 2239ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 2249ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, 2259ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower FuseRemoteGraphByNodesWithoutShapeType_HIJ) { 2269ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower fused_node_names_str_ = "H,I,J"; 2279ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower TF_ASSERT_OK(Fuse()); 2289ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower CheckGraph(9, 1); 2299ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower} 2309ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 2319ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, 2329ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower FuseRemoteGraphByNodesWithShapeType_ABCDEFGHIJK) { 2339ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower SetInputShapeType(); 2349ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower fused_node_names_str_ = "A,B,C,D,E,F,G,H,I,J,K"; 2359ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower TF_ASSERT_OK(Fuse()); 2369ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower CheckGraph(3, 1); 2379ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower} 2389ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 2399ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, 2409ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower FuseRemoteGraphByNodesWithoutShapeType_ABCDEFGHIJK) { 2419ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower fused_node_names_str_ = "A,B,C,D,E,F,G,H,I,J,K"; 2429ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower TF_ASSERT_OK(Fuse()); 2439ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower CheckGraph(3, 1); 2449ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower} 2459ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 2469ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, 2479ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower FuseRemoteGraphByBorderWithShapeType_FCG_J) { 2489ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower SetInputShapeType(); 2499ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower border_inputs_str_ = "F:0,C:0,G"; 2509ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower border_outputs_str_ = "J:0"; 2519ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower TF_ASSERT_OK(Fuse()); 2529ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower CheckGraph(9, 1); 2539ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower} 2549ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 2559ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, 2569ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower FuseRemoteGraphByBorderWithoutShapeType_FCG_J) { 2579ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower border_inputs_str_ = "F:0,C:0,G"; 2589ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower border_outputs_str_ = "J:0"; 2599ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower TF_ASSERT_OK(Fuse()); 2609ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower CheckGraph(9, 1); 2619ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower} 2629ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 2639ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, 2649ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower FuseRemoteGraphByBorderWithShapeType_ABCDE_K) { 2659ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower SetInputShapeType(); 2669ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower border_inputs_str_ = "A,B,C,D,E"; 2679ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower border_outputs_str_ = "K"; 2689ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower TF_ASSERT_OK(Fuse()); 2699ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower CheckGraph(7, 1); 2709ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower} 2719ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 2729ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, 2739ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower FuseRemoteGraphByBorderWithoutShapeType_ABCDE_K) { 2749ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower border_inputs_str_ = "A,B,C,D,E"; 2759ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower border_outputs_str_ = "K"; 2769ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower TF_ASSERT_OK(Fuse()); 2779ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower CheckGraph(7, 1); 2789ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower} 2799ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower 280f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, 281f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower FuseRemoteGraphByOpTypes_HIJ) { 282f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower ReplaceOpType({"H", "I", "J"}, "Mul"); 283f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower fused_op_types_str_ = "Mul"; 284f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower TF_ASSERT_OK(Fuse()); 285f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower CheckGraph(9, 1); 286f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower} 287f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower 288f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, 289f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower FuseRemoteGraphByOpTypes_FGHIJ) { 290f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower ReplaceOpType({"F", "G", "H", "I", "J"}, "Mul"); 291f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower fused_op_types_str_ = "Const,Mul"; 292f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower TF_ASSERT_OK(Fuse()); 293f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower CheckGraph(3, 1); 294f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower} 295f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower 296d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, 297d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower FuseRemoteGraphByExecutor_HIJ) { 298d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower ReplaceOpType({"H", "I", "J"}, "Mul"); 299d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower remote_fused_graph_executor_name_ = REMOTE_FUSED_EXECUTOR_NAME0; 300d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower fuse_by_executor_ = true; 301d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower TF_ASSERT_OK(Fuse()); 302d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower CheckGraph(9, 1); 303d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower} 304d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower 305d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, 306d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower FuseRemoteGraphByExecutor_FGHIJ) { 307d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower ReplaceOpType({"F", "G", "H", "I", "J"}, "Mul"); 308d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower remote_fused_graph_executor_name_ = REMOTE_FUSED_EXECUTOR_NAME1; 309d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower fuse_by_executor_ = true; 310d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower TF_ASSERT_OK(Fuse()); 311d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower CheckGraph(3, 1); 312d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower} 313d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower 3141c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, PlaceAndFuse_HIJ) { 3151c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower fused_node_names_str_ = "H,I,J"; 3161c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower TF_ASSERT_OK(PlaceFuseArgs()); 3171c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower TF_ASSERT_OK(FuseWithPlacedArgs()); 3181c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower CheckGraph(9, 1); 3191c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower} 3201c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower 3211c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, PlaceAndFuse_ABCDEFGHIJK) { 3221c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower fused_node_names_str_ = "A,B,C,D,E,F,G,H,I,J,K"; 3231c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower TF_ASSERT_OK(PlaceFuseArgs()); 3241c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower TF_ASSERT_OK(FuseWithPlacedArgs()); 3251c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower CheckGraph(3, 1); 3261c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower} 3271c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower 3281c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, PlaceAndFuse_FCG_J) { 3291c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower border_inputs_str_ = "F:0,C:0,G"; 3301c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower border_outputs_str_ = "J:0"; 3311c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower TF_ASSERT_OK(PlaceFuseArgs()); 3321c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower TF_ASSERT_OK(FuseWithPlacedArgs()); 3331c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower CheckGraph(9, 1); 3341c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower} 3351c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower 3361c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, PlaceAndFuse_ABCDE_K) { 3371c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower SetInputShapeType(); 3381c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower border_inputs_str_ = "A,B,C,D,E"; 3391c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower border_outputs_str_ = "K"; 3401c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower TF_ASSERT_OK(PlaceFuseArgs()); 3411c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower TF_ASSERT_OK(FuseWithPlacedArgs()); 3421c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower CheckGraph(7, 1); 3431c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower} 3441c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower 345f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, PlaceAndFuse_MUL_HIJ) { 346f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower SetInputShapeType(); 347f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower ReplaceOpType({"H", "I", "J"}, "Mul"); 348f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower fused_op_types_str_ = "Mul"; 349f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower 350f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower TF_ASSERT_OK(PlaceFuseArgs()); 351f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower TF_ASSERT_OK(FuseWithPlacedArgs()); 352f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower CheckGraph(9, 1); 353f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower} 354f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower 355f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, 356f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower PlaceAndFuse_CONST_MUL_FGHIJ) { 357f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower SetInputShapeType(); 358f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower ReplaceOpType({"F", "G", "H", "I", "J"}, "Mul"); 359f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower fused_op_types_str_ = "Const,Mul"; 360f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower 361f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower TF_ASSERT_OK(PlaceFuseArgs()); 362f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower TF_ASSERT_OK(FuseWithPlacedArgs()); 363f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower CheckGraph(3, 1); 364f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower} 365f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower 3669ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower} // namespace 3679ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower} // namespace graph_transforms 3689ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower} // namespace tensorflow 369