Why .contiguous() After transpose()
# RuntimeError: view size is not compatible with input tensor's...
x.transpose(1, 2).view(B, T, d_model)
# Fix: contiguous copy, then view
x.transpose(1, 2).contiguous().view(B, T, d_model)
Why it matters: transpose returns a view with permuted strides. view requires contiguous memory. .contiguous() is the copy. You hit this exactly once, then never forget.