-
Notifications
You must be signed in to change notification settings - Fork 537
[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
Conversation
🔗 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. |
def preprocess_multimethod( | ||
cls, | ||
edge_programs: Dict[str, List[ExportedProgram]], | ||
compile_specs: Dict[str, List[List[CompileSpec]]], |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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.
There was a problem hiding this 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
@cccclai yea let me add a test for the default preprocess_multimethod case |
…_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
### 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
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