[Fix][Relax][Frontend][Torch] Validate flatten dims in from_fx - #20245
Open
hiyufan wants to merge 1 commit into
Open
[Fix][Relax][Frontend][Torch] Validate flatten dims in from_fx#20245hiyufan wants to merge 1 commit into
from_fx#20245hiyufan wants to merge 1 commit into
Conversation
Fixes: apache#20227 `_flatten_impl` normalized negative flatten dims but never checked their range or their ordering, so `from_fx` crashed with an internal `TypeError: reduce() of empty iterable with no initial value` on a traced model whose `start_dim` came after its `end_dim`. Out-of-range dims leaked an `IndexError`, and an out-of-range negative `start_dim` silently computed a wrong shape that only failed later inside `relax.op.reshape`. Normalize both dims against `max(rank, 1)`, validate each against `[-r, r-1]`, and reject `start_dim > end_dim` with a message matching torch's own. A 0-d input is now handled explicitly, matching `torch.flatten` on a scalar. Co-authored-by: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes: #20227
Summary
tvm.relax.frontend.torch.from_fxcrashed with an internalTypeError: reduce() of empty iterable with no initial valuewhen a traced modelcontained a
flattenwhosestart_dimcomes after itsend_dim.torch rejects such a
flattenwith a clearRuntimeError, but only when the model isexecuted.
fx.symbolic_tracedoes not execute the model, so the invalid node reachesthe frontend as a perfectly traceable graph and has to be rejected there. This PR
validates the dims in
_flatten_impl, mirroring whatfrom_onnxnow does forFlatten(#20145).Only the
from_fx/TorchFXImporterpath is affected.from_exported_programrunsrun_decompositions()by default, which lowersaten.flatten.using_intstoaten.view, so_flatten_implis never reached there.Root cause
_flatten_implinpython/tvm/relax/frontend/torch/base_fx_graph_translator.pynormalized negative dims but never checked their range or their ordering:
For
start_dim=2, end_dim=1therangeis empty, sofunctools.reduceis called overan empty iterable with no initial value. Out-of-range dims (
flatten(x, 0, 3)on arank-3 input) leaked an
IndexErrorout ofshape[i]instead.Both entry points that reach this helper are affected:
torch.flatten(dispatched via_flatten) andtorch.nn.Flatten(via_flatten_module).Fix
Normalize both dims against
max(rank, 1), validate each against[-r, r-1], andreject
start_dim > end_dimwith torch's own wording:A 0-d input is handled explicitly: torch normalizes flatten dims against a rank of at
least one, so
torch.flatten(scalar)is valid and returns a 1-d tensor holding thesingle element. The old code hit the same empty-
reducecrash for that input.Validation
Built from source (CPU-only,
USE_LLVM=OFF) on Linux, torch 2.13.0+cpu, Python 3.14.Behavior on the reported cases, measured before and after the change:
(2,3,4)(2,1)TypeError: reduce() of empty iterable with no initial valueValueError: flatten() has invalid args: start_dim cannot come after end_dim(2,3,4)(0,3)IndexError: ShapeExpr index out of rangeValueError: flatten end_dim 3 is out of range [-3, 2] for an input of rank 3(2,3,4)(-4,2)ValueError: Reshape expects the new shape to be convertible from the old shapeValueError: flatten start_dim -4 is out of range [-3, 2] for an input of rank 3()(0-d)(0,-1)TypeError: reduce() of empty iterable with no initial value(1,)The
(-4,2)row is worth calling out: an out-of-range negativestart_dimdid not fail in_flatten_implat all. It normalized to-1, sorange(-1, 3)silently folded the lastdimension into the product and emitted a
reshapeto(96,)for a 24-element tensor, whichonly failed later inside
relax.op.reshape. That is a mis-computation, not just a crash.Valid dims are unaffected —
(1,3,10,10)with(2,-1), and(2,3,4)with(1,2),(0,-1),(-3,-1)and(2,2), all convert to the same shapes as before.Regression run of the whole
from_fxsuite, base commit vs. this branch:HEAD~1)The failure sets are identical line for line — the 16 failures (
test_dtypes[*],test_round)are pre-existing on the base commit in this environment and unrelated to this change.
Tests added to
tests/python/relax/test_frontend_from_fx.py:test_flatten_invalid_dims—start_dim > end_dimthrough bothtorch.flattenandtorch.nn.Flatten, plus an out-of-rangeend_dimtest_flatten_scalar_input— 0-d input flattens to shape(1,)Files changed
python/tvm/relax/frontend/torch/base_fx_graph_translator.py—_flatten_impl:normalize and validate dims, handle a 0-d input.
tests/python/relax/test_frontend_from_fx.py— regression tests.Note for reviewers
The 0-d handling (
dim_post_expr = max(rank, 1)plus therank == 0branch) isseparable from the reported bug. It fixes the same empty-
reducecrash for scalarinputs and keeps the new range check from rejecting a valid
torch.flatten(scalar),but if you would rather keep this PR to exactly the reported case I am happy to drop
that hunk and its test.
This change was developed with AI assistance. The build, the before/after comparison
and the test runs reported above were all executed locally against this branch as
submitted.