pytorch/torchgen/api
Mengwei Liu d0d6b1f222 [torchgen] Generate out variant for functional operator (#81437)
Summary:
Previously we don't generate out variant (both schema and kernel) for an operator with functional variant only. This adds support for that and adds test.

## Changes on `native_function_generation.py`

We are generating out variant for all functional variants if possible. This PR introduces a lot of newly generated out variants and `native_functions.yaml` needs to incorporate the changes by adding `autogen` keywords.

The logic for determining what operators we should generate an out variant for is the following:

1. No existing out variant for this `NativeFunction`
2. Contains an existing in place, mutable or functional variant
3. Contains at least 1 tensor like return(s)

For operators matching the first two conditions but failing the third, I listed them in `FUNCTIONAL_OPS_THAT_CANNOT_GET_AN_OUT_VARIANT`.

## Special handling

The following operators satisfy all 3 criteria above but we chose to not autogen them, with some reasons.
* `mkldnn_adaptive_avg_pool2d`, the generated out variant `mkldnn_adaptive_avg_pool2d.out` is colliding with the `mkldnn_adaptive_avg_pool2d_out` kernel in `adaptive_avg_pool2d.out` operator. I manually created `mkldnn_adaptive_avg_pool2d.out` and renamed `mkldnn_adaptive_avg_pool2d_out` to `mkldnn_adaptive_avg_pool2d_out_stub`.
* `min`, `max` and `mean`. There already exist `min.out`, `max.out` and `mean.out` but they are having different semantics with the functional ones. I manually created `min.unary_out`, `max.unary_out` and `mean.dtype_out` to disambiguate.

## Autograd Changes

We introduced a logic to not match derivatives info in `derivatives.yaml` to out variant, since we are generating `NOT_IMPLEMENTED` kernels for those out variants anyway. The issue we are seeing with the original logic is that it doesn't handle `TensorOption` arguments really well. For example we have these two operators:

* `_to_copy(Tensor self, *, ScalarType? dtype=None, Layout? layout=None, Device? device=None, bool? pin_memory=None, bool non_blocking=False, MemoryFormat? memory_format=None) -> Tensor`
* `_to_copy.out(Tensor self, *, bool non_blocking=False, MemoryFormat? memory_format=None, Tensor(a!) out) -> Tensor(a!)`

If we uses `_to_copy` derivative info, there will be compilation error since `dtype` is missing from `_to_copy.out` signature.
Test Plan: Rely on unit test

Differential Revision: D37832342

Pull Request resolved: https://github.com/pytorch/pytorch/pull/81437
Approved by: https://github.com/iseeyuan, https://github.com/bdhirsh
2022-08-13 05:44:53 +00:00
..
__init__.py
autograd.py [torchgen] Generate out variant for functional operator (#81437) 2022-08-13 05:44:53 +00:00
cpp.py Remove unused line (#82019) 2022-07-24 16:30:37 +00:00
dispatcher.py Apply ufmt linter to all py files under torchgen (#81570) 2022-07-16 03:52:25 +00:00
functionalization.py Apply ufmt linter to all py files under torchgen (#81570) 2022-07-16 03:52:25 +00:00
lazy.py Apply ufmt linter to all py files under torchgen (#81570) 2022-07-16 03:52:25 +00:00
meta.py
native.py Apply ufmt linter to all py files under torchgen (#81570) 2022-07-16 03:52:25 +00:00
python.py Make python TensorOption signatures consistent with JIT schemas (#82241) 2022-08-07 00:10:27 +00:00
structured.py Apply ufmt linter to all py files under torchgen (#81570) 2022-07-16 03:52:25 +00:00
translate.py Apply ufmt linter to all py files under torchgen (#81570) 2022-07-16 03:52:25 +00:00
types.py Apply ufmt linter to all py files under torchgen (#81570) 2022-07-16 03:52:25 +00:00
ufunc.py Apply ufmt linter to all py files under torchgen (#81570) 2022-07-16 03:52:25 +00:00
unboxing.py Apply ufmt linter to all py files under torchgen (#81570) 2022-07-16 03:52:25 +00:00