Fix output ordering in lowered modules to prevent spec violation error#17750
Fix output ordering in lowered modules to prevent spec violation error#17750
Conversation
🔗 Helpful Links🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/17750
Note: Links to docs will display an error until the docs builds have been completed. ❌ 3 New Failures, 1 Pending, 2 Unrelated FailuresAs of commit 1c69817 with merge base e0e10cc ( NEW FAILURES - The following jobs have failed:
BROKEN TRUNK - The following jobs failed but were present on the merge base:👉 Rebase onto the `viable/strict` branch to avoid these failures
This comment was automatically generated by Dr. CI and updates every 15 minutes. |
This PR needs a
|
|
@JacobSzwejbka any concerns here? |
Does this reordering happen after partitioning but before preprocess? My thought is basically the preprocess blob must respect the order it saw from the partitioner so we cant change it after the blob is created. |
6e2fd3b to
1c69817
Compare
pytorch#17750) When the ExecuTorch partitioner creates submodules from a partitioned graph, _get_new_signature builds output specs by iterating the submodule's output tuple in graph order. This can produce output specs where BUFFER_MUTATION and USER_OUTPUT kinds are interleaved. The ExportedProgram verifier expects all mutation outputs to precede user outputs ([buffer_mutations..., user_outputs...]), and a misordered tuple causes a SpecViolationError. This PR adds arrange_graph_outputs, which reorders the submodule's output tuple and output specs so that all mutation outputs (BUFFER_MUTATION, USER_INPUT_MUTATION) come before USER_OUTPUT outputs. It also remaps getitem indices on the parent graph's call_module node so the parent continues to extract the correct values after reordering. Changes exir/lowered_backend_module.py Added arrange_graph_outputs() function that: * Reorders the submodule graph's output node to put mutation outputs first * Reorders output_specs in-place to match * Remaps getitem indices in the parent graph Test plan: Existing CI + new unit test
When the ExecuTorch partitioner creates submodules from a partitioned graph, _get_new_signature builds output specs by iterating the submodule's output tuple in graph order. This can produce output specs where BUFFER_MUTATION and USER_OUTPUT kinds are interleaved. The ExportedProgram verifier expects all mutation outputs to precede user outputs ([buffer_mutations..., user_outputs...]), and a misordered tuple causes a SpecViolationError.
This PR adds arrange_graph_outputs, which reorders the submodule's output tuple and output specs so that all mutation outputs (BUFFER_MUTATION, USER_INPUT_MUTATION) come before USER_OUTPUT outputs. It also remaps getitem indices on the parent graph's call_module node so the parent continues to extract the correct values after reordering.
Changes
exir/lowered_backend_module.py
Added arrange_graph_outputs() function that:
Test plan:
Existing CI + new unit test