Skip to content

Reshape instead of view in TiledFusedLogitsLoss - #8362

Open
alanhuangyoo wants to merge 1 commit into
deepspeedai:masterfrom
alanhuangyoo:fix/tiled-logits-loss-reshape
Open

Reshape instead of view in TiledFusedLogitsLoss#8362
alanhuangyoo wants to merge 1 commit into
deepspeedai:masterfrom
alanhuangyoo:fix/tiled-logits-loss-reshape

Conversation

@alanhuangyoo

Copy link
Copy Markdown
Contributor

Follow-up to #8348, in the same file.

That PR moved TiledMLP.backward off view because the flatten of batch and sequence into one axis needs a copy when a caller hands in a non-contiguous activation. TiledFusedLogitsLoss.forward does the same flatten, under the same comment, and is still on view:

# flatten bs+seqlen to avoid having stride issues when narrowing into seqlen w/ bs>1
x = x.view(-1, *x.shape[2:])
y = y.view(-1, *y.shape[2:])
if mask is not None:
    mask = mask.view(-1)

A transposed activation — one of the two layouts #8348's test covers — fails there:

RuntimeError: view size is not compatible with input tensor's size and stride
(at least one dimension spans across two contiguous subspaces)

What is and is not reachable

I ran the four input shapes through TiledFusedLogitsLoss.apply on master:

input contiguous master
x contiguous yes ok
x transposed no RuntimeError: view size is not compatible …
x channel slice no ok
y / mask strided no ok

Only the transposed case is reachable today. A hidden-dimension slice keeps the wider row stride, and that still admits merging batch into sequence, so it survives — same for the strided y and mask I tried. y and mask go through the same flatten and are changed with it rather than left on a spelling that happens to hold.

The unflatten at the end of forward stays a view: x_grad comes from zeros_like() of the already-flattened x, so it is contiguous by construction. Same reasoning for the x_grad.view(x_shape_orig) that #8348 left alone in TiledMLP.backward.

TiledLoss has no such flatten, so nothing to do there.

Test

TestTiledFusedLogitsLossInputLayout mirrors TestTiledMLPInputLayout and checks the loss against the same input made contiguous, so it pins the value and not just the absence of a throw.

On master:

FAILED tests/unit/ulysses_alst/test_tiled_compute.py::TestTiledFusedLogitsLossInputLayout::test_transposed_input_matches_a_contiguous_copy[2]
FAILED ...[4]
RuntimeError: view size is not compatible with input tensor's size and stride
2 failed

With this PR:

tests/unit/ulysses_alst/test_tiled_compute.py   14 passed
yapf --diff / flake8                           clean

deepspeedai#8348 fixed this in TiledMLP.backward: the flatten of batch and sequence
into one axis needs a copy for a caller that hands in a non-contiguous
activation, so it cannot be a view.

TiledFusedLogitsLoss.forward does the same flatten, under the same
comment, and is still on view:

    # flatten bs+seqlen to avoid having stride issues when narrowing into seqlen w/ bs>1
    x = x.view(-1, *x.shape[2:])
    y = y.view(-1, *y.shape[2:])

A transposed activation -- the layout deepspeedai#8348's test covers -- fails there:

    RuntimeError: view size is not compatible with input tensor's size and
    stride (at least one dimension spans across two contiguous subspaces)

A channel slice happens to survive, because its row stride still admits
the flatten, so only the transposed case is reachable today. y and mask
go through the same flatten and are changed with it.

The unflatten at the end stays a view: x_grad comes from zeros_like() of
the already-flattened x, so it is contiguous by construction.

Signed-off-by: alanhuangyoo <alanhuangyoo@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant