Files
pytorch/torchgen/aoti/fallback_ops.py
Mikayla Gawarecki dc8fe8f971 Add squeeze, unsqueeze, matmul, select, subtract to stable ops (#169880)
From https://github.com/pytorch/audio/blob/main/src/libtorchaudio/stable/ops.h

Technically it should have been ok not to port these but looking at these carefully I realized the subtract ported to audio ~would have undefined behavior :/~ is broken

```
inline Tensor subtract(const Tensor& self, const Tensor& other) {
  const auto num_args = 2;
  std::array<StableIValue, num_args> stack{
      torch::stable::detail::from(self), torch::stable::detail::from(other)};
  TORCH_ERROR_CODE_CHECK(torch_call_dispatcher(
      "aten::subtract", "Tensor", stack.data(), TORCH_ABI_VERSION));
  return torch::stable::detail::to<torch::stable::Tensor>(stack[0]);
}
```

as it missed `alpha` the signature for `subtract.Tensor` is  `func: subtract.Tensor(Tensor self, Tensor other, *, Scalar alpha=1) -> Tensor`. ~This is also our bad as although out of bounds reads on the stableivalue stack would be caught by asan, without asan they are silent correctness issues (PR coming to fix).~

Use the old path to support this as we don't support stableivalue conversion for Scalar yet.

Pull Request resolved: https://github.com/pytorch/pytorch/pull/169880
Approved by: https://github.com/albanD
ghstack dependencies: #169703, #169709, #169711, #168062, #169872
2025-12-09 15:47:47 +00:00

195 lines
8.1 KiB
Python

# Be extra careful when you edit this file, because it affects AOTInductor ABI compatibility. See
# https://github.com/pytorch/pytorch/blob/7e86a7c0155295539996e0cf422883571126073e/torchgen/gen.py#L2424-L2436
# for details.
#
# The inductor_fallback_ops list is based on the fallback ops from torch/_inductor/lowering.py.
#
# Generally speaking, it is ok to add a new op to the list, but you need to run
# `python torchgen/gen.py --update-aoti-c-shim` in order to regenerate C shim header files.
# But it is NOT ok to remove an existing fallback op from the list, since that will break
# some existing AOTInductor-compiled models.
#
# A fallback op version defaults to 1. If you want to extend an existing fallback op by adding
# a new argument with a default value, while it is fine in the Python world, it will be BC-breaking
# when generating C shim. Thus you need to bump up the version number of that fallback op by
# updating the entry in the inductor_fallback_ops list, adding a new version number with a list
# of new arguments, and then run `python torchgen/gen.py --update-aoti-c-shim` to regenerate.
inductor_fallback_ops: dict[str, dict[str, list[str]]] = {
"aten._adaptive_avg_pool2d_backward.default": {},
"aten._adaptive_avg_pool2d.default": {},
"aten._adaptive_avg_pool3d_backward.default": {},
"aten._adaptive_avg_pool3d.default": {},
"aten._addmm_activation.default": {},
"aten._cdist_backward.default": {},
"aten._cdist_forward.default": {},
"aten._cudnn_rnn.default": {},
"aten._dyn_quant_matmul_4bit.default": {},
"aten._dyn_quant_pack_4bit_weight.default": {},
"aten._efficient_attention_backward.default": {},
"aten._efficient_attention_forward.default": {},
"aten._efficientzerotensor.default": {},
"aten._embedding_bag_dense_backward.default": {},
"aten._embedding_bag_forward_only.default": {},
"aten._embedding_bag_per_sample_weights_backward.default": {},
"aten._embedding_bag.default": {},
"aten._fft_c2c.default": {},
"aten._fft_r2c.default": {},
"aten._flash_attention_backward.default": {},
"aten._flash_attention_forward.default": {},
"aten._fused_moving_avg_obs_fq_helper_functional.default": {},
"aten._fused_moving_avg_obs_fq_helper.default": {},
"aten._fused_rms_norm.default": {},
"aten._histogramdd_from_bin_cts.default": {},
"aten._int_mm.out": {},
"aten._pdist_backward.default": {},
"aten._pdist_forward.default": {},
"aten._scaled_dot_product_attention_math_for_mps.default": {},
"aten._scaled_dot_product_cudnn_attention_backward.default": {},
"aten._scaled_dot_product_cudnn_attention.default": {},
"aten._scaled_dot_product_efficient_attention_backward.default": {},
"aten._scaled_dot_product_efficient_attention.default": {},
"aten._scaled_dot_product_flash_attention_backward.default": {},
"aten._scaled_dot_product_flash_attention_for_cpu_backward.default": {},
"aten._scaled_dot_product_flash_attention_for_cpu.default": {},
"aten._scaled_dot_product_flash_attention.default": {},
"aten._scaled_dot_product_fused_attention_overrideable_backward.default": {},
"aten._scaled_dot_product_fused_attention_overrideable.default": {},
"aten._scaled_mm.default": {},
"aten._scaled_grouped_mm.default": {},
"aten._scaled_mm.out": {},
"aten._segment_reduce_backward.default": {},
"aten._thnn_fused_lstm_cell.default": {},
"aten._to_sparse.default": {},
"aten._trilinear.default": {},
"aten._weight_int4pack_mm.default": {},
"aten._weight_int8pack_mm.default": {},
"aten.abs.default": {},
"aten.adaptive_max_pool2d_backward.default": {},
"aten.adaptive_max_pool2d.default": {},
"aten.adaptive_max_pool3d_backward.default": {},
"aten.adaptive_max_pool3d.default": {},
"aten.add.Scalar": {},
"aten.add.Tensor": {},
"aten.addbmm.default": {},
"aten.addmm.out": {},
"aten.addmv.default": {},
"aten.angle.default": {},
"aten.avg_pool2d_backward.default": {},
"aten.avg_pool2d.default": {},
"aten.avg_pool3d_backward.default": {},
"aten.avg_pool3d.default": {},
"aten.baddbmm.out": {},
"aten.bernoulli_.float": {},
"aten.bernoulli_.Tensor": {},
"aten.bmm.out": {},
"aten.bucketize.Tensor": {},
"aten.cat.default": {},
"aten.cholesky_inverse.default": {},
"aten.cholesky_solve.default": {},
"aten.convolution_backward.default": {},
"aten.convolution.default": {},
"aten.cummax.default": {},
"aten.cummin.default": {},
"aten.cumprod.default": {},
"aten.cumsum.default": {},
"aten.exponential.default": {},
"aten.fill_.Scalar": {},
"aten.fractional_max_pool2d_backward.default": {},
"aten.fractional_max_pool2d.default": {},
"aten.fractional_max_pool3d_backward.default": {},
"aten.fractional_max_pool3d.default": {},
"aten.gcd.default": {},
"aten.geqrf.default": {},
"aten.grid_sampler_2d_backward.default": {},
"aten.hann_window.default": {},
"aten.histc.default": {},
"aten.histogram.bin_ct": {},
"aten.index_put.default": {},
"aten.index_reduce.default": {},
"aten.index.Tensor": {},
"aten.kthvalue.default": {},
"aten.logcumsumexp.default": {},
"aten.lu_unpack.default": {},
"aten.masked_scatter_backward.default": {},
"aten.masked_scatter.default": {},
"aten.masked_select.default": {},
"aten.max_pool2d_with_indices_backward.default": {},
"aten.max_pool2d_with_indices.default": {},
"aten.max_pool3d_with_indices_backward.default": {},
"aten.max_pool3d_with_indices.default": {},
"aten.max_unpool2d.default": {},
"aten.max_unpool3d.default": {},
"aten.median.default": {},
"aten.mm.out": {},
"aten.mode.default": {},
"aten.mul.Scalar": {},
"aten.mul.Tensor": {},
"aten.nanmedian.default": {},
"aten.narrow.default": {},
"aten.native_dropout.default": {},
"aten.nonzero.default": {},
"aten.normal_functional.default": {},
"aten.ormqr.default": {},
"aten.pad.default": {},
"aten.permute.default": {},
"aten.polar.default": {},
"aten.pow.Scalar": {},
"aten.pow.Tensor_Scalar": {},
"aten.pow.Tensor_Tensor": {},
"aten.rand.default": {},
"aten.rand.generator": {},
"aten.randint.default": {},
"aten.randint.generator": {},
"aten.randint.low_out": {},
"aten.randint.low": {},
"aten.randn.default": {},
"aten.randn.generator": {},
"aten.randperm.default": {},
"aten.repeat_interleave.Tensor": {},
"aten.replication_pad1d_backward.default": {},
"aten.replication_pad2d_backward.default": {},
"aten.reshape.default": {},
"aten.resize_.default": {},
"aten.resize_as_.default": {},
"aten.scatter_reduce.two_out": {},
"aten.scatter.src_out": {},
"aten.scatter.value_out": {},
"aten.searchsorted.Scalar": {},
"aten.searchsorted.Tensor": {},
"aten.segment_reduce.default": {},
"aten.set_.source_Tensor": {},
"aten.slice.Tensor": {},
"aten.soft_margin_loss_backward.default": {},
"aten.sort.default": {},
"aten.sort.stable": {},
"aten.squeeze.dim": {},
"aten.to_sparse.default": {},
"aten.topk.default": {},
"aten.triangular_solve.default": {},
"aten.uniform.default": {},
"aten.upsample_bicubic2d_backward.default": {},
"aten.upsample_linear1d_backward.default": {},
"aten.upsample_trilinear3d_backward.default": {},
"aten.view_as_complex.default": {},
"aten.view_as_real.default": {},
"aten.view.dtype": {},
"aten._weight_int4pack_mm_with_scales_and_zeros.default": {},
}
# `python torchgen/gen.py --update-aoti-c-shim` will automatically generate
# c_shim_aten.{h/cpp} based on the list below.
# Operators in this list are intended to be used in torch/csrc/stable/ops.h
# Unlike other c_shims, operators in this file do not bypass the dispatcher.
# The same BC rules apply as inductor_fallback_ops.
aten_shimified_ops: dict[str, dict[str, list[str]]] = {
"aten.fill_.Scalar": {},
"aten.pad.default": {},
"aten.narrow.default": {},
"aten.amax.default": {},
"aten.new_empty.default": {},
"aten.new_zeros.default": {},
"aten.full.default": {},
"aten.subtract.Tensor": {},
}