ns for fx: decouple subgraph names from node names (#52771)
Summary:
Pull Request resolved: https://github.com/pytorch/pytorch/pull/52771
Before this PR, subgraph names were derived from node names
in model B. For example, if we had
```
A: linear0 -> relu0 -> ...
B: linear_relu0 -> ...
```
Then the subgraph name would be `linear_relu0`, and the outputs before this
PR would look like
```
{
'linear_relu0': {
'model_a': ...,
'model_b': ...,
},
}
```
This PR decouples subgraph naming from node names.
The outputs after this PR look like:
```
{
# guaranteed to match the right subgraphs across different models
# without needing more than one model during the prepare passes
'base_op_torch.nn.functional.linear_0': {
'model_a': ...,
'model_b': ...,
},
}
```
There are future requirements for which using node_name as subgraph name does not work well:
a. the need to support N models, without having all of them in memory at the same time
b. the need to support fusions and match subgraphs with related but non-equal types
This PR changes the naming of subgraphs to be based on two things:
1. the name of the underlying set of related ops (i.e. `torch.nn.functional.linear`)
2. the order in which this subgraph was named (i.e. `foo_0`, `foo_1`, ...)
Basically, we can't use a node name because of (a), since there must be
a reference model which node name other models must use, but that
reference model is not guaranteed to be available. Note: we could add
some state and require the reference model to go through the APIs first,
saving the reference node names, but I'm deliberately not doing that
to minimize the state used throughout.
To support (b), we need a way to determine a name of a subgraph which is
the same for all related subgraphs (i.e. linear-relu vs quantized_linear
vs quantized_linear_relu). In this PR, this is done by using the base
aten op's name. We use a string name so it looks nice in the output
(I tried `str(underlying_type)`, and it is not easy for humans to read).
Note: after this PR, it's hard to parse the results to see which layer
is related to which node in the graph. This will be fixed in a future PR
where we will store the node name on the logger, and expose it in the
output.
Test Plan:
```
python test/test_quantization.py TestFXGraphMatcher
python test/test_quantization.py TestFXGraphMatcherModels
python test/test_quantization.py TestFXNumericSuiteCoreAPIs
python test/test_quantization.py TestFXNumericSuiteCoreAPIsModels
```
Imported from OSS
Reviewed By: hx89
Differential Revision: D26652641
fbshipit-source-id: ee8dacc2d6e875357c1574cbf426923f9466ea10