diff options
author | 2018-08-16 13:32:01 -0700 | |
---|---|---|
committer | 2018-08-16 13:32:01 -0700 | |
commit | bb5d67ae856e66dd99600fbae8973e8fd7de801a (patch) | |
tree | 0965536ec669bd5378a1e161e2f2bedf49a15145 /tensorflow/core/graph | |
parent | 135ac89cae38464a9c6ea21af244e4a1bda255ed (diff) | |
parent | 9c50882415cb87a7eb81048d42401c64bf0617ef (diff) |
Merge branch 'master' into pooling3d
Diffstat (limited to 'tensorflow/core/graph')
-rw-r--r-- | tensorflow/core/graph/gradients.cc | 41 | ||||
-rw-r--r-- | tensorflow/core/graph/mkl_layout_pass.cc | 39 | ||||
-rw-r--r-- | tensorflow/core/graph/testlib.cc | 25 |
3 files changed, 56 insertions, 49 deletions
diff --git a/tensorflow/core/graph/gradients.cc b/tensorflow/core/graph/gradients.cc index c1a8a63784..bec41712b1 100644 --- a/tensorflow/core/graph/gradients.cc +++ b/tensorflow/core/graph/gradients.cc @@ -65,16 +65,37 @@ struct NodeOutEq { static Node* AddZerosLike(Graph* g, NodeOut input) { DCHECK_LT(0, input.dtype()); DCHECK_LT(input.dtype(), DT_FLOAT_REF); - NodeDef ndef; - ndef.set_name(g->NewName(kNodeLabel)); - ndef.set_op("ZerosLike"); - ndef.add_input(input.name()); - AddNodeAttr("T", input.dtype(), &ndef); - Status s; - Node* ret = g->AddNode(ndef, &s); - TF_CHECK_OK(s); - g->AddEdge(input.node, input.index, ret, 0); - return ret; + if (input.dtype() == DT_RESOURCE) { + NodeDef read_def; + read_def.set_name(g->NewName("Read")); + read_def.set_op("ReadVariableOp"); + read_def.add_input(input.name()); + AddNodeAttr("dtype", DT_FLOAT, &read_def); + Status s; + Node* read = g->AddNode(read_def, &s); + TF_CHECK_OK(s); + g->AddEdge(input.node, input.index, read, 0); + NodeDef ndef; + ndef.set_name(g->NewName(kNodeLabel)); + ndef.set_op("ZerosLike"); + ndef.add_input(read_def.name()); + AddNodeAttr("T", DT_FLOAT, &ndef); + Node* ret = g->AddNode(ndef, &s); + TF_CHECK_OK(s); + g->AddEdge(read, 0, ret, 0); + return ret; + } else { + NodeDef ndef; + ndef.set_name(g->NewName(kNodeLabel)); + ndef.set_op("ZerosLike"); + ndef.add_input(input.name()); + AddNodeAttr("T", input.dtype(), &ndef); + Status s; + Node* ret = g->AddNode(ndef, &s); + TF_CHECK_OK(s); + g->AddEdge(input.node, input.index, ret, 0); + return ret; + } } static Node* AddSymGrad(Graph* g, Node* n, gtl::ArraySlice<NodeOut> grads) { diff --git a/tensorflow/core/graph/mkl_layout_pass.cc b/tensorflow/core/graph/mkl_layout_pass.cc index 30e48d3860..7e501c1717 100644 --- a/tensorflow/core/graph/mkl_layout_pass.cc +++ b/tensorflow/core/graph/mkl_layout_pass.cc @@ -2421,6 +2421,9 @@ class MklLayoutRewritePass : public GraphOptimizationPass { csinfo_.conv2d_grad_filter = "Conv2DBackpropFilter"; csinfo_.conv2d_grad_filter_with_bias = "__MklDummyConv2DBackpropFilterWithBias"; + csinfo_.conv3d = "Conv3D"; + csinfo_.conv3d_grad_input = "Conv3DBackpropInputV2"; + csinfo_.conv3d_grad_filter = "Conv3DBackpropFilterV2"; csinfo_.fused_batch_norm = "FusedBatchNorm"; csinfo_.fused_batch_norm_grad = "FusedBatchNormGrad"; csinfo_.identity = "Identity"; @@ -2479,18 +2482,27 @@ class MklLayoutRewritePass : public GraphOptimizationPass { CopyAttrsConcatV2, AlwaysRewrite}); rinfo_.push_back({csinfo_.conv2d, mkl_op_registry::GetMklOpName(csinfo_.conv2d), - CopyAttrsConv2D, AlwaysRewrite}); + CopyAttrsConv, AlwaysRewrite}); rinfo_.push_back({csinfo_.conv2d_with_bias, csinfo_.mkl_conv2d_with_bias, - CopyAttrsConv2D, AlwaysRewrite}); + CopyAttrsConv, AlwaysRewrite}); rinfo_.push_back({csinfo_.conv2d_grad_filter, mkl_op_registry::GetMklOpName(csinfo_.conv2d_grad_filter), - CopyAttrsConv2D, AlwaysRewrite}); + CopyAttrsConv, AlwaysRewrite}); rinfo_.push_back({csinfo_.conv2d_grad_filter_with_bias, - csinfo_.mkl_conv2d_grad_filter_with_bias, CopyAttrsConv2D, + csinfo_.mkl_conv2d_grad_filter_with_bias, CopyAttrsConv, AlwaysRewrite}); rinfo_.push_back({csinfo_.conv2d_grad_input, mkl_op_registry::GetMklOpName(csinfo_.conv2d_grad_input), - CopyAttrsConv2D, AlwaysRewrite}); + CopyAttrsConv, AlwaysRewrite}); + rinfo_.push_back({csinfo_.conv3d, + mkl_op_registry::GetMklOpName(csinfo_.conv3d), + CopyAttrsConv, AlwaysRewrite}); + rinfo_.push_back({csinfo_.conv3d_grad_filter, + mkl_op_registry::GetMklOpName(csinfo_.conv3d_grad_filter), + CopyAttrsConv, AlwaysRewrite}); + rinfo_.push_back({csinfo_.conv3d_grad_input, + mkl_op_registry::GetMklOpName(csinfo_.conv3d_grad_input), + CopyAttrsConv, AlwaysRewrite}); rinfo_.push_back({csinfo_.fused_batch_norm, mkl_op_registry::GetMklOpName(csinfo_.fused_batch_norm), CopyAttrsFusedBatchNorm, AlwaysRewrite}); @@ -2634,6 +2646,9 @@ class MklLayoutRewritePass : public GraphOptimizationPass { string conv2d_grad_input; string conv2d_grad_filter; string conv2d_grad_filter_with_bias; + string conv3d; + string conv3d_grad_input; + string conv3d_grad_filter; string fused_batch_norm; string fused_batch_norm_grad; string identity; @@ -3108,7 +3123,7 @@ class MklLayoutRewritePass : public GraphOptimizationPass { static void CopyAttrsBiasAddGrad(const Node* orig_node, NodeBuilder* nb); static void CopyAttrsConcat(const Node* orig_node, NodeBuilder* nb); static void CopyAttrsConcatV2(const Node* orig_node, NodeBuilder* nb); - static void CopyAttrsConv2D(const Node* orig_node, NodeBuilder* nb); + static void CopyAttrsConv(const Node* orig_node, NodeBuilder* nb); static void CopyAttrsDataType(const Node* orig_node, NodeBuilder* nb); static void CopyAttrsFusedBatchNorm(const Node* orig_node, NodeBuilder* nb); static void CopyAttrsLRN(const Node* orig_node, NodeBuilder* nb); @@ -3593,14 +3608,13 @@ void MklLayoutRewritePass::AddWorkSpaceEdgeIfNeeded( // Op-specific functions to copy attributes from old node to new node ////////////////////////////////////////////////////////////////////////// -void MklLayoutRewritePass::CopyAttrsConv2D(const Node* orig_node, - NodeBuilder* nb) { +void MklLayoutRewritePass::CopyAttrsConv(const Node* orig_node, + NodeBuilder* nb) { DataType T; string data_format; string padding; std::vector<int32> strides; std::vector<int32> dilations; - bool use_cudnn_on_gpu; // Get all attributes from old node. TF_CHECK_OK(GetNodeAttr(orig_node->def(), "T", &T)); @@ -3608,8 +3622,6 @@ void MklLayoutRewritePass::CopyAttrsConv2D(const Node* orig_node, TF_CHECK_OK(GetNodeAttr(orig_node->def(), "dilations", &dilations)); TF_CHECK_OK(GetNodeAttr(orig_node->def(), "padding", &padding)); TF_CHECK_OK(GetNodeAttr(orig_node->def(), "data_format", &data_format)); - TF_CHECK_OK( - GetNodeAttr(orig_node->def(), "use_cudnn_on_gpu", &use_cudnn_on_gpu)); // Add attributes to new node. nb->Attr("T", T); @@ -3617,7 +3629,6 @@ void MklLayoutRewritePass::CopyAttrsConv2D(const Node* orig_node, nb->Attr("dilations", dilations); nb->Attr("padding", padding); nb->Attr("data_format", data_format); - nb->Attr("use_cudnn_on_gpu", use_cudnn_on_gpu); } void MklLayoutRewritePass::CopyAttrsAddN(const Node* orig_node, @@ -3918,7 +3929,7 @@ Status MklLayoutRewritePass::MergeConv2DWithBiasAdd(std::unique_ptr<Graph>* g, nb.Input(succ_in[1].first, succ_in[1].second); // In2 of BiasAdd // Copy attributes from Conv2D to Conv2DWithBias. - CopyAttrsConv2D(const_cast<const Node*>(pred), &nb); + CopyAttrsConv(const_cast<const Node*>(pred), &nb); // Copy the device assigned to old node to new node. nb.Device(succ->def().device()); @@ -4029,7 +4040,7 @@ Status MklLayoutRewritePass::MergeConv2DBackpropFilterWithBiasAddGrad( } // Copy attributes from Conv2DBackpropFilter. - CopyAttrsConv2D(const_cast<const Node*>(fltr), &nb); + CopyAttrsConv(const_cast<const Node*>(fltr), &nb); // Copy the device assigned to old node to new node. nb.Device(fltr->def().device()); diff --git a/tensorflow/core/graph/testlib.cc b/tensorflow/core/graph/testlib.cc index 67b252cb6c..ea7788f654 100644 --- a/tensorflow/core/graph/testlib.cc +++ b/tensorflow/core/graph/testlib.cc @@ -21,39 +21,14 @@ limitations under the License. #include "tensorflow/core/framework/node_def_builder.h" #include "tensorflow/core/framework/node_def_util.h" #include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/op_kernel.h" #include "tensorflow/core/framework/types.h" #include "tensorflow/core/framework/types.pb.h" #include "tensorflow/core/graph/graph.h" #include "tensorflow/core/graph/node_builder.h" -#include "tensorflow/core/kernels/constant_op.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/logging.h" namespace tensorflow { - -// HostConst: forced to generate output on the host. -// Only used by testlib; no op is registered for this kernel -// externally (i.e., in array_ops.cc) -REGISTER_KERNEL_BUILDER(Name("HostConst").Device(DEVICE_CPU), HostConstantOp); -REGISTER_KERNEL_BUILDER( - Name("HostConst").Device(DEVICE_GPU).HostMemory("output"), HostConstantOp); -#ifdef TENSORFLOW_USE_SYCL -REGISTER_KERNEL_BUILDER( - Name("HostConst").Device(DEVICE_SYCL).HostMemory("output"), HostConstantOp); -#endif // TENSORFLOW_USE_SYCL - -// Register the HostConst Op -// Returns a constant tensor on the host. Useful for writing C++ tests -// and benchmarks which run on GPU but require arguments pinned to the host. -// Used by test::graph::HostConstant. -// value: Attr `value` is the tensor to return. -REGISTER_OP("HostConst") - .Output("output: dtype") - .Attr("value: tensor") - .Attr("dtype: type") - .SetShapeFn(shape_inference::UnknownShape); - namespace test { namespace graph { |