# tf.experimental.dtensor.relayout_like

<br />

|---|
| [![](https://www.tensorflow.org/images/GitHub-Mark-32px.png) View source on GitHub](https://github.com/tensorflow/tensorflow/blob/v2.14.0/tensorflow/dtensor/python/api.py#L452-L502) |

Changes the layout of `tensor` to the same as `layout_tensor`.

    tf.experimental.dtensor.relayout_like(
        tensor: https://www.tensorflow.org/versions/r2.14/api_docs/python/tf/Tensor,
        layout_tensor: https://www.tensorflow.org/versions/r2.14/api_docs/python/tf/Tensor,
        name: Optional[str] = None
    ) -> https://www.tensorflow.org/versions/r2.14/api_docs/python/tf/Tensor

`relayout_like` is often used inside a [`tf.function`](https://www.tensorflow.org/versions/r2.14/api_docs/python/tf/function), to ensure a tensor is
placed to the same mesh and with the same layout as another tensor.

The backward gradient of a `relayout` is a `relayout_like` operation, to
ensure the backward tensor has the same layout as the forward input tensor:

    @ops.RegisterGradient("Relayout")
    def _relayout_gradient(op, grad):
      return relayout_like(grad, layout_input=op.inputs[0])

Here is another illustrative example:

    @tf.function
    def func(x):
      z = tf.ones(x.shape)
      z = dtensor.relayout_like(z, x)
      return x + z

    with dtensor.default_mesh(cpu_mesh):
      x = tf.ones((4, 4))

    with dtensor.default_mesh(gpu_mesh):
      y = func(x)

    # y would be on the cpu mesh, following the mesh of x.

<br />

<br />

<br />

| ## Args ||
|---|---|
| `tensor` | A DTensor to specify a new layout for. |
| `layout_tensor` | A Tensor object whose layout will be used for the layout of result. The shape and type of layout_tensor are irrelevant. |
| `name` | name of the Op. |

<br />

<br />

<br />

<br />

| ## Returns ||
|---|---|
| A DTensor output from the RelayoutLike op. ||

<br />