Skip to content

[Executorch][to_backend] Introduce preprocess_multimethod #9823

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 22 commits into from
Apr 16, 2025

Conversation

mcr229
Copy link
Contributor

@mcr229 mcr229 commented Apr 1, 2025

summary

We introduce a new preprocess_multimethod. This takes the place of preprocess all in the following discussion: #8230

This is a class method so that we can allow the default implementation to leverage the static preprocess method. The default implementation just applies preprocess on all the exported programs given.

Testing

Testing done in follow up PR
#9824

mcr229 added 2 commits April 1, 2025 16:31
[ghstack-poisoned]
[ghstack-poisoned]
Copy link

pytorch-bot bot commented Apr 1, 2025

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/9823

Note: Links to docs will display an error until the docs builds have been completed.

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-bot facebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Apr 1, 2025
mcr229 added 4 commits April 1, 2025 16:56
[ghstack-poisoned]
[ghstack-poisoned]
[ghstack-poisoned]
[ghstack-poisoned]
@mcr229 mcr229 added ciflow/trunk release notes: api Changes to public facing apis (any interfaces, pybinded runtime methods, etc.) and removed ciflow/trunk labels Apr 2, 2025
@mcr229 mcr229 requested review from digantdesai and cccclai April 3, 2025 18:02
mcr229 added 2 commits April 3, 2025 16:34
[ghstack-poisoned]
[ghstack-poisoned]
Base automatically changed from gh/mcr229/20/head to main April 4, 2025 21:07
[ghstack-poisoned]
def preprocess_multimethod(
cls,
edge_programs: Dict[str, List[ExportedProgram]],
compile_specs: Dict[str, List[List[CompileSpec]]],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the finest granularity which I believe cover all the use cases. For majority of the use case, we probably can support List[CompileSpec], which will be applied to all edge programs for all methods.

# Users should return a compiled blob - a binary that can run the desired
# program in the backend.
pass

@classmethod
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I assume it will be the default method if the backend didn't implement their own preprocess multimethod, is it correct? If so, let's add some tests.

Copy link
Contributor

@cccclai cccclai left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me. Let's add the unit test. We can have two backends, one with default preprocess_multimethod and one with custom preprocess_multimethod, then calling MyBackend.preprocess_multimethod() will invoke preprocess_multimethod

@mcr229
Copy link
Contributor Author

mcr229 commented Apr 7, 2025

@cccclai yea let me add a test for the default preprocess_multimethod case

mcr229 added 2 commits April 7, 2025 17:04
[ghstack-poisoned]
[ghstack-poisoned]
@mcr229 mcr229 changed the base branch from main to gh/mcr229/23/head April 8, 2025 00:04
mcr229 added 6 commits April 7, 2025 18:08
[ghstack-poisoned]
[ghstack-poisoned]
[ghstack-poisoned]
[ghstack-poisoned]
[ghstack-poisoned]
[ghstack-poisoned]
mcr229 and others added 5 commits April 14, 2025 17:28
[ghstack-poisoned]
[ghstack-poisoned]
[ghstack-poisoned]
[ghstack-poisoned]
…_multimethod (#9824)

### Summary

We add a new to_backend api which for multi method models. Specifically,
we pass in a dictionary mapping MethodName to ExportedProgram, as well
as a dictionary mapping MethodName to Partitioner. We then return a
dictionary mapping MethodName to the partitioned and lowered exported
program.

In addition, we also provide a new preprocess API for backends to
implement. This API is preprocess_multimethod. The signature of the new
method is as follows:
```
    def preprocess_multimethod(
        cls,
        edge_programs: Dict[str, List[ExportedProgram]],
        compile_specs: Dict[str, List[List[CompileSpec]]],
    ) -> Dict[str, list[PreprocessResult]]:
        """
        Runs preprocess on all partitioned Edge Programs across multiple methods. This allows
        backends to share information across partitioned graphs. Backend can serialize shared
        data by putting the shared data into the data_store_output of the preprocess results.
        This will record the shared data used by that specific partition.

        Default implementation is running the existing preprocess implementation on all

        Args:
            edge_programs: Dictionary mapping the method name to a list of all the partitioned
                           edge_programs from that method to be lowered.
            compile_specs: Dictionary mapping the method name to a list of compile_specs. The
                           list of compile specs maps directly to the list of edge_programs for the
                           same given method name i.e. edge_program[method_name][i] --> compile_specs[method_name][i]

        Returns:
            Dictionary mapping the method name to a list of PreprocessResults. The list of
            PreprocessResults maps directly to the list of edge_programs for the same given
            method name. i.e. edge_program[method_name][i] --> result[method_name][i]
        """
```

This new API enableds backends to preprocess all partitions/methods at
once. This way, while processing blobs, they can identify shared
components between preprocessed blobs. Shared components can be
serialized within the NamedDataStore.

The key change in backend infra, is that when partitioning, we now have
to identify all the partitioned graphs to be lowered at once, and pass
them to preprocess_multimethod at once. Previously, as we found
lowerable partitions, we preprocessed and embedded them into the graph.

### Testing
python -m unittest exir.backend.test.test_to_backend_multi_method
Base automatically changed from gh/mcr229/23/head to main April 16, 2025 16:11
@mcr229 mcr229 merged commit 2e81e8c into main Apr 16, 2025
78 checks passed
@mcr229 mcr229 deleted the gh/mcr229/21/head branch April 16, 2025 16:12
keyprocedure pushed a commit to keyprocedure/executorch that referenced this pull request Apr 21, 2025
### summary

We introduce a new preprocess_multimethod. This takes the place of
preprocess all in the following discussion:
pytorch#8230

This is a class method so that we can allow the default implementation
to leverage the static preprocess method. The default implementation
just applies preprocess on all the exported programs given.

### Testing
Testing done in follow up PR 
pytorch#9824
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. release notes: api Changes to public facing apis (any interfaces, pybinded runtime methods, etc.)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants