upsample_*.vec ops are now CompositeImplicit (#85638)
It was previously CompositeExplicit but it was not really necessary.
See discussion in https://github.com/pytorch/pytorch/issues/85405
Pull Request resolved: https://github.com/pytorch/pytorch/pull/85638
Approved by: https://github.com/ezyang, https://github.com/lezcano, https://github.com/malfet, https://github.com/jansel
diff --git a/.github/ci_commit_pins/xla.txt b/.github/ci_commit_pins/xla.txt
index c0348df..7ec9661 100644
--- a/.github/ci_commit_pins/xla.txt
+++ b/.github/ci_commit_pins/xla.txt
@@ -1 +1 @@
-3a04b23e26e76b1a7351f382978de3d8a14307a1
+7889d2d3be16675943d84e4a4133ed7c245a623f
diff --git a/aten/src/ATen/functorch/BatchRulesModules.cpp b/aten/src/ATen/functorch/BatchRulesModules.cpp
index 3968e24..2419fde 100644
--- a/aten/src/ATen/functorch/BatchRulesModules.cpp
+++ b/aten/src/ATen/functorch/BatchRulesModules.cpp
@@ -295,7 +295,7 @@
struct UpsampleBackwardBatchRuleHelper<F, Func, typelist<A, B, C, T...>> {
static std::tuple<Tensor,optional<int64_t>> apply(
const Tensor& grad_output, optional<int64_t> grad_output_bdim,
- OptionalSymIntArrayRef output_size, c10::SymIntArrayRef input_size,
+ c10::SymIntArrayRef output_size, c10::SymIntArrayRef input_size,
T... extra_args) {
auto grad_output_ = reshape_dim_into(*grad_output_bdim, 0, grad_output);
TORCH_INTERNAL_ASSERT(input_size.size() > 0);
@@ -375,11 +375,11 @@
#define CUDNN_GRID_SAMPLE_BW_BATCH_RULE(fn)\
CudnnGridSampleBackwardBatchRuleHelper<decltype(&ATEN_FN(fn)), &ATEN_FN(fn)>::apply
-#define UPSAMPLE_BACKWARD(op, overload) VMAP_SUPPORT2(op, overload, SINGLE_ARG(\
+#define UPSAMPLE_BACKWARD(op) VMAP_SUPPORT(op, SINGLE_ARG(\
UpsampleBackwardBatchRuleHelper<\
- decltype(&ATEN_FN2(op, overload)),\
- &ATEN_FN2(op, overload),\
- c10::guts::function_traits<decltype(ATEN_FN2(op, overload))>::parameter_types>::apply))
+ decltype(&ATEN_FN(op)),\
+ &ATEN_FN(op),\
+ c10::guts::function_traits<decltype(ATEN_FN(op))>::parameter_types>::apply))
#define UPSAMPLE_BATCH(op) \
EXISTING_BDIM2(op, vec); \
@@ -430,13 +430,13 @@
UPSAMPLE_BATCH(upsample_nearest3d);
UPSAMPLE_BATCH(upsample_trilinear3d);
- UPSAMPLE_BACKWARD(upsample_bicubic2d_backward, vec);
- UPSAMPLE_BACKWARD(upsample_bilinear2d_backward, vec);
- UPSAMPLE_BACKWARD(upsample_linear1d_backward, vec);
- UPSAMPLE_BACKWARD(upsample_nearest1d_backward, vec);
- UPSAMPLE_BACKWARD(upsample_nearest2d_backward, vec);
- UPSAMPLE_BACKWARD(upsample_nearest3d_backward, vec);
- UPSAMPLE_BACKWARD(upsample_trilinear3d_backward, vec);
+ UPSAMPLE_BACKWARD(upsample_bicubic2d_backward);
+ UPSAMPLE_BACKWARD(upsample_bilinear2d_backward);
+ UPSAMPLE_BACKWARD(upsample_linear1d_backward);
+ UPSAMPLE_BACKWARD(upsample_nearest1d_backward);
+ UPSAMPLE_BACKWARD(upsample_nearest2d_backward);
+ UPSAMPLE_BACKWARD(upsample_nearest3d_backward);
+ UPSAMPLE_BACKWARD(upsample_trilinear3d_backward);
m.impl("one_hot", one_hot_decomposition_hack);
}
}}
diff --git a/aten/src/ATen/native/UpSampleBicubic2d.cpp b/aten/src/ATen/native/UpSampleBicubic2d.cpp
index 3a0fa94..035bea5 100644
--- a/aten/src/ATen/native/UpSampleBicubic2d.cpp
+++ b/aten/src/ATen/native/UpSampleBicubic2d.cpp
@@ -287,18 +287,6 @@
return at::upsample_bicubic2d(input, osize, align_corners, scale_h, scale_w);
}
-Tensor upsample_bicubic2d_backward(
- const Tensor& grad_output,
- at::OptionalIntArrayRef output_size,
- IntArrayRef input_size,
- bool align_corners,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input_size, output_size, scale_factors);
- auto scale_h = get_scale_value(scale_factors, 0);
- auto scale_w = get_scale_value(scale_factors, 1);
- return at::upsample_bicubic2d_backward(grad_output, osize, input_size, align_corners, scale_h, scale_w);
-}
-
Tensor _upsample_bicubic2d_aa(
const Tensor& input,
at::OptionalIntArrayRef output_size,
@@ -310,18 +298,6 @@
return at::_upsample_bicubic2d_aa(input, osize, align_corners, scale_h, scale_w);
}
-Tensor _upsample_bicubic2d_aa_backward(
- const Tensor& grad_output,
- at::OptionalIntArrayRef output_size,
- IntArrayRef input_size,
- bool align_corners,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input_size, output_size, scale_factors);
- auto scale_h = get_scale_value(scale_factors, 0);
- auto scale_w = get_scale_value(scale_factors, 1);
- return at::_upsample_bicubic2d_aa_backward(grad_output, osize, input_size, align_corners, scale_h, scale_w);
-}
-
DEFINE_DISPATCH(upsample_bicubic2d_kernel);
DEFINE_DISPATCH(_upsample_bicubic2d_aa_kernel);
DEFINE_DISPATCH(_upsample_bicubic2d_aa_backward_kernel);
diff --git a/aten/src/ATen/native/UpSampleBilinear2d.cpp b/aten/src/ATen/native/UpSampleBilinear2d.cpp
index 69c856f..5d91e93 100644
--- a/aten/src/ATen/native/UpSampleBilinear2d.cpp
+++ b/aten/src/ATen/native/UpSampleBilinear2d.cpp
@@ -169,18 +169,6 @@
return at::upsample_bilinear2d(input, osize, align_corners, scale_h, scale_w);
}
-Tensor upsample_bilinear2d_backward(
- const Tensor& grad_output,
- at::OptionalIntArrayRef output_size,
- IntArrayRef input_size,
- bool align_corners,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input_size, output_size, scale_factors);
- auto scale_h = get_scale_value(scale_factors, 0);
- auto scale_w = get_scale_value(scale_factors, 1);
- return at::upsample_bilinear2d_backward(grad_output, osize, input_size, align_corners, scale_h, scale_w);
-}
-
Tensor _upsample_bilinear2d_aa(
const Tensor& input,
at::OptionalIntArrayRef output_size,
@@ -192,18 +180,6 @@
return at::_upsample_bilinear2d_aa(input, osize, align_corners, scale_h, scale_w);
}
-Tensor _upsample_bilinear2d_aa_backward(
- const Tensor& grad_output,
- at::OptionalIntArrayRef output_size,
- IntArrayRef input_size,
- bool align_corners,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input_size, output_size, scale_factors);
- auto scale_h = get_scale_value(scale_factors, 0);
- auto scale_w = get_scale_value(scale_factors, 1);
- return at::_upsample_bilinear2d_aa_backward(grad_output, osize, input_size, align_corners, scale_h, scale_w);
-}
-
DEFINE_DISPATCH(upsample_bilinear2d_kernel);
DEFINE_DISPATCH(upsample_bilinear2d_backward_kernel);
DEFINE_DISPATCH(_upsample_bilinear2d_aa_kernel);
diff --git a/aten/src/ATen/native/UpSampleLinear1d.cpp b/aten/src/ATen/native/UpSampleLinear1d.cpp
index 048d4b5..aed082b 100644
--- a/aten/src/ATen/native/UpSampleLinear1d.cpp
+++ b/aten/src/ATen/native/UpSampleLinear1d.cpp
@@ -99,17 +99,6 @@
return at::upsample_linear1d(input, osize, align_corners, scale_w);
}
-Tensor upsample_linear1d_backward(
- const Tensor& grad_output,
- at::OptionalIntArrayRef output_size,
- IntArrayRef input_size,
- bool align_corners,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input_size, output_size, scale_factors);
- auto scale_w = get_scale_value(scale_factors, 0);
- return at::upsample_linear1d_backward(grad_output, osize, input_size, align_corners, scale_w);
-}
-
DEFINE_DISPATCH(upsample_linear1d_kernel);
DEFINE_DISPATCH(upsample_linear1d_backward_kernel);
diff --git a/aten/src/ATen/native/UpSampleNearest1d.cpp b/aten/src/ATen/native/UpSampleNearest1d.cpp
index 5cc53de..1bdbda8 100644
--- a/aten/src/ATen/native/UpSampleNearest1d.cpp
+++ b/aten/src/ATen/native/UpSampleNearest1d.cpp
@@ -141,26 +141,6 @@
return at::_upsample_nearest_exact1d(input, osize, scale_w);
}
-Tensor upsample_nearest1d_backward(
- const Tensor& grad_output,
- at::OptionalIntArrayRef output_size,
- IntArrayRef input_size,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input_size, output_size, scale_factors);
- auto scale_w = get_scale_value(scale_factors, 0);
- return at::upsample_nearest1d_backward(grad_output, osize, input_size, scale_w);
-}
-
-Tensor _upsample_nearest_exact1d_backward(
- const Tensor& grad_output,
- at::OptionalIntArrayRef output_size,
- IntArrayRef input_size,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input_size, output_size, scale_factors);
- auto scale_w = get_scale_value(scale_factors, 0);
- return at::_upsample_nearest_exact1d_backward(grad_output, osize, input_size, scale_w);
-}
-
DEFINE_DISPATCH(upsample_nearest1d_kernel);
DEFINE_DISPATCH(_upsample_nearest_exact1d_kernel);
DEFINE_DISPATCH(upsample_nearest1d_backward_kernel);
diff --git a/aten/src/ATen/native/UpSampleNearest2d.cpp b/aten/src/ATen/native/UpSampleNearest2d.cpp
index 14c7a7d..65e20b7 100644
--- a/aten/src/ATen/native/UpSampleNearest2d.cpp
+++ b/aten/src/ATen/native/UpSampleNearest2d.cpp
@@ -167,28 +167,6 @@
return at::_upsample_nearest_exact2d(input, osize, scale_h, scale_w);
}
-Tensor upsample_nearest2d_backward(
- const Tensor& grad_output,
- at::OptionalIntArrayRef output_size,
- IntArrayRef input_size,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input_size, output_size, scale_factors);
- auto scale_h = get_scale_value(scale_factors, 0);
- auto scale_w = get_scale_value(scale_factors, 1);
- return at::upsample_nearest2d_backward(grad_output, osize, input_size, scale_h, scale_w);
-}
-
-Tensor _upsample_nearest_exact2d_backward(
- const Tensor& grad_output,
- at::OptionalIntArrayRef output_size,
- IntArrayRef input_size,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input_size, output_size, scale_factors);
- auto scale_h = get_scale_value(scale_factors, 0);
- auto scale_w = get_scale_value(scale_factors, 1);
- return at::_upsample_nearest_exact2d_backward(grad_output, osize, input_size, scale_h, scale_w);
-}
-
DEFINE_DISPATCH(upsample_nearest2d_kernel);
DEFINE_DISPATCH(_upsample_nearest_exact2d_kernel);
DEFINE_DISPATCH(upsample_nearest2d_backward_kernel);
diff --git a/aten/src/ATen/native/UpSampleNearest3d.cpp b/aten/src/ATen/native/UpSampleNearest3d.cpp
index 73948f6..27ca674 100644
--- a/aten/src/ATen/native/UpSampleNearest3d.cpp
+++ b/aten/src/ATen/native/UpSampleNearest3d.cpp
@@ -162,7 +162,7 @@
using at::native::upsample::compute_output_size;
using at::native::upsample::get_scale_value;
-Tensor upsample_nearest3d_cpu(
+Tensor upsample_nearest3d(
const Tensor& input,
at::OptionalIntArrayRef output_size,
c10::optional<ArrayRef<double>> scale_factors) {
@@ -173,7 +173,7 @@
return at::upsample_nearest3d(input, osize, scale_d, scale_h, scale_w);
}
-Tensor _upsample_nearest_exact3d_cpu(
+Tensor _upsample_nearest_exact3d(
const Tensor& input,
at::OptionalIntArrayRef output_size,
c10::optional<ArrayRef<double>> scale_factors) {
@@ -184,31 +184,6 @@
return at::_upsample_nearest_exact3d(input, osize, scale_d, scale_h, scale_w);
}
-// when structured kernels can handle QuantizedCPU, update these overloads to be CompositeExplicitAutograd
-Tensor upsample_nearest3d_backward_cpu(
- const Tensor& grad_output,
- at::OptionalIntArrayRef output_size,
- IntArrayRef input_size,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input_size, output_size, scale_factors);
- auto scale_d = get_scale_value(scale_factors, 0);
- auto scale_h = get_scale_value(scale_factors, 1);
- auto scale_w = get_scale_value(scale_factors, 2);
- return at::upsample_nearest3d_backward(grad_output, osize, input_size, scale_d, scale_h, scale_w);
-}
-
-Tensor _upsample_nearest_exact3d_backward_cpu(
- const Tensor& grad_output,
- at::OptionalIntArrayRef output_size,
- IntArrayRef input_size,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input_size, output_size, scale_factors);
- auto scale_d = get_scale_value(scale_factors, 0);
- auto scale_h = get_scale_value(scale_factors, 1);
- auto scale_w = get_scale_value(scale_factors, 2);
- return at::_upsample_nearest_exact3d_backward(grad_output, osize, input_size, scale_d, scale_h, scale_w);
-}
-
DEFINE_DISPATCH(upsample_nearest3d_kernel);
DEFINE_DISPATCH(_upsample_nearest_exact3d_kernel);
DEFINE_DISPATCH(upsample_nearest3d_backward_kernel);
diff --git a/aten/src/ATen/native/UpSampleTrilinear3d.cpp b/aten/src/ATen/native/UpSampleTrilinear3d.cpp
index 76bc4da..1bf9c8f 100644
--- a/aten/src/ATen/native/UpSampleTrilinear3d.cpp
+++ b/aten/src/ATen/native/UpSampleTrilinear3d.cpp
@@ -111,19 +111,6 @@
return at::upsample_trilinear3d(input, osize, align_corners, scale_d, scale_h, scale_w);
}
-Tensor upsample_trilinear3d_backward(
- const Tensor& grad_output,
- at::OptionalIntArrayRef output_size,
- IntArrayRef input_size,
- bool align_corners,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input_size, output_size, scale_factors);
- auto scale_d = get_scale_value(scale_factors, 0);
- auto scale_h = get_scale_value(scale_factors, 1);
- auto scale_w = get_scale_value(scale_factors, 2);
- return at::upsample_trilinear3d_backward(grad_output, osize, input_size, align_corners, scale_d, scale_h, scale_w);
-}
-
DEFINE_DISPATCH(upsample_trilinear3d_kernel);
DEFINE_DISPATCH(upsample_trilinear3d_backward_kernel);
diff --git a/aten/src/ATen/native/cuda/UpSampleNearest3d.cu b/aten/src/ATen/native/cuda/UpSampleNearest3d.cu
index 1a4afa0..58f14ad 100644
--- a/aten/src/ATen/native/cuda/UpSampleNearest3d.cu
+++ b/aten/src/ATen/native/cuda/UpSampleNearest3d.cu
@@ -337,52 +337,5 @@
using at::native::upsample::compute_output_size;
using at::native::upsample_cuda::get_scale_value;
-Tensor upsample_nearest3d_cuda(
- const Tensor& input,
- at::OptionalIntArrayRef output_size,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input.sizes(), output_size, scale_factors);
- auto scale_d = get_scale_value(scale_factors, 0);
- auto scale_h = get_scale_value(scale_factors, 1);
- auto scale_w = get_scale_value(scale_factors, 2);
- return at::upsample_nearest3d(input, osize, scale_d, scale_h, scale_w);
-}
-
-Tensor _upsample_nearest_exact3d_cuda(
- const Tensor& input,
- at::OptionalIntArrayRef output_size,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input.sizes(), output_size, scale_factors);
- auto scale_d = get_scale_value(scale_factors, 0);
- auto scale_h = get_scale_value(scale_factors, 1);
- auto scale_w = get_scale_value(scale_factors, 2);
- return at::_upsample_nearest_exact3d(input, osize, scale_d, scale_h, scale_w);
-}
-
-// when structured kernels can handle QuantizedCPU, update these overloads to be CompositeExplicitAutograd
-Tensor upsample_nearest3d_backward_cuda(
- const Tensor& grad_output,
- at::OptionalIntArrayRef output_size,
- IntArrayRef input_size,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input_size, output_size, scale_factors);
- auto scale_d = get_scale_value(scale_factors, 0);
- auto scale_h = get_scale_value(scale_factors, 1);
- auto scale_w = get_scale_value(scale_factors, 2);
- return at::upsample_nearest3d_backward(grad_output, osize, input_size, scale_d, scale_h, scale_w);
-}
-
-Tensor _upsample_nearest_exact3d_backward_cuda(
- const Tensor& grad_output,
- at::OptionalIntArrayRef output_size,
- IntArrayRef input_size,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input_size, output_size, scale_factors);
- auto scale_d = get_scale_value(scale_factors, 0);
- auto scale_h = get_scale_value(scale_factors, 1);
- auto scale_w = get_scale_value(scale_factors, 2);
- return at::_upsample_nearest_exact3d_backward(grad_output, osize, input_size, scale_d, scale_h, scale_w);
-}
-
} // namespace native
} // namespace at
diff --git a/aten/src/ATen/native/native_functions.yaml b/aten/src/ATen/native/native_functions.yaml
index 2a48f5d..7452134 100644
--- a/aten/src/ATen/native/native_functions.yaml
+++ b/aten/src/ATen/native/native_functions.yaml
@@ -11043,158 +11043,54 @@
- func: upsample_linear1d.vec(Tensor input, SymInt[]? output_size, bool align_corners, float[]? scale_factors) -> Tensor
python_module: nn
- dispatch:
- CompositeExplicitAutograd: upsample_linear1d
autogen: upsample_linear1d.vec_out
-- func: upsample_linear1d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, bool align_corners, float[]? scale_factors) -> Tensor
- python_module: nn
- dispatch:
- CompositeExplicitAutograd: upsample_linear1d_backward
- autogen: upsample_linear1d_backward.vec_out
-
- func: upsample_bilinear2d.vec(Tensor input, SymInt[]? output_size, bool align_corners, float[]? scale_factors) -> Tensor
python_module: nn
- dispatch:
- CompositeExplicitAutograd: upsample_bilinear2d
autogen: upsample_bilinear2d.vec_out
tags: canonical
-- func: upsample_bilinear2d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, bool align_corners, float[]? scale_factors) -> Tensor
- python_module: nn
- dispatch:
- CompositeExplicitAutograd: upsample_bilinear2d_backward
- autogen: upsample_bilinear2d_backward.vec_out
- tags: canonical
-
- func: _upsample_bilinear2d_aa.vec(Tensor input, SymInt[]? output_size, bool align_corners, float[]? scale_factors) -> Tensor
python_module: nn
- dispatch:
- CompositeExplicitAutograd: _upsample_bilinear2d_aa
autogen: _upsample_bilinear2d_aa.vec_out
-- func: _upsample_bilinear2d_aa_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, bool align_corners, float[]? scale_factors) -> Tensor
- python_module: nn
- dispatch:
- CompositeExplicitAutograd: _upsample_bilinear2d_aa_backward
- autogen: _upsample_bilinear2d_aa_backward.vec_out
-
- func: upsample_trilinear3d.vec(Tensor input, SymInt[]? output_size, bool align_corners, float[]? scale_factors) -> Tensor
python_module: nn
- dispatch:
- CompositeExplicitAutograd: upsample_trilinear3d
autogen: upsample_trilinear3d.vec_out
-- func: upsample_trilinear3d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, bool align_corners, float[]? scale_factors) -> Tensor
- python_module: nn
- dispatch:
- CompositeExplicitAutograd: upsample_trilinear3d_backward
- autogen: upsample_trilinear3d_backward.vec_out
-
- func: upsample_bicubic2d.vec(Tensor input, SymInt[]? output_size, bool align_corners, float[]? scale_factors) -> Tensor
python_module: nn
- dispatch:
- CompositeExplicitAutograd: upsample_bicubic2d
autogen: upsample_bicubic2d.vec_out
-- func: upsample_bicubic2d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, bool align_corners, float[]? scale_factors) -> Tensor
- python_module: nn
- dispatch:
- CompositeExplicitAutograd: upsample_bicubic2d_backward
- autogen: upsample_bicubic2d_backward.vec_out
-
- func: _upsample_bicubic2d_aa.vec(Tensor input, SymInt[]? output_size, bool align_corners, float[]? scale_factors) -> Tensor
python_module: nn
- dispatch:
- CompositeExplicitAutograd: _upsample_bicubic2d_aa
autogen: _upsample_bicubic2d_aa.vec_out
-- func: _upsample_bicubic2d_aa_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, bool align_corners, float[]? scale_factors) -> Tensor
- python_module: nn
- dispatch:
- CompositeExplicitAutograd: _upsample_bicubic2d_aa_backward
- autogen: _upsample_bicubic2d_aa_backward.vec_out
-
- func: upsample_nearest1d.vec(Tensor input, SymInt[]? output_size, float[]? scale_factors) -> Tensor
python_module: nn
- dispatch:
- CompositeExplicitAutograd: upsample_nearest1d
autogen: upsample_nearest1d.vec_out
- func: _upsample_nearest_exact1d.vec(Tensor input, SymInt[]? output_size, float[]? scale_factors) -> Tensor
python_module: nn
- dispatch:
- CompositeExplicitAutograd: _upsample_nearest_exact1d
autogen: _upsample_nearest_exact1d.vec_out
-- func: upsample_nearest1d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, float[]? scale_factors) -> Tensor
- python_module: nn
- dispatch:
- CompositeExplicitAutograd: upsample_nearest1d_backward
- autogen: upsample_nearest1d_backward.vec_out
-
-- func: _upsample_nearest_exact1d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, float[]? scale_factors) -> Tensor
- python_module: nn
- dispatch:
- CompositeExplicitAutograd: _upsample_nearest_exact1d_backward
- autogen: _upsample_nearest_exact1d_backward.vec_out
-
- func: upsample_nearest2d.vec(Tensor input, SymInt[]? output_size, float[]? scale_factors) -> Tensor
python_module: nn
- dispatch:
- CompositeExplicitAutograd: upsample_nearest2d
autogen: upsample_nearest2d.vec_out
tags: canonical
- func: _upsample_nearest_exact2d.vec(Tensor input, SymInt[]? output_size, float[]? scale_factors) -> Tensor
python_module: nn
- dispatch:
- CompositeExplicitAutograd: _upsample_nearest_exact2d
autogen: _upsample_nearest_exact2d.vec_out
-- func: upsample_nearest2d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, float[]? scale_factors) -> Tensor
- python_module: nn
- dispatch:
- CompositeExplicitAutograd: upsample_nearest2d_backward
- autogen: upsample_nearest2d_backward.vec_out
- tags: canonical
-
-- func: _upsample_nearest_exact2d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, float[]? scale_factors) -> Tensor
- python_module: nn
- dispatch:
- CompositeExplicitAutograd: _upsample_nearest_exact2d_backward
- autogen: _upsample_nearest_exact2d_backward.vec_out
-
- func: upsample_nearest3d.vec(Tensor input, SymInt[]? output_size, float[]? scale_factors) -> Tensor
python_module: nn
- dispatch:
- CPU: upsample_nearest3d_cpu
- CUDA: upsample_nearest3d_cuda
- QuantizedCPU: upsample_nearest3d_quantized_cpu
autogen: upsample_nearest3d.vec_out
- func: _upsample_nearest_exact3d.vec(Tensor input, SymInt[]? output_size, float[]? scale_factors) -> Tensor
python_module: nn
- dispatch:
- CPU: _upsample_nearest_exact3d_cpu
- CUDA: _upsample_nearest_exact3d_cuda
- QuantizedCPU: _upsample_nearest_exact3d_quantized_cpu
autogen: _upsample_nearest_exact3d.vec_out
-- func: upsample_nearest3d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, float[]? scale_factors) -> Tensor
- python_module: nn
- dispatch:
- CPU: upsample_nearest3d_backward_cpu
- CUDA: upsample_nearest3d_backward_cuda
- autogen: upsample_nearest3d_backward.vec_out
-
-- func: _upsample_nearest_exact3d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, float[]? scale_factors) -> Tensor
- python_module: nn
- dispatch:
- CPU: _upsample_nearest_exact3d_backward_cpu
- CUDA: _upsample_nearest_exact3d_backward_cuda
- autogen: _upsample_nearest_exact3d_backward.vec_out
-
# NOTE: all of the non-"vec" upsample overloads are only kept for backward compatibility.
- func: upsample_linear1d.out(Tensor self, SymInt[1] output_size, bool align_corners, float? scales=None, *, Tensor(a!) out) -> Tensor(a!)
python_module: nn
diff --git a/aten/src/ATen/native/quantized/cpu/UpSampleNearest3d.cpp b/aten/src/ATen/native/quantized/cpu/UpSampleNearest3d.cpp
index 871f700..4b4c63e 100644
--- a/aten/src/ATen/native/quantized/cpu/UpSampleNearest3d.cpp
+++ b/aten/src/ATen/native/quantized/cpu/UpSampleNearest3d.cpp
@@ -238,27 +238,5 @@
input, osize, scale_d, scale_h, scale_w);
}
-Tensor upsample_nearest3d_quantized_cpu(
- const Tensor& input,
- at::OptionalIntArrayRef output_size,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input.sizes(), output_size, scale_factors);
- auto scale_d = get_scale_value(scale_factors, 0);
- auto scale_h = get_scale_value(scale_factors, 1);
- auto scale_w = get_scale_value(scale_factors, 2);
- return upsample_nearest3d_quantized_cpu(input, osize, scale_d, scale_h, scale_w);
-}
-
-Tensor _upsample_nearest_exact3d_quantized_cpu(
- const Tensor& input,
- at::OptionalIntArrayRef output_size,
- c10::optional<ArrayRef<double>> scale_factors) {
- auto osize = compute_output_size(input.sizes(), output_size, scale_factors);
- auto scale_d = get_scale_value(scale_factors, 0);
- auto scale_h = get_scale_value(scale_factors, 1);
- auto scale_w = get_scale_value(scale_factors, 2);
- return _upsample_nearest_exact3d_quantized_cpu(input, osize, scale_d, scale_h, scale_w);
-}
-
} // namespace native
} // namespace at
diff --git a/test/forward_backward_compatibility/check_forward_backward_compatibility.py b/test/forward_backward_compatibility/check_forward_backward_compatibility.py
index 30e398d..e9d0834 100644
--- a/test/forward_backward_compatibility/check_forward_backward_compatibility.py
+++ b/test/forward_backward_compatibility/check_forward_backward_compatibility.py
@@ -293,6 +293,30 @@
("aten::_nested_tensor_layer_norm", datetime.date(2022, 10, 15)),
("aten::_torch_cuda_cu_linker_symbol_op", datetime.date(2022, 11, 1)),
+ ("aten::upsample_linear1d_backward", datetime.date(2022, 12, 15)),
+ ("aten::upsample_bicubic2d_backward", datetime.date(2022, 12, 15)),
+ ("aten::upsample_trilinear3d", datetime.date(2022, 12, 15)),
+ ("aten::upsample_bilinear2d", datetime.date(2022, 12, 15)),
+ ("aten::upsample_nearest3d", datetime.date(2022, 12, 15)),
+ ("aten::upsample_nearest2d_backward", datetime.date(2022, 12, 15)),
+ ("aten::upsample_bilinear2d_backward", datetime.date(2022, 12, 15)),
+ ("aten::upsample_trilinear3d_backward", datetime.date(2022, 12, 15)),
+ ("aten::upsample_nearest2d", datetime.date(2022, 12, 15)),
+ ("aten::upsample_bicubic2d", datetime.date(2022, 12, 15)),
+ ("aten::upsample_nearest1d_backward", datetime.date(2022, 12, 15)),
+ ("aten::upsample_nearest3d_backward", datetime.date(2022, 12, 15)),
+ ("aten::upsample_linear1d", datetime.date(2022, 12, 15)),
+ ("aten::upsample_nearest1d", datetime.date(2022, 12, 15)),
+ ("aten::_upsample_nearest_exact3d", datetime.date(2022, 12, 15)),
+ ("aten::_upsample_nearest_exact3d_backward", datetime.date(2022, 12, 15)),
+ ("aten::_upsample_bilinear2d_aa", datetime.date(2022, 12, 15)),
+ ("aten::_upsample_bilinear2d_aa_backward", datetime.date(2022, 12, 15)),
+ ("aten::_upsample_bicubic2d_aa", datetime.date(2022, 12, 15)),
+ ("aten::_upsample_bicubic2d_aa_backward", datetime.date(2022, 12, 15)),
+ ("aten::_upsample_nearest_exact1d", datetime.date(2022, 12, 15)),
+ ("aten::_upsample_nearest_exact1d_backward", datetime.date(2022, 12, 15)),
+ ("aten::_upsample_nearest_exact2d", datetime.date(2022, 12, 15)),
+ ("aten::_upsample_nearest_exact2d_backward", datetime.date(2022, 12, 15)),
]
ALLOW_LIST_COMPILED = [
diff --git a/test/inductor/test_torchinductor.py b/test/inductor/test_torchinductor.py
index b0b5f88..21d1b58 100644
--- a/test/inductor/test_torchinductor.py
+++ b/test/inductor/test_torchinductor.py
@@ -2824,10 +2824,10 @@
def test_upsample_nearest2d(self):
def fn(a):
return (
- aten.upsample_nearest2d(a, [74, 76], None),
- aten.upsample_nearest2d(a, [70, 75], None),
- aten.upsample_nearest2d(a, [45, 74], None),
- aten.upsample_nearest2d(a, [36, 39], None),
+ aten.upsample_nearest2d(a, [74, 76]),
+ aten.upsample_nearest2d(a, [70, 75]),
+ aten.upsample_nearest2d(a, [45, 74]),
+ aten.upsample_nearest2d(a, [36, 39]),
aten.upsample_nearest2d(a, None, [2.0, 2.0]),
)
@@ -2846,25 +2846,15 @@
self.common(fn, (torch.randn([2, 4, 37, 38, 39]),))
def test_upsample_nearest2d_backward(self):
- func = torch.ops.aten.upsample_nearest2d_backward.vec
+ func = torch.ops.aten.upsample_nearest2d_backward
def fn(a):
return (
- func(
- a, output_size=[6, 12], input_size=[3, 3, 3, 6], scale_factors=None
- ),
- func(
- a, output_size=[6, 12], input_size=[3, 3, 4, 5], scale_factors=None
- ),
- func(
- a, output_size=[6, 12], input_size=[3, 3, 2, 8], scale_factors=None
- ),
- func(
- a, output_size=[6, 12], input_size=[3, 3, 2, 8], scale_factors=None
- ),
- func(
- a, output_size=[6, 12], input_size=[3, 3, 4, 7], scale_factors=None
- ),
+ func(a, output_size=[6, 12], input_size=[3, 3, 3, 6]),
+ func(a, output_size=[6, 12], input_size=[3, 3, 4, 5]),
+ func(a, output_size=[6, 12], input_size=[3, 3, 2, 8]),
+ func(a, output_size=[6, 12], input_size=[3, 3, 2, 8]),
+ func(a, output_size=[6, 12], input_size=[3, 3, 4, 7]),
)
self.common(fn, (torch.randn([3, 3, 6, 12]),))
diff --git a/test/test_autograd.py b/test/test_autograd.py
index dd3ecf3..f5d890f 100644
--- a/test/test_autograd.py
+++ b/test/test_autograd.py
@@ -5447,9 +5447,7 @@
a = torch.ones(1, 1, 2, requires_grad=True)
out = torch.nn.functional.interpolate(a, scale_factor=0.5, mode="linear")
- self.assertIsNone(out.grad_fn._saved_output_size)
- self.assertEqual(out.grad_fn._saved_scale_factors, (0.5,))
- self.assertIsInstance(out.grad_fn._saved_scale_factors[0], float)
+ self.assertEqual(out.grad_fn._saved_scales, 0.5)
a = torch.ones(2, 2, requires_grad=True)
out = torch.pdist(a, p=1)
diff --git a/test/test_decomp.py b/test/test_decomp.py
index dff62be..67e99d5 100644
--- a/test/test_decomp.py
+++ b/test/test_decomp.py
@@ -198,8 +198,9 @@
(torch.float32, torch.ops.aten.grid_sampler_2d.default) : (7e-6, 3e-5),
# Exceeds tolerances on CUDA, likely due to fma
(torch.float32, torch.ops.aten.mv.default) : (1e-5, 3e-5),
- (torch.float64, torch.ops.aten.upsample_bicubic2d.vec) : (1e-5, 1e-6),
(torch.complex64, torch.ops.aten.mv.default): (5e-5, 5e-5),
+ (torch.float64, torch.ops.aten.upsample_bicubic2d.vec) : (1e-5, 5e-4),
+ (torch.float64, torch.ops.aten.upsample_bicubic2d.default) : (1e-5, 5e-4),
}
if (test_dtype, op) in tol_table:
rtol, atol = tol_table[(decomp.dtype, op)]
diff --git a/tools/autograd/derivatives.yaml b/tools/autograd/derivatives.yaml
index dbe7090..8349a30 100644
--- a/tools/autograd/derivatives.yaml
+++ b/tools/autograd/derivatives.yaml
@@ -2082,53 +2082,6 @@
self: _upsample_nearest_exact3d_backward_symint(grad, output_size, self.sym_sizes(), scales_d, scales_h, scales_w)
result: auto_linear
-- name: upsample_linear1d.vec(Tensor input, SymInt[]? output_size, bool align_corners, float[]? scale_factors) -> Tensor
- input: upsample_linear1d_backward_symint(grad, output_size, input.sym_sizes(), align_corners, scale_factors)
- result: auto_linear
-
-- name: upsample_bilinear2d.vec(Tensor input, SymInt[]? output_size, bool align_corners, float[]? scale_factors) -> Tensor
- input: upsample_bilinear2d_backward_symint(grad, output_size, input.sym_sizes(), align_corners, scale_factors)
- result: auto_linear
-
-- name: _upsample_bilinear2d_aa.vec(Tensor input, SymInt[]? output_size, bool align_corners, float[]? scale_factors) -> Tensor
- input: _upsample_bilinear2d_aa_backward_symint(grad, output_size, input.sym_sizes(), align_corners, scale_factors)
- result: auto_linear
-
-- name: upsample_trilinear3d.vec(Tensor input, SymInt[]? output_size, bool align_corners, float[]? scale_factors) -> Tensor
- input: upsample_trilinear3d_backward_symint(grad, output_size, input.sym_sizes(), align_corners, scale_factors)
- result: auto_linear
-
-- name: upsample_bicubic2d.vec(Tensor input, SymInt[]? output_size, bool align_corners, float[]? scale_factors) -> Tensor
- input: upsample_bicubic2d_backward_symint(grad, output_size, input.sym_sizes(), align_corners, scale_factors)
- result: auto_linear
-
-- name: _upsample_bicubic2d_aa.vec(Tensor input, SymInt[]? output_size, bool align_corners, float[]? scale_factors) -> Tensor
- input: _upsample_bicubic2d_aa_backward_symint(grad, output_size, input.sym_sizes(), align_corners, scale_factors)
-
-- name: upsample_nearest1d.vec(Tensor input, SymInt[]? output_size, float[]? scale_factors) -> Tensor
- input: upsample_nearest1d_backward_symint(grad, output_size, input.sym_sizes(), scale_factors)
- result: auto_linear
-
-- name: _upsample_nearest_exact1d.vec(Tensor input, SymInt[]? output_size, float[]? scale_factors) -> Tensor
- input: _upsample_nearest_exact1d_backward_symint(grad, output_size, input.sym_sizes(), scale_factors)
- result: auto_linear
-
-- name: upsample_nearest2d.vec(Tensor input, SymInt[]? output_size, float[]? scale_factors) -> Tensor
- input: upsample_nearest2d_backward_symint(grad, output_size, input.sym_sizes(), scale_factors)
- result: auto_linear
-
-- name: _upsample_nearest_exact2d.vec(Tensor input, SymInt[]? output_size, float[]? scale_factors) -> Tensor
- input: _upsample_nearest_exact2d_backward_symint(grad, output_size, input.sym_sizes(), scale_factors)
- result: auto_linear
-
-- name: upsample_nearest3d.vec(Tensor input, SymInt[]? output_size, float[]? scale_factors) -> Tensor
- input: upsample_nearest3d_backward_symint(grad, output_size, input.sym_sizes(), scale_factors)
- result: auto_linear
-
-- name: _upsample_nearest_exact3d.vec(Tensor input, SymInt[]? output_size, float[]? scale_factors) -> Tensor
- input: _upsample_nearest_exact3d_backward_symint(grad, output_size, input.sym_sizes(), scale_factors)
- result: auto_linear
-
- name: pixel_shuffle(Tensor self, int upscale_factor) -> Tensor
self: pixel_unshuffle(grad, upscale_factor)
result: auto_linear
@@ -2507,53 +2460,6 @@
grad_output: _upsample_nearest_exact3d_symint(grad, output_size, scales_d, scales_h, scales_w)
result: auto_linear
-- name: upsample_linear1d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, bool align_corners, float[]? scale_factors) -> Tensor
- grad_output: upsample_linear1d_symint(grad, output_size, align_corners, scale_factors)
- result: auto_linear
-
-- name: upsample_bilinear2d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, bool align_corners, float[]? scale_factors) -> Tensor
- grad_output: upsample_bilinear2d_symint(grad, output_size, align_corners, scale_factors)
- result: auto_linear
-
-- name: _upsample_bilinear2d_aa_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, bool align_corners, float[]? scale_factors) -> Tensor
- grad_output: _upsample_bilinear2d_aa_symint(grad, output_size, align_corners, scale_factors)
- result: auto_linear
-
-- name: upsample_trilinear3d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, bool align_corners, float[]? scale_factors) -> Tensor
- grad_output: upsample_trilinear3d_symint(grad, output_size, align_corners, scale_factors)
- result: auto_linear
-
-- name: upsample_bicubic2d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, bool align_corners, float[]? scale_factors) -> Tensor
- grad_output: upsample_bicubic2d_symint(grad, output_size, align_corners, scale_factors)
- result: auto_linear
-
-- name: _upsample_bicubic2d_aa_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, bool align_corners, float[]? scale_factors) -> Tensor
- grad_output: _upsample_bicubic2d_aa_symint(grad, output_size, align_corners, scale_factors)
-
-- name: upsample_nearest1d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, float[]? scale_factors) -> Tensor
- grad_output: upsample_nearest1d_symint(grad, output_size, scale_factors)
- result: auto_linear
-
-- name: _upsample_nearest_exact1d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, float[]? scale_factors) -> Tensor
- grad_output: _upsample_nearest_exact1d_symint(grad, output_size, scale_factors)
- result: auto_linear
-
-- name: upsample_nearest2d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, float[]? scale_factors) -> Tensor
- grad_output: upsample_nearest2d_symint(grad, output_size, scale_factors)
- result: auto_linear
-
-- name: _upsample_nearest_exact2d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, float[]? scale_factors) -> Tensor
- grad_output: _upsample_nearest_exact2d_symint(grad, output_size, scale_factors)
- result: auto_linear
-
-- name: upsample_nearest3d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, float[]? scale_factors) -> Tensor
- grad_output: upsample_nearest3d_symint(grad, output_size, scale_factors)
- result: auto_linear
-
-- name: _upsample_nearest_exact3d_backward.vec(Tensor grad_output, SymInt[]? output_size, SymInt[] input_size, float[]? scale_factors) -> Tensor
- grad_output: _upsample_nearest_exact3d_symint(grad, output_size, scale_factors)
- result: auto_linear
-
- name: sigmoid_backward(Tensor grad_output, Tensor output) -> Tensor
grad_output: sigmoid_backward(grad, output.conj())
output: grad.conj() * grad_output * (-2 * output.conj() + 1)
diff --git a/torch/_inductor/decomposition.py b/torch/_inductor/decomposition.py
index b4c8087..d7aa5e3 100644
--- a/torch/_inductor/decomposition.py
+++ b/torch/_inductor/decomposition.py
@@ -101,6 +101,8 @@
aten.unfold_backward,
aten.upsample_bilinear2d.vec,
aten.upsample_nearest2d_backward,
+ aten.softplus,
+ aten.softplus_backward,
]
)
diff --git a/torch/_inductor/lowering.py b/torch/_inductor/lowering.py
index ece23f1..5ec83dc 100644
--- a/torch/_inductor/lowering.py
+++ b/torch/_inductor/lowering.py
@@ -2028,20 +2028,20 @@
return self
-def upsample_nearestnd(x, output_size=None, scale_factors=None, n=2):
+def upsample_nearestnd(x, output_size, scales_x: Tuple[float] = None, n: int = 2):
x.realize_hint() # elements are reused
x_loader = x.make_loader()
i_sizes = x.get_size()[-n:]
batch = x.get_size()[:-n]
i_sizes = [V.graph.sizevars.guard_static_shape(i) for i in i_sizes]
- if scale_factors:
- assert not output_size
- o_sizes = [int(i * s) for i, s in zip(i_sizes, scale_factors)]
- else:
- o_sizes = output_size
+ assert len(scales_x) == n
+ o_sizes = output_size
scales = [i / o for i, o in zip(i_sizes, o_sizes)]
+ for i, scale in enumerate(scales):
+ if scale:
+ scales[i] = scale
def scale(x, scale):
x = ops.index_expr(x, torch.float32)
@@ -2062,9 +2062,27 @@
)
-register_lowering(aten.upsample_nearest1d)(functools.partial(upsample_nearestnd, n=1))
-register_lowering(aten.upsample_nearest2d)(functools.partial(upsample_nearestnd, n=2))
-register_lowering(aten.upsample_nearest3d)(functools.partial(upsample_nearestnd, n=3))
+@register_lowering(aten.upsample_nearest1d.default)
+def upsample_nearest1d(x, output_size, scales: Optional[float] = None):
+ return upsample_nearestnd(x, output_size, (scales,), n=1)
+
+
+@register_lowering(aten.upsample_nearest2d.default)
+def upsample_nearest2d(
+ x, output_size, scales_h: Optional[float] = None, scales_w: Optional[float] = None
+):
+ return upsample_nearestnd(x, output_size, (scales_h, scales_w), n=2)
+
+
+@register_lowering(aten.upsample_nearest3d.default)
+def upsample_nearest3d(
+ x,
+ output_size,
+ scales_d: Optional[float] = None,
+ scales_h: Optional[float] = None,
+ scales_w: Optional[float] = None,
+):
+ return upsample_nearestnd(x, output_size, (scales_d, scales_h, scales_w), n=3)
@register_lowering(aten.upsample_bicubic2d.default)
@@ -2182,26 +2200,6 @@
)
-@register_lowering(aten.upsample_bicubic2d.vec)
-def upsample_bicubic2d_vec(
- a,
- output_size,
- align_corners: bool,
- scale_factors: Optional[Tuple[float, float]] = None,
-):
- _, _, iH, iW = a.get_size()
- iH = V.graph.sizevars.guard_static_shape(iH)
- iW = V.graph.sizevars.guard_static_shape(iW)
-
- if bool(output_size) + bool(scale_factors) != 1:
- raise RuntimeError("Must specify exactly one of output_size and scale_factor.")
- if output_size is None:
- assert scale_factors is not None
- output_size = (int(iH * scale_factors[0]), int(iW * scale_factors[1]))
- scale_h, scale_w = scale_factors if scale_factors else (None, None)
- return upsample_bicubic2d_default(a, output_size, align_corners, scale_h, scale_w)
-
-
@register_lowering(aten.reflection_pad2d)
def reflection_pad2d(x, padding):
assert len(padding) == 4
@@ -2719,9 +2717,9 @@
return rv
-@register_lowering(aten.upsample_nearest2d_backward.vec)
+@register_lowering(aten.upsample_nearest2d_backward.default)
def upsample_nearest2d_backward(
- x, output_size=None, input_size=None, scale_factors=None
+ x, output_size=None, input_size=None, scales_h=None, scales_w=None
):
x.realize_hint()
diff --git a/torch/_meta_registrations.py b/torch/_meta_registrations.py
index da18ba4..f4fd6e7 100644
--- a/torch/_meta_registrations.py
+++ b/torch/_meta_registrations.py
@@ -1670,32 +1670,6 @@
return self.new_empty(self.shape)
-@register_meta(aten.upsample_nearest2d.vec)
-def upsample_nearest2d_vec(input, output_size, scale_factors):
- mem_format = utils.suggest_memory_format(input)
- spatial_dimensions = input.dim() - 2
-
- input_shape = input.shape
- if output_size is not None:
- assert scale_factors is None
- out_size = output_size
- elif scale_factors is not None:
- assert output_size is None
- out_size = []
- for i in range(spatial_dimensions):
- sym_float = (input_shape[i + 2] / 1) * scale_factors[i]
- assert sym_float >= 0
- out_size.append(math.floor(sym_float))
-
- output_height = out_size[0]
- output_width = out_size[1]
- nbatch = input_shape[0]
- channels = input_shape[1]
- return input.new_empty((nbatch, channels, output_height, output_width)).to(
- memory_format=mem_format
- )
-
-
# We must also trigger meta registrations from PrimTorch ref
# decompositions
import torch._refs