DeepSpeed
71199367 - Reshape instead of view in TiledFusedLogitsLoss (#8362)

Commit
7 days ago
Reshape instead of view in TiledFusedLogitsLoss (#8362) 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`: ```python # 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 ``` --------- Signed-off-by: alanhuangyoo <alanhuangyoo@gmail.com>
Author
Parents
Loading