/* Copyright 2022 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. ==============================================================================*/ #include "llvm/ADT/DenseMap.h" #include "tensorflow/compiler/mlir/tensorflow/ir/tf_device.h" #include "tensorflow/compiler/mlir/tensorflow/ir/tf_ops.h" #include "tensorflow/dtensor/mlir/expansions/argmax_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/bias_add_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/broadcast_to_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/concat_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/control_flow_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/conv_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/cumsum_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/dataparallel_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/disable_copy_on_read_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/dtensor_op_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/einsum_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/elementwise_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/expanddims_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/fft_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/fill_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/gather_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/identity_n_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/in_top_k_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/io_op_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/iterator_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/matmul_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/meta_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/nullary_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/optional_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/qr_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/random_op_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/range_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/reduce_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/replicated_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/resource_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/save_restore_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/scatter_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/segmentation_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/slice_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/softmax_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/sparse_to_dense_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/split_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/squeeze_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/strided_slice_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/tensorlist_getitem_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/tensorlist_reserve_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/tensorlist_setitem_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/top_k_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/trivial_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/unsupported_op_spmd_expander.h" #include "tensorflow/dtensor/mlir/expansions/where_spmd_expander.h" #include "tensorflow/dtensor/mlir/ir/tf_dtensor.h" #include "tensorflow/dtensor/mlir/spmd_expander.h" namespace tensorflow { namespace dtensor { // Nullary REGISTER_SPMD(Const, TF::ConstOp, NullarySPMDExpander); // Unary REGISTER_SPMD(Abs, TF::AbsOp, ElementwiseSPMDExpander); REGISTER_SPMD(Cast, TF::CastOp, ElementwiseSPMDExpander); REGISTER_SPMD(Identity, TF::IdentityOp, ElementwiseSPMDExpander); REGISTER_SPMD(Neg, TF::NegOp, ElementwiseSPMDExpander); REGISTER_SPMD(ZerosLike, TF::ZerosLikeOp, ElementwiseSPMDExpander); REGISTER_SPMD(OnesLike, TF::OnesLikeOp, ElementwiseSPMDExpander); REGISTER_SPMD(Exp, TF::ExpOp, ElementwiseSPMDExpander); REGISTER_SPMD(Sqrt, TF::SqrtOp, ElementwiseSPMDExpander); REGISTER_SPMD(Rsqrt, TF::RsqrtOp, ElementwiseSPMDExpander); REGISTER_SPMD(Log, TF::LogOp, ElementwiseSPMDExpander); REGISTER_SPMD(StopGradient, TF::StopGradientOp, ElementwiseSPMDExpander); REGISTER_SPMD(Reciprocal, TF::ReciprocalOp, ElementwiseSPMDExpander); REGISTER_SPMD(Square, TF::SquareOp, ElementwiseSPMDExpander); REGISTER_SPMD(Erf, TF::ErfOp, ElementwiseSPMDExpander); REGISTER_SPMD(Tanh, TF::TanhOp, ElementwiseSPMDExpander); REGISTER_SPMD(TanhGrad, TF::TanhGradOp, ElementwiseSPMDExpander); REGISTER_SPMD(Relu, TF::ReluOp, ElementwiseSPMDExpander); REGISTER_SPMD(ReluGrad, TF::ReluGradOp, ElementwiseSPMDExpander); REGISTER_SPMD(Sigmoid, TF::SigmoidOp, ElementwiseSPMDExpander); REGISTER_SPMD(SigmoidGrad, TF::SigmoidGradOp, ElementwiseSPMDExpander); REGISTER_SPMD(IsFinite, TF::IsFiniteOp, ElementwiseSPMDExpander); // Elementwise REGISTER_SPMD(Add, TF::AddOp, ElementwiseSPMDExpander); REGISTER_SPMD(AddV2, TF::AddV2Op, ElementwiseSPMDExpander); REGISTER_SPMD(AddN, TF::AddNOp, ElementwiseSPMDExpander); REGISTER_SPMD(RealDiv, TF::RealDivOp, ElementwiseSPMDExpander); REGISTER_SPMD(Div, TF::DivOp, ElementwiseSPMDExpander); REGISTER_SPMD(DivNoNan, TF::DivNoNanOp, ElementwiseSPMDExpander); REGISTER_SPMD(Equal, TF::EqualOp, ElementwiseSPMDExpander); REGISTER_SPMD(FloorDiv, TF::FloorDivOp, ElementwiseSPMDExpander); REGISTER_SPMD(FloorMod, TF::FloorModOp, ElementwiseSPMDExpander); REGISTER_SPMD(NotEqual, TF::NotEqualOp, ElementwiseSPMDExpander); REGISTER_SPMD(Less, TF::LessOp, ElementwiseSPMDExpander); REGISTER_SPMD(LessEqual, TF::LessEqualOp, ElementwiseSPMDExpander); REGISTER_SPMD(LogicalAnd, TF::LogicalAndOp, ElementwiseSPMDExpander); REGISTER_SPMD(LogicalNot, TF::LogicalNotOp, ElementwiseSPMDExpander); REGISTER_SPMD(Maximum, TF::MaximumOp, ElementwiseSPMDExpander); REGISTER_SPMD(Minimum, TF::MinimumOp, ElementwiseSPMDExpander); REGISTER_SPMD(Mul, TF::MulOp, ElementwiseSPMDExpander); REGISTER_SPMD(Select, TF::SelectOp, ElementwiseSPMDExpander); REGISTER_SPMD(SelectV2, TF::SelectV2Op, ElementwiseSPMDExpander); REGISTER_SPMD(Sub, TF::SubOp, ElementwiseSPMDExpander); REGISTER_SPMD(SquaredDifference, TF::SquaredDifferenceOp, ElementwiseSPMDExpander); REGISTER_SPMD(Greater, TF::GreaterOp, ElementwiseSPMDExpander); REGISTER_SPMD(GreaterEqual, TF::GreaterEqualOp, ElementwiseSPMDExpander); REGISTER_SPMD(RsqrtGrad, TF::RsqrtGradOp, ElementwiseSPMDExpander); REGISTER_SPMD(SqrtGrad, TF::SqrtGradOp, ElementwiseSPMDExpander); REGISTER_SPMD(Pow, TF::PowOp, ElementwiseSPMDExpander); REGISTER_SPMD(BitwiseAnd, TF::BitwiseAndOp, ElementwiseSPMDExpander); REGISTER_SPMD(BitwiseOr, TF::BitwiseOrOp, ElementwiseSPMDExpander); REGISTER_SPMD(BitwiseXor, TF::BitwiseXorOp, ElementwiseSPMDExpander); REGISTER_SPMD(LeftShift, TF::LeftShiftOp, ElementwiseSPMDExpander); REGISTER_SPMD(RightShift, TF::RightShiftOp, ElementwiseSPMDExpander); REGISTER_SPMD(LogicalOr, TF::LogicalOrOp, ElementwiseSPMDExpander); REGISTER_SPMD(Cos, TF::CosOp, ElementwiseSPMDExpander); REGISTER_SPMD(Acos, TF::AcosOp, ElementwiseSPMDExpander); REGISTER_SPMD(Acosh, TF::AcoshOp, ElementwiseSPMDExpander); REGISTER_SPMD(Angle, TF::AngleOp, ElementwiseSPMDExpander); REGISTER_SPMD(Asin, TF::AsinOp, ElementwiseSPMDExpander); REGISTER_SPMD(Asinh, TF::AsinhOp, ElementwiseSPMDExpander); REGISTER_SPMD(Atan, TF::AtanOp, ElementwiseSPMDExpander); REGISTER_SPMD(Atan2, TF::Atan2Op, ElementwiseSPMDExpander); REGISTER_SPMD(Atanh, TF::AtanhOp, ElementwiseSPMDExpander); REGISTER_SPMD(BesselI0e, TF::BesselI0eOp, ElementwiseSPMDExpander); REGISTER_SPMD(BesselI1e, TF::BesselI1eOp, ElementwiseSPMDExpander); REGISTER_SPMD(Betainc, TF::BetaincOp, ElementwiseSPMDExpander); REGISTER_SPMD(Bitcast, TF::BitcastOp, ElementwiseSPMDExpander); REGISTER_SPMD(Ceil, TF::CeilOp, ElementwiseSPMDExpander); REGISTER_SPMD(CheckNumerics, TF::CheckNumericsOp, ElementwiseSPMDExpander); REGISTER_SPMD(ClipByValue, TF::ClipByValueOp, ElementwiseSPMDExpander); REGISTER_SPMD(Conj, TF::ConjOp, ElementwiseSPMDExpander); REGISTER_SPMD(Cosh, TF::CoshOp, ElementwiseSPMDExpander); REGISTER_SPMD(Complex, TF::ComplexOp, ElementwiseSPMDExpander); REGISTER_SPMD(ComplexAbs, TF::ComplexAbsOp, ElementwiseSPMDExpander); REGISTER_SPMD(Digamma, TF::DigammaOp, ElementwiseSPMDExpander); // TODO(b/193924452): Add the following Ops once unit tests are there. // REGISTER_SPMD(Elu, TF::EluOp, ElementwiseSPMDExpander); REGISTER_SPMD(EluGrad, TF::EluGradOp, ElementwiseSPMDExpander); REGISTER_SPMD(Erfc, TF::ErfcOp, ElementwiseSPMDExpander); REGISTER_SPMD(Erfinv, TF::ErfinvOp, ElementwiseSPMDExpander); REGISTER_SPMD(Expm1, TF::Expm1Op, ElementwiseSPMDExpander); REGISTER_SPMD(Floor, TF::FloorOp, ElementwiseSPMDExpander); // REGISTER_SPMD(HSVToRGB, TF::HSVToRGBOp, ElementwiseSPMDExpander); REGISTER_SPMD(Igamma, TF::IgammaOp, ElementwiseSPMDExpander); REGISTER_SPMD(Igammac, TF::IgammacOp, ElementwiseSPMDExpander); REGISTER_SPMD(IgammaGradA, TF::IgammaGradAOp, ElementwiseSPMDExpander); REGISTER_SPMD(Imag, TF::ImagOp, ElementwiseSPMDExpander); // REGISTER_SPMD(InplaceAdd, TF::InplaceAddOp, ElementwiseSPMDExpander); // REGISTER_SPMD(InplaceUpdate, TF::InplaceUpdateOp, ElementwiseSPMDExpander); REGISTER_SPMD(Inv, TF::InvOp, ElementwiseSPMDExpander); REGISTER_SPMD(Invert, TF::InvertOp, ElementwiseSPMDExpander); REGISTER_SPMD(IsInf, TF::IsInfOp, ElementwiseSPMDExpander); REGISTER_SPMD(IsNan, TF::IsNanOp, ElementwiseSPMDExpander); REGISTER_SPMD(LeakyRelu, TF::LeakyReluOp, ElementwiseSPMDExpander); REGISTER_SPMD(LeakyReluGrad, TF::LeakyReluGradOp, ElementwiseSPMDExpander); REGISTER_SPMD(Lgamma, TF::LgammaOp, ElementwiseSPMDExpander); REGISTER_SPMD(Log1p, TF::Log1pOp, ElementwiseSPMDExpander); REGISTER_SPMD(MulNoNan, TF::MulNoNanOp, ElementwiseSPMDExpander); REGISTER_SPMD(Ndtri, TF::NdtriOp, ElementwiseSPMDExpander); REGISTER_SPMD(NextAfter, TF::NextAfterOp, ElementwiseSPMDExpander); REGISTER_SPMD(Polygamma, TF::PolygammaOp, ElementwiseSPMDExpander); REGISTER_SPMD(PopulationCount, TF::PopulationCountOp, ElementwiseSPMDExpander); REGISTER_SPMD(PreventGradient, TF::PreventGradientOp, ElementwiseSPMDExpander); REGISTER_SPMD(Real, TF::RealOp, ElementwiseSPMDExpander); REGISTER_SPMD(ReciprocalGrad, TF::ReciprocalGradOp, ElementwiseSPMDExpander); REGISTER_SPMD(Relu6, TF::Relu6Op, ElementwiseSPMDExpander); REGISTER_SPMD(Relu6Grad, TF::Relu6GradOp, ElementwiseSPMDExpander); REGISTER_SPMD(Rint, TF::RintOp, ElementwiseSPMDExpander); REGISTER_SPMD(Round, TF::RoundOp, ElementwiseSPMDExpander); REGISTER_SPMD(Selu, TF::SeluOp, ElementwiseSPMDExpander); REGISTER_SPMD(SeluGrad, TF::SeluGradOp, ElementwiseSPMDExpander); REGISTER_SPMD(Sign, TF::SignOp, ElementwiseSPMDExpander); REGISTER_SPMD(Sin, TF::SinOp, ElementwiseSPMDExpander); REGISTER_SPMD(Sinh, TF::SinhOp, ElementwiseSPMDExpander); // REGISTER_SPMD(Snapshot, TF::SnapshotOp, ElementwiseSPMDExpander); REGISTER_SPMD(Softplus, TF::SoftplusOp, ElementwiseSPMDExpander); // REGISTER_SPMD(SoftplusGrad, TF::SoftplusGradOp, ElementwiseSPMDExpander); REGISTER_SPMD(Softsign, TF::SoftsignOp, ElementwiseSPMDExpander); // REGISTER_SPMD(SoftsignGrad, TF::SoftsignGradOp, ElementwiseSPMDExpander); REGISTER_SPMD(Tan, TF::TanOp, ElementwiseSPMDExpander); // REGISTER_SPMD(TridiagonalSolve, TF::TridiagonalSolveOp, // ElementwiseSPMDExpander); REGISTER_SPMD(TruncateDiv, TF::TruncateDivOp, ElementwiseSPMDExpander); REGISTER_SPMD(TruncateMod, TF::TruncateModOp, ElementwiseSPMDExpander); REGISTER_SPMD(Xdivy, TF::XdivyOp, ElementwiseSPMDExpander); REGISTER_SPMD(Xlog1py, TF::Xlog1pyOp, ElementwiseSPMDExpander); REGISTER_SPMD(Xlogy, TF::XlogyOp, ElementwiseSPMDExpander); REGISTER_SPMD(Zeta, TF::ZetaOp, ElementwiseSPMDExpander); // IdentityN // TODO(hongjunchoi): Make ElementwiseSPMDExpander support IdentityN. REGISTER_SPMD(IdentityN, TF::IdentityNOp, IdentityNSPMDExpander); // Range REGISTER_SPMD(Range, TF::RangeOp, RangeSPMDExpander); // Reductions REGISTER_SPMD(All, TF::AllOp, ReduceSPMDExpander); REGISTER_SPMD(Any, TF::AnyOp, ReduceSPMDExpander); REGISTER_SPMD(Mean, TF::MeanOp, ReduceSPMDExpander); REGISTER_SPMD(Max, TF::MaxOp, ReduceSPMDExpander); REGISTER_SPMD(Min, TF::MinOp, ReduceSPMDExpander); REGISTER_SPMD(Prod, TF::ProdOp, ReduceSPMDExpander); REGISTER_SPMD(Sum, TF::SumOp, ReduceSPMDExpander); REGISTER_SPMD(L2Loss, TF::L2LossOp, ReduceSPMDExpander); // Convolution REGISTER_SPMD(Conv2D, TF::Conv2DOp, ConvSPMDExpander); REGISTER_SPMD(Conv2DBackpropFilter, TF::Conv2DBackpropFilterOp, ConvSPMDExpander); REGISTER_SPMD(Conv2DBackpropFilterV2, TF::Conv2DBackpropFilterV2Op, ConvSPMDExpander); REGISTER_SPMD(Conv2DBackpropInput, TF::Conv2DBackpropInputOp, ConvSPMDExpander); REGISTER_SPMD(Conv2DBackpropInputV2, TF::Conv2DBackpropInputV2Op, ConvSPMDExpander); REGISTER_SPMD(Conv3D, TF::Conv3DOp, ConvSPMDExpander); REGISTER_SPMD(Conv3DBackpropFilter, TF::Conv3DBackpropFilterOp, ConvSPMDExpander); REGISTER_SPMD(Conv3DBackpropFilterV2, TF::Conv3DBackpropFilterV2Op, ConvSPMDExpander); REGISTER_SPMD(Conv3DBackpropInput, TF::Conv3DBackpropInputOp, ConvSPMDExpander); REGISTER_SPMD(Conv3DBackpropInputV2, TF::Conv3DBackpropInputV2Op, ConvSPMDExpander); REGISTER_SPMD(MaxPool, TF::MaxPoolOp, ConvSPMDExpander); REGISTER_SPMD(MaxPoolGrad, TF::MaxPoolGradOp, ConvSPMDExpander); // Metadata REGISTER_SPMD(Rank, TF::RankOp, ShapeSPMDExpander); REGISTER_SPMD(Shape, TF::ShapeOp, ShapeSPMDExpander); REGISTER_SPMD(ShapeN, TF::ShapeNOp, ShapeSPMDExpander); REGISTER_SPMD(BroadcastGradientArgs, TF::BroadcastGradientArgsOp, MetadataSPMDExpander); // Resource ops REGISTER_SPMD(AssignVariable, TF::AssignVariableOp, ResourceSPMDExpander); REGISTER_SPMD(AssignAddVariable, TF::AssignAddVariableOp, ResourceSPMDExpander); REGISTER_SPMD(AssignSubVariable, TF::AssignSubVariableOp, ResourceSPMDExpander); REGISTER_SPMD(SummaryWriter, TF::SummaryWriterOp, ResourceSPMDExpander); REGISTER_SPMD(ReadVariable, TF::ReadVariableOp, ResourceSPMDExpander); REGISTER_SPMD(VarHandle, TF::VarHandleOp, ResourceSPMDExpander); REGISTER_SPMD(VarIsInitialized, TF::VarIsInitializedOp, ResourceSPMDExpander); REGISTER_SPMD(DestroyResource, TF::DestroyResourceOp, ResourceSPMDExpander); // Einsum REGISTER_SPMD(Einsum, TF::EinsumOp, EinsumSPMDExpander); // Matrix multiplication REGISTER_SPMD(BatchMatMulV2, TF::BatchMatMulV2Op, MatMulSPMDExpander); REGISTER_SPMD(MatMul, TF::MatMulOp, MatMulSPMDExpander); // Stack/unstack (pack/unpack) REGISTER_SPMD(Pack, TF::PackOp, PackSPMDExpander); REGISTER_SPMD(Unpack, TF::UnpackOp, UnpackSPMDExpander); // Reshape REGISTER_SPMD(Reshape, TF::ReshapeOp, ReshapeSPMDExpander); REGISTER_SPMD(Transpose, TF::TransposeOp, TransposeSPMDExpander); REGISTER_SPMD(InvertPermutation, TF::InvertPermutationOp, ReplicatedOpSPMDExpander, /*relayout_when_sharded=*/true); // Pad REGISTER_SPMD(Pad, TF::PadOp, PadSPMDExpander); REGISTER_SPMD(PadV2, TF::PadV2Op, PadSPMDExpander); // Scatter/Gather REGISTER_SPMD(GatherV2, TF::GatherV2Op, GatherV2SPMDExpander); REGISTER_SPMD(GatherNd, TF::GatherNdOp, GatherNdSPMDExpander); REGISTER_SPMD(ResourceGather, TF::ResourceGatherOp, ResourceGatherSPMDExpander); REGISTER_SPMD(ScatterNd, TF::ScatterNdOp, ScatterNdOpSPMDExpander); REGISTER_SPMD(TensorScatterUpdate, TF::TensorScatterUpdateOp, TensorScatterOpSPMDExpander); REGISTER_SPMD(TensorScatterAdd, TF::TensorScatterAddOp, TensorScatterOpSPMDExpander); // ArgMax/ArgMin REGISTER_SPMD(ArgMax, TF::ArgMaxOp, ArgMaxSPMDExpander); // Slice REGISTER_SPMD(Slice, TF::SliceOp, SliceSPMDExpander); REGISTER_SPMD(StridedSlice, TF::StridedSliceOp, StridedSliceSPMDExpander); REGISTER_SPMD(TensorStridedSliceUpdate, TF::TensorStridedSliceUpdateOp, TensorStridedSliceUpdateSPMDExpander); REGISTER_SPMD(StridedSliceGrad, TF::StridedSliceGradOp, StridedSliceGradSPMDExpander); // Split REGISTER_SPMD(Split, TF::SplitOp, SplitSPMDExpander); REGISTER_SPMD(SplitV, TF::SplitVOp, SplitVSPMDExpander); // Squeeze REGISTER_SPMD(Squeeze, TF::SqueezeOp, SqueezeSPMDExpander); // Concat REGISTER_SPMD(Concat, TF::ConcatOp, ConcatSPMDExpander); REGISTER_SPMD(ConcatV2, TF::ConcatV2Op, ConcatSPMDExpander); // Softmax Loss ops REGISTER_SPMD(SoftmaxCrossEntropyWithLogits, TF::SoftmaxCrossEntropyWithLogitsOp, SoftmaxLossOpSPMDExpander); REGISTER_SPMD(SparseSoftmaxCrossEntropyWithLogits, TF::SparseSoftmaxCrossEntropyWithLogitsOp, SoftmaxLossOpSPMDExpander); // Softmax ops REGISTER_SPMD(Softmax, TF::SoftmaxOp, SoftmaxOpSPMDExpander); REGISTER_SPMD(LogSoftmax, TF::LogSoftmaxOp, SoftmaxOpSPMDExpander); // Random ops // LINT.IfChange REGISTER_SPMD(StatelessRandomUniform, TF::StatelessRandomUniformOp, RandomOpSPMDExpander); REGISTER_SPMD(StatelessRandomUniformFullInt, TF::StatelessRandomUniformFullIntOp, RandomOpSPMDExpander); REGISTER_SPMD(StatelessRandomNormal, TF::StatelessRandomNormalOp, RandomOpSPMDExpander); REGISTER_SPMD(StatelessTruncatedNormal, TF::StatelessTruncatedNormalOp, RandomOpSPMDExpander); // LINT.ThenChange(//tensorflow/dtensor/cc/small_constant_optimization.cc) // Random V2 ops REGISTER_SPMD(StatelessRandomGetKeyCounter, TF::StatelessRandomGetKeyCounterOp, ReplicatedOpSPMDExpander); REGISTER_SPMD(RngReadAndSkip, TF::RngReadAndSkipOp, ReplicatedOpSPMDExpander); REGISTER_SPMD(StatelessRandomNormalV2, TF::StatelessRandomNormalV2Op, RandomOpSPMDExpander); REGISTER_SPMD(StatelessRandomUniformV2, TF::StatelessRandomUniformV2Op, RandomOpSPMDExpander); REGISTER_SPMD(StatelessRandomUniformFullIntV2, TF::StatelessRandomUniformFullIntV2Op, RandomOpSPMDExpander); REGISTER_SPMD(StatelessRandomUniformIntV2, TF::StatelessRandomUniformIntV2Op, RandomOpSPMDExpander); REGISTER_SPMD(StatelessTruncatedNormalV2, TF::StatelessTruncatedNormalV2Op, RandomOpSPMDExpander); // Input agnotics ops REGISTER_SPMD(Fill, TF::FillOp, FillSPMDExpander); // Tile REGISTER_SPMD(Tile, TF::TileOp, TileSPMDExpander); // Expansion of ResourceApply ops are no-ops as they are always element-wise. // Also, ResourceApply ops do not have output values. As so, inferring layout // from operand and consumers are trivial(no-op). // Resource apply ops REGISTER_SPMD(ResourceApplyAdagradV2, TF::ResourceApplyAdagradV2Op, NoOpSPMDExpander); REGISTER_SPMD(ResourceApplyAdam, TF::ResourceApplyAdamOp, NoOpSPMDExpander); REGISTER_SPMD(ResourceApplyGradientDescent, TF::ResourceApplyGradientDescentOp, NoOpSPMDExpander); REGISTER_SPMD(ResourceApplyCenteredRMSProp, TF::ResourceApplyCenteredRMSPropOp, NoOpSPMDExpander); REGISTER_SPMD(ResourceApplyKerasMomentum, TF::ResourceApplyKerasMomentumOp, NoOpSPMDExpander); REGISTER_SPMD(ResourceApplyMomentum, TF::ResourceApplyMomentumOp, NoOpSPMDExpander); // AssertOp REGISTER_SPMD(Assert, TF::AssertOp, NoOpSPMDExpander); // Terminator ops REGISTER_SPMD(Return, tf_device::ReturnOp, TerminatorSPMDExpander); // Onehot REGISTER_SPMD(OneHot, TF::OneHotOp, OneHotSPMDExpander); // ExpandDimsOp REGISTER_SPMD(ExpandDims, TF::ExpandDimsOp, ExpandDimsExpander); // UnsortedSegmentSumOp REGISTER_SPMD(UnsortedSegmentSum, TF::UnsortedSegmentSumOp, UnsortedSegmentSumSPMDExpander); // BroadcastToOp REGISTER_SPMD(BroadcastTo, TF::BroadcastToOp, BroadcastToSPMDExpander); // Save/Restore ops. REGISTER_SPMD(SaveV2, TF::SaveV2Op, SaveRestoreSPMDExpander); REGISTER_SPMD(MergeV2Checkpoints, TF::MergeV2CheckpointsOp, SaveRestoreSPMDExpander); REGISTER_SPMD(RestoreV2, TF::RestoreV2Op, SaveRestoreSPMDExpander); REGISTER_SPMD(DTensorRestoreV2, TF::DTensorRestoreV2Op, SaveRestoreSPMDExpander); REGISTER_SPMD(DTensorShardedPrefix, TF::DTensorShardedPrefixOp, DTensorShardPrefixSPMDExpander); // DTensor Virtual ops REGISTER_SPMD( CopyToMesh, TF::CopyToMeshOp, UnsupportedOpSPMDExpander, "CopyToMesh should have been lowered to DTensorSend and DTensorRecv."); REGISTER_SPMD( CopyToMeshGrad, TF::CopyToMeshGradOp, UnsupportedOpSPMDExpander, "CopyToMesh should have been lowered to DTensorSend and DTensorRecv."); REGISTER_SPMD(Relayout, TF::RelayoutOp, RelayoutSPMDExpander); REGISTER_SPMD(RelayoutLike, TF::RelayoutLikeOp, RelayoutLikeSPMDExpander); REGISTER_SPMD(DTensorSend, TF::DTensorSend, DTensorSendSPMDExpander); REGISTER_SPMD(DTensorRecv, TF::DTensorRecv, DTensorRecvSPMDExpander); // TopKV2 REGISTER_SPMD(TopKV2, TF::TopKV2Op, TopKSPMDExpander); // InTopKV2 REGISTER_SPMD(InTopKV2, TF::InTopKV2Op, InTopKSPMDExpander); // Control flow REGISTER_SPMD(WhileRegion, TF::WhileRegionOp, WhileRegionSPMDExpander); REGISTER_SPMD(IfRegion, TF::IfRegionOp, IfRegionSPMDExpander); // BiasAdd REGISTER_SPMD(BiasAdd, TF::BiasAddOp, BiasAddExpander); REGISTER_SPMD(BiasAddGrad, TF::BiasAddGradOp, ReduceSPMDExpander); // QR REGISTER_SPMD(Qr, TF::QrOp, QRSPMDExpander); // Data Parallel REGISTER_SPMD(AvgPool, TF::AvgPoolOp, DataparallelSPMDExpander, llvm::DenseMap{{0, 3}}, llvm::DenseMap{{0, 3}}); REGISTER_SPMD(AvgPool3D, TF::AvgPool3DOp, DataparallelSPMDExpander, llvm::DenseMap{{0, 4}}, llvm::DenseMap{{0, 4}}); REGISTER_SPMD(MaxPool3D, TF::MaxPool3DOp, DataparallelSPMDExpander, llvm::DenseMap{{0, 4}}, llvm::DenseMap{{0, 4}}); REGISTER_SPMD(DepthwiseConv2dNative, TF::DepthwiseConv2dNativeOp, DataparallelSPMDExpander, llvm::DenseMap{{0, 3}}, llvm::DenseMap{{0, 3}}); REGISTER_SPMD(ResizeBilinear, TF::ResizeBilinearOp, DataparallelSPMDExpander, llvm::DenseMap{{0, 3}}, llvm::DenseMap{{0, 3}}); REGISTER_SPMD(ResizeNearestNeighbor, TF::ResizeNearestNeighborOp, DataparallelSPMDExpander, llvm::DenseMap{{0, 3}}, llvm::DenseMap{{0, 3}}); REGISTER_SPMD(AdjustContrastv2, TF::AdjustContrastv2Op, DataparallelSPMDExpander, llvm::DenseMap{{0, 3}}, llvm::DenseMap{{0, 3}}); REGISTER_SPMD(AdjustSaturation, TF::AdjustSaturationOp, DataparallelSPMDExpander, llvm::DenseMap{{0, 3}}, llvm::DenseMap{{0, 3}}); REGISTER_SPMD(FFT, TF::FFTOp, FFTSPMDExpander); REGISTER_SPMD(FFT2D, TF::FFT2DOp, FFTSPMDExpander); REGISTER_SPMD(FFT3D, TF::FFT3DOp, FFTSPMDExpander); REGISTER_SPMD(IFFT, TF::IFFTOp, FFTSPMDExpander); REGISTER_SPMD(IFFT2D, TF::IFFT2DOp, FFTSPMDExpander); REGISTER_SPMD(IFFT3D, TF::IFFT3DOp, FFTSPMDExpander); REGISTER_SPMD(IRFFT, TF::IRFFTOp, FFTSPMDExpander); REGISTER_SPMD(IRFFT2D, TF::IRFFT2DOp, FFTSPMDExpander); REGISTER_SPMD(IRFFT3D, TF::IRFFT3DOp, FFTSPMDExpander); REGISTER_SPMD(RFFT, TF::RFFTOp, FFTSPMDExpander); REGISTER_SPMD(RFFT2D, TF::RFFT2DOp, FFTSPMDExpander); REGISTER_SPMD(RFFT3D, TF::RFFT3DOp, FFTSPMDExpander); REGISTER_SPMD(Cholesky, TF::CholeskyOp, DataparallelSPMDExpander, llvm::DenseMap{{0, 2}}, llvm::DenseMap{{0, 2}}); // Data Parallel Grad Ops REGISTER_SPMD(MaxPool3DGrad, TF::MaxPool3DGradOp, DataparallelSPMDExpander, llvm::DenseMap{{0, 4}, {1, 4}, {2, 4}}, llvm::DenseMap{{0, 4}}); REGISTER_SPMD(MaxPool3DGradGrad, TF::MaxPool3DGradGradOp, DataparallelSPMDExpander, llvm::DenseMap{{0, 4}, {1, 4}, {2, 4}}, llvm::DenseMap{{0, 4}}); REGISTER_SPMD(MaxPoolGradGrad, TF::MaxPoolGradGradOp, DataparallelSPMDExpander, llvm::DenseMap{{0, 3}, {1, 3}, {2, 3}}, llvm::DenseMap{{0, 3}}); REGISTER_SPMD(ResizeBilinearGrad, TF::ResizeBilinearGradOp, DataparallelSPMDExpander, llvm::DenseMap{{0, 3}, {1, 3}}, llvm::DenseMap{{0, 3}}); REGISTER_SPMD(ResizeNearestNeighborGrad, TF::ResizeNearestNeighborGradOp, DataparallelSPMDExpander, llvm::DenseMap{{0, 3}}, llvm::DenseMap{{0, 3}}); // DiagPart REGISTER_SPMD(DiagPart, TF::DiagPartOp, ReplicatedOpSPMDExpander, /*relayout_when_sharded=*/true); // Cumsum REGISTER_SPMD(Cumsum, TF::CumsumOp, CumsumSPMDExpander); // SparseToDenseOp REGISTER_SPMD(SparseToDense, TF::SparseToDenseOp, SparseToDenseSPMDExpander); // StringFormat REGISTER_SPMD(StringFormat, TF::StringFormatOp, ReplicatedOpSPMDExpander, /*relayout_when_sharded=*/true); REGISTER_SPMD(StringToHashBucketFast, TF::StringToHashBucketFastOp, ElementwiseSPMDExpander); // TensorList ops REGISTER_SPMD(TensorListReserve, TF::TensorListReserveOp, TensorListReserveSPMDExpander); REGISTER_SPMD(TensorListGetItem, TF::TensorListGetItemOp, TensorListGetItemSPMDExpander); REGISTER_SPMD(TensorListSetItem, TF::TensorListSetItemOp, TensorListSetItemSPMDExpander); // IO ops REGISTER_SPMD(WriteSummary, TF::WriteSummaryOp, IOOpSPMDExpander); REGISTER_SPMD(FlushSummaryWriter, TF::FlushSummaryWriterOp, IOOpSPMDExpander); REGISTER_SPMD(DisableCopyOnRead, TF::DisableCopyOnReadOp, DisableCopyOnReadSPMDExpander); REGISTER_SPMD(ShardedFilename, TF::ShardedFilenameOp, ReplicatedOpSPMDExpander); // tf.data Optional ops REGISTER_SPMD(OptionalHasValue, TF::OptionalHasValueOp, OptionalHasValueSPMDExpander); REGISTER_SPMD(OptionalGetValue, TF::OptionalGetValueOp, OptionalGetValueSPMDExpander); // tf.data Iterator ops REGISTER_SPMD(IteratorGetNext, TF::IteratorGetNextOp, IteratorGetNextSPMDExpander); REGISTER_SPMD(IteratorGetNextAsOptional, TF::IteratorGetNextAsOptionalOp, IteratorGetNextAsOptionalSPMDExpander); // Unsupported ops. REGISTER_SPMD(RandomNormal, TF::RandomUniformOp, UnsupportedOpSPMDExpander, /*error_message=*/ "Stateful random operations are not supported in DTensor. Please " "use stateless random operations instead."); REGISTER_SPMD(RandomNormalInt, TF::RandomUniformIntOp, UnsupportedOpSPMDExpander, /*error_message=*/ "Stateful random operations are not supported in DTensor. Please " "use stateless random operations instead."); // Where REGISTER_SPMD(Where, TF::WhereOp, WhereOpSPMDExpander); // Unique REGISTER_SPMD(Unique, TF::UniqueOp, ReplicatedOpSPMDExpander, /*relayout_when_sharded=*/true); // Image Ops REGISTER_SPMD(EncodePng, TF::EncodePngOp, ReduceSPMDExpander); } // namespace dtensor } // namespace tensorflow