Repository: pytorch
Issue: Rollup: Top forward-over-reverse formulas
Labels: high priority,module: autograd,triaged,actionable,module: forward ad

These are the top operators by usage that do not support forward-over-reverse autograd. Supporting these requires writing the forward AD formula for the vjp of the operator. For example, to support forward-over-reverse for convolution, one needs to write the forward AD formula for `convolution_backward`.

_In order of priority_

P0
- [ ] nn.functional.batch_norm
- [ ] nn.functional.cross_entropy
- [ ] nn.functional.embedding
- [x] nn.functional.mse_loss
- [ ] nn.functional.softmax @zou3519 
- [x] nn.functional.leaky_relu https://github.com/pytorch/pytorch/pull/75294
- [ ] nn.functional.layer_norm
- [x] nn.functional.binary_cross_entropy
- [x] nn.functional.binary_cross_entropy_with_logits
- [ ] nn.functional.log_softmax @zou3519 
- [ ] nn.functional.nll_loss
- [x] nn.functional.l1_loss (https://github.com/pytorch/pytorch/pull/78257 makes it a composite operation)
- [ ] nn.functional.instance_norm

P1
- [x] nn.functional.prelu @nikitaved
- [x] nn.functional.elu https://github.com/pytorch/pytorch/pull/75297
- [x] nn.functional.smooth_l1_loss @nikitaved
- [x] nn.functional.hardswish @nikitaved 
- [x] nn.functional.softplus @nikitaved 
- [x] nn.functional.selu https://github.com/pytorch/pytorch/pull/75297
- [x] nn.functional.kl_div @nikitaved
- [x] fft https://github.com/pytorch/pytorch/pull/75326
- [ ] nn.functional.multi_head_attention_forward (needs OpInfo)
- [ ] nn.functional.dropout3d (needs OpInfo?)
- [ ] nn.functional.glu (https://github.com/pytorch/pytorch/pull/77309)
- [ ] nn.functional.margin_ranking_loss (needs OpInfo)
- [ ] nn.functional.pad (circular variant only)
- [ ] nn.functional.dropout (supports but skipped on CUDA) (@zou3519)
- [ ] nn.functional.dropout2d (supports but skipped for forward AD, why?)

<details>
<summary>
Expand for code to generate
</summary>

```python
# Top part copied from https://github.com/pytorch/functorch/blob/main/functorch/_src/top_operators_github_usage.py
# See bottom for code that generates the list

"""
From https://docs.google.com/spreadsheets/d/12R3nCOLskxPYjjiNkdqy4OdQ65eQp_htebXGODsjSeA/edit#gid=0
Try to keep this list in sync with that.
"""
top_torch = [
    ("t", 6837449),
    ("tensor", 585786),
    ("mode", 462182),
    ("cat", 394818),
    ("max", 368038),
    ("zeros", 329495),
    ("load", 327756),
    ("no_grad", 294694),
    ("save", 265130),
    ("from_numpy", 243063),
    ("manual_seed", 165044),
    ("ones", 153696),
    ("randn", 150796),
    ("stack", 133358),
    ("sum", 130772),
    ("arange", 98087),
    ("rand", 94715),
    ("mean", 88546),
    ("exp", 73883),
    ("zeros_like", 72831),
    ("min", 72248),
    ("sigmoid", 66798),
    ("log", 62135),
    ("matmul", 47811),
    ("clamp", 45304),
    ("sqrt", 44911),
    ("abs", 43535),
    ("tanh", 42793),
    ("empty", 40311),
    ("argmax", 38435),
    ("bmm", 33984),
    ("pow", 33571),
    ("norm", 31125),
    ("mm", 30995),
    ("is_tensor", 29546),
    ("ones_like", 29512),
    ("nonzero", 28681),
    ("full", 28373),
    ("unsqueeze", 27911),
    ("where", 26585),
    ("randperm", 26450),
    ("eye", 24342),
    ("mul", 23236),
    ("topk", 22537),
    ("as_tensor", 21967),
    ("sort", 21412),
    ("squeeze", 20863),
    ("randint", 20771),
    ("linspace", 20041),
    ("add", 19201),
    ("transpose", 18663),
    ("split", 18325),
    ("gather", 17904),
    ("set_grad_enabled", 16013),
    ("sin", 15669),
    ("cos", 15562),
    ("div", 15513),
    ("index_select", 14866),
    ("multinomial", 14331),
    ("flatten", 14267),
    ("isnan", 14170),
    ("randn_like", 13096),
    ("eq", 12680),
    ("einsum", 12480),
    ("round", 12367),
    ("floor", 11628),
    ("allclose", 11000),
    ("reshape", 10605),
    ("diag", 10167),
    ("chunk", 9581),
    ("std", 9379),
    ("set_default_tensor_type", 9281),
    ("triu", 8559),
    ("meshgrid", 8292),
    ("set_num_threads", 8126),
    ("unique", 7964),
    ("full_like", 7780),
    ("tril", 7538),
    ("dot", 7275),
    ("sign", 6943),
    ("equal", 6916),
    ("normal", 6750),
    ("cumsum", 6556),
    ("dist", 6058),
    ("isfinite", 6030),
    ("gt", 5935),
    ("set_printoptions", 5888),
    ("range", 5491),
    ("empty_like", 5351),
    ("flip", 5342),
    ("masked_select", 5341),
    ("bernoulli", 5262),
    ("atan", 5253),
    ("var", 5247),
    ("prod", 5200),
    ("erf", 5088),
    ("inverse", 5072),
    ("addmm", 4854),
    ("logsumexp", 4582),
    ("fft", 4436),
    ("lt", 4421),
    ("log2", 4316),
    ("enable_grad", 4238),
    ("rand_like", 4187),
    ("argsort", 3972),
    ("seed", 3932),
    ("mv", 3547),
    ("ger", 3309),
    ("ge", 3248),
    ("atan2", 3210),
    ("ceil", 3202),
    ("ne", 3075),
    ("bincount", 3063),
    ("acos", 3055),
    ("rsqrt", 3031),
    ("svd", 3029),
    ("numel", 3003),
    ("log1p", 2840),
    ("unbind", 2808),
    ("le", 2714),
    ("isinf", 2707),
    ("cross", 2646),
    ("set_default_dtype", 2536),
    ("argmin", 2535),
    ("sparse_coo_tensor", 2489),
    ("log10", 2304),
    ("kthvalue", 2192),
    ("set_rng_state", 2158),
    ("get_rng_state", 1996),
    ("get_default_dtype", 1879),
    ("det", 1868),
    ("qr", 1864),
    ("histc", 1852),
    ("symeig", 1832),
    ("trace", 1801),
    ("median", 1795),
    ("addcmul", 1751),
    ("remainder", 1717),
    ("baddbmm", 1693),
    ("lgamma", 1665),
    ("repeat_interleave", 1598),
    ("fmod", 1576),
    ("reciprocal", 1575),
    ("tan", 1560),
    ("initial_seed", 1532),
    ("take", 1529),
    ("stft", 1487),
    ("get_num_threads", 1477),
    ("real", 1459),
    ("cholesky", 1406),
    ("quantize_per_tensor", 1392),
    ("diag_embed", 1364),
    ("lerp", 1363),
    ("asin", 1345),
    ("eig", 1333),
    ("trunc", 1290),
    ("diagonal", 1287),
    ("cosh", 1279),
    ("rfft", 1269),
    ("cumprod", 1260),
    ("addr", 1211),
    ("roll", 1198),
    ("narrow", 1188),
    ("digamma", 1172),
    ("square", 1163),
    ("sinh", 1131),
    ("logspace", 1084),
    ("broadcast_tensors", 1070),
    ("irfft", 1013),
    ("frac", 997),
    ("hann_window", 994),
    ("solve", 989),
    ("logdet", 977),
    ("expm1", 968),
    ("cdist", 946),
    ("addmv", 903),
    ("randint_like", 888),
    ("tensordot", 888),
    ("ifft", 877),
    ("true_divide", 854),
    ("erfinv", 830),
    ("addcdiv", 819),
    ("addbmm", 813),
    ("renorm", 781),
    ("pinverse", 753),
    ("isclose", 740),
    ("erfc", 729),
    ("is_storage", 725),
    ("triangular_solve", 723),
    ("rot90", 709),
    ("logical_not", 686),
    ("geqrf", 681),
    ("slogdet", 677),
    ("lu", 665),
    ("hamming_window", 659),
    ("orgqr", 651),
    ("ormqr", 622),
    ("is_floating_point", 602),
    ("diagflat", 562),
    ("cholesky_solve", 559),
    ("tril_indices", 552),
    ("chain_matmul", 551),
    ("triu_indices", 548),
    ("angle", 522),
    ("poisson", 505),
    ("matrix_power", 485),
    ("unique_consecutive", 471),
    ("quantize_per_channel", 465),
    ("std_mean", 458),
    ("bartlett_window", 447),
    ("var_mean", 428),
    ("lstsq", 421),
    ("logical_and", 419),
    ("mvlgamma", 411),
    ("blackman_window", 400),
    ("bitwise_not", 395),
    ("cholesky_inverse", 388),
    ("as_strided", 384),
    ("floor_divide", 353),
    ("cartesian_prod", 321),
    ("lu_solve", 317),
    ("set_flush_denormal", 310),
    ("empty_strided", 283),
    ("logical_xor", 282),
    ("polygamma", 282),
    ("logical_or", 280),
    ("set_num_interop_threads", 278),
    ("combinations", 274),
    ("trapz", 270),
    ("matrix_rank", 260),
    ("lu_unpack", 255),
    ("result_type", 244),
    ("conj", 231),
    ("cummax", 230),
    ("lobpcg", 229),
    ("bitwise_xor", 217),
    ("promote_types", 213),
    ("get_num_interop_threads", 211),
    ("cummin", 205),
    ("bitwise_and", 198),
    ("dequantize", 192),
    ("bitwise_or", 191),
    ("imag", 191),
    ("can_cast", 184),
    ("istft", 180),
    ("compiled_with_cxx11_abi", 159),
    ("is_complex", 151),
    ("block_diag", 136),
    ("pca_lowrank", 124),
    ("absolute", 122),
    ("svd_lowrank", 108),
    ("neg", 2),
]

top_nn_functional = [
    ("nn.functional.softmax", 10522),
    ("nn.functional.relu", 8572),
    ("nn.functional.interpolate", 7277),
    ("nn.functional.pad", 5207),
    ("nn.functional.log_softmax", 4699),
    ("nn.functional.normalize", 2338),
    ("nn.functional.cross_entropy", 2083),
    ("nn.functional.grid_sample", 1970),
    ("nn.functional.one_hot", 1967),
    ("nn.functional.mse_loss", 1920),
    ("nn.functional.conv2d", 1593),
    ("nn.functional.dropout", 1516),
    ("nn.functional.softplus", 1385),
    ("nn.functional.sigmoid", 1128),
    ("nn.functional.linear", 1036),
    ("nn.functional.gelu", 930),
    ("nn.functional.avg_pool2d", 899),
    ("nn.functional.max_pool2d", 876),
    ("nn.functional.nll_loss", 863),
    ("nn.functional.embedding", 737),
    ("nn.functional.tanh", 664),
    ("nn.functional.leaky_relu", 640),
    ("nn.functional.adaptive_avg_pool2d", 633),
    ("nn.functional.cosine_similarity", 627),
    ("nn.functional.unfold", 609),
    ("nn.functional.conv1d", 596),
    ("nn.functional.binary_cross_entropy_with_logits", 591),
    ("nn.functional.l1_loss", 571),
    ("nn.functional.binary_cross_entropy", 492),
    ("nn.functional.elu", 416),
    ("nn.functional.batch_norm", 413),
    ("nn.functional.upsample", 413),
    ("nn.functional.fold", 305),
    ("nn.functional.affine_grid", 298),
    ("nn.functional.max_pool1d", 297),
    ("nn.functional.torch", 294),
    ("nn.functional.threshold", 263),
    ("nn.functional.smooth_l1_loss", 262),
    ("nn.functional.pairwise_distance", 253),
    ("nn.functional.logsigmoid", 243),
    ("nn.functional.adaptive_max_pool2d", 235),
    ("nn.functional.relu6", 213),
    ("nn.functional.pixel_shuffle", 209),
    ("nn.functional.avg_pool3d", 203),
    ("nn.functional.bilinear", 203),
    ("nn.functional.conv_transpose2d", 201),
    ("nn.functional.gumbel_softmax", 197),
    ("nn.functional.max_unpool2d", 196),
    ("nn.functional.kl_div", 191),
    ("nn.functional.hardtanh", 189),
    ("nn.functional.ctc_loss", 185),
    ("nn.functional.layer_norm", 178),
    ("nn.functional.conv3d", 172),
    ("nn.functional.max_unpool3d", 167),
    ("nn.functional.hardshrink", 165),
    ("nn.functional.hardswish", 156),
    ("nn.functional.selu", 156),
    ("nn.functional.glu", 155),
    ("nn.functional.assert_int_or_pair", 150),
    ("nn.functional.hardsigmoid", 146),
    ("nn.functional.upsample_bilinear", 146),
    ("nn.functional.max_pool3d", 140),
    ("nn.functional.adaptive_avg_pool3d", 139),
    ("nn.functional.instance_norm", 124),
    ("nn.functional.embedding_bag", 122),
    ("nn.functional.upsample_nearest", 110),
    ("nn.functional.avg_pool1d", 105),
    ("nn.functional.prelu", 102),
    ("nn.functional.celu", 92),
    ("nn.functional.dropout2d", 86),
    ("nn.functional.hinge_embedding_loss", 82),
    ("nn.functional.softsign", 81),
    ("nn.functional.max_unpool1d", 74),
    ("nn.functional.silu", 74),
    ("nn.functional.softshrink", 70),
    ("nn.functional.leaky_relu_", 68),
    ("nn.functional.softmin", 67),
    ("nn.functional.channel_shuffle", 66),
    ("nn.functional.multilabel_margin_loss", 66),
    ("nn.functional.dropout3d", 65),
    ("nn.functional.multi_margin_loss", 65),
    ("nn.functional.lp_pool2d", 64),
    ("nn.functional.conv_transpose1d", 62),
    ("nn.functional.triplet_margin_loss", 62),
    ("nn.functional.tanhshrink", 61),
    ("nn.functional.adaptive_max_pool1d", 59),
    ("nn.functional.cosine_embedding_loss", 58),
    ("nn.functional.multi_head_attention_forward", 58),
    ("nn.functional.max_pool1d_with_indices", 53),
    ("nn.functional.poisson_nll_loss", 53),
    ("nn.functional.margin_ranking_loss", 52),
    ("nn.functional.soft_margin_loss", 52),
    ("nn.functional.adaptive_max_pool3d", 51),
    ("nn.functional.group_norm", 51),
    ("nn.functional.local_response_norm", 51),
    ("nn.functional.multilabel_soft_margin_loss", 51),
    ("nn.functional.relu_", 50),
    ("nn.functional.alpha_dropout", 49),
    ("nn.functional.feature_alpha_dropout", 49),
    ("nn.functional.lp_pool1d", 49),
    ("nn.functional.adaptive_max_pool1d_with_indices", 48),
    ("nn.functional.adaptive_max_pool2d_with_indices", 48),
    ("nn.functional.adaptive_max_pool3d_with_indices", 48),
    ("nn.functional.fractional_max_pool2d", 48),
    ("nn.functional.fractional_max_pool2d_with_indices", 48),
    ("nn.functional.fractional_max_pool3d", 48),
    ("nn.functional.fractional_max_pool3d_with_indices", 48),
    ("nn.functional.max_pool2d_with_indices", 48),
    ("nn.functional.max_pool3d_with_indices", 48),
    ("nn.functional.handle_torch_function", 47),
    ("nn.functional.has_torch_function", 47),
    ("nn.functional.adaptive_avg_pool1d", 43),
    ("nn.functional.pdist", 43),
    ("nn.functional.rrelu_", 37),
    ("nn.functional.elu_", 34),
    ("nn.functional.boolean_dispatch", 33),
    ("nn.functional.hardtanh_", 26),
    ("nn.functional.triplet_margin_with_distance_loss", 23),
    ("nn.functional.selu_", 20),
    ("nn.functional.pixel_unshuffle", 19),
    ("nn.functional.conv_transpose3d", 18),
    ("nn.functional.gaussian_nll_loss", 15),
    ("nn.functional.has_torch_function_unary", 15),
    ("nn.functional.has_torch_function_variadic", 15),
    ("nn.functional.celu_", 13),
    ("nn.functional.huber_loss", 7),
    ("nn.functional.mish", 4),
    ("nn.functional.threshold_", 3),
    ("nn.functional.grad", 2),
    ("nn.functional.conv_tbc", 1),
    ("nn.functional.math", 1),
]

top_nn_module = [
    ("nn.Module", 927129, None),
    ("nn.Linear", 530688, "nn.functional.linear"),
    ("nn.Sequential", 384968, None),
    ("nn.Conv2d", 383320, "nn.functional.conv2d"),
    ("nn.ReLU", 318877, "nn.functional.relu"),
    ("nn.BatchNorm2d", 233265, "nn.functional.batch_norm"),
    ("nn.Dropout", 179268, "nn.functional.dropout"),
    ("nn.ModuleList", 171225, None),
    ("nn.Parameter", 153291, None),
    ("nn.CrossEntropyLoss", 152696, "nn.functional.cross_entropy"),
    ("nn.MaxPool2d", 138619, "nn.functional.max_pool2d"),
    ("nn.Embedding", 111844, "nn.functional.embedding"),
    ("nn.DataParallel", 104238, None),
    ("nn.MSELoss", 82954, "nn.functional.mse_loss"),
    ("nn.Sigmoid", 75810, "nn.functional.sigmoid"),
    ("nn.LeakyReLU", 65632, "nn.functional.leaky_relu"),
    ("nn.BatchNorm1d", 65374, "nn.functional.batch_norm"),
    ("nn.Softmax", 65114, "nn.functional.softmax"),
    ("nn.Tanh", 59445, "nn.functional.tanh"),
    ("nn.AdaptiveAvgPool2d", 59071, "nn.functional.adaptive_avg_pool2d"),
    ("nn.AvgPool2d", 58377, "nn.functional.avg_pool2d"),
    ("nn.ConvTranspose2d", 57524, "nn.functional.conv_transpose2d"),
    ("nn.LSTM", 57411, None),
    ("nn.Conv1d", 41108, "nn.functional.conv1d"),
    ("nn.LayerNorm", 36089, "nn.functional.layer_norm"),
    ("nn.BCELoss", 34005, "nn.functional.binary_cross_entropy"),
    ("nn.Upsample", 32527, "nn.functional.interpolate"),
    ("nn.BCEWithLogitsLoss", 29944, "nn.functional.binary_cross_entropy_with_logits"),
    ("nn.GRU", 25421, None),
    ("nn.Dropout2d", 23512, "nn.functional.dropout2d"),
    ("nn.LogSoftmax", 22897, "nn.functional.log_softmax"),
    ("nn.L1Loss", 22778, "nn.functional.l1_loss"),
    ("nn.GroupNorm", 22183, "nn.functional.group_norm"),
    ("nn.NLLLoss", 21751, "nn.functional.nll_loss"),
    ("nn.Conv3d", 20874, "nn.functional.conv3d"),
    ("nn.Identity", 17911, None),
    ("nn.InstanceNorm2d", 16426, "nn.functional.instance_norm"),
    ("nn.BatchNorm3d", 16378, "nn.functional.batch_norm"),
    ("nn.PReLU", 13472, "nn.functional.prelu"),
    ("nn.ReLU6", 12622, "nn.functional.relu6"),
    ("nn.ELU", 12508, "nn.functional.elu"),
    ("nn.LSTMCell", 10885, None),
    ("nn.Flatten", 10384, "torch.flatten"),
    ("nn.ModuleDict", 10255, None),
    ("nn.ReflectionPad2d", 9954, "nn.functional.pad"),
    ("nn.MaxPool3d", 9526, "nn.functional.max_pool3d"),
    ("nn.MaxPool1d", 9154, "nn.functional.max_pool1d"),
    ("nn.RNN", 9154, None),
    ("nn.ZeroPad2d", 8847, "nn.functional.pad"),
    ("nn.ParameterList", 7702, None),
    ("nn.SyncBatchNorm", 6814, None),
    ("nn.PixelShuffle", 6571, "nn.functional.pixel_shuffle"),
    ("nn.SmoothL1Loss", 6517, "nn.functional.smooth_l1_loss"),
    ("nn.Hardswish", 6458, "nn.functional.hardswish"),
    ("nn.AdaptiveMaxPool2d", 6071, "nn.functional.adaptive_max_pool2d"),
    ("nn.SELU", 6043, "nn.functional.selu"),
    ("nn.ConvTranspose3d", 6039, "nn.functional.conv_transpose3d"),
    ("nn.GRUCell", 5840, None),
    ("nn.ReplicationPad2d", 5600, "nn.functional.pad"),
    ("nn.KLDivLoss", 5541, "nn.functional.kl_div"),
    ("nn.ConvTranspose1d", 5183, "nn.functional.conv_transpose1d"),
    ("nn.Softplus", 5120, "nn.functional.softplus"),
    ("nn.SiLU", 4895, "nn.functional.silu"),
    ("nn.AvgPool3d", 4523, "nn.functional.avg_pool3d"),
    ("nn.CosineSimilarity", 4058, "nn.functional.cosine_similarity"),
    ("nn.GELU", 3932, "nn.functional.gelu"),
    ("nn.UpsamplingBilinear2d", 3673, "nn.functional.interpolate"),
    ("nn.InstanceNorm1d", 3658, "nn.functional.instance_norm"),
    ("nn.Transformer", 3604, None),
    ("nn.MultiheadAttention", 3435, "nn.functional.multi_head_attention_forward"),
    ("nn.AvgPool1d", 3195, "nn.functional.avg_pool1d"),
    ("nn.Dropout3d", 2964, "nn.functional.dropout3d"),
    ("nn.AdaptiveAvgPool3d", 2915, "nn.functional.adaptive_avg_pool3d"),
    ("nn.InstanceNorm3d", 2893, "nn.functional.instance_norm"),
    ("nn.Hardtanh", 2613, "nn.functional.hardtanh"),
    ("nn.MarginRankingLoss", 2568, "nn.functional.margin_ranking_loss"),
    ("nn.GLU", 2526, "nn.functional.glu"),
    ("nn.AdaptiveAvgPool1d", 2481, "nn.functional.adaptive_avg_pool1d"),
    ("nn.EmbeddingBag", 2344, "nn.functional.embedding_bag"),
    ("nn.TransformerEncoderLayer", 2292, None),
    ("nn.TransformerEncoder", 2091, None),
    ("nn.MaxUnpool2d", 2031, "nn.functional.max_unpool2d"),
    ("nn.UpsamplingNearest2d", 2004, "nn.functional.interpolate"),
    ("nn.ConstantPad1d", 1904, "nn.functional.pad"),
    ("nn.ConstantPad2d", 1791, "nn.functional.pad"),
    ("nn.CTCLoss", 1789, "nn.functional.ctc_loss"),
    ("nn.AdaptiveMaxPool1d", 1713, "nn.functional.adaptive_max_pool1d"),
    ("nn.AdaptiveLogSoftmaxWithLoss", 1665, None),
    ("nn.Bilinear", 1664, "nn.functional.bilinear"),
    ("nn.RNNCell", 1653, None),
    ("nn.MultiLabelSoftMarginLoss", 1624, "nn.functional.multilabel_soft_margin_loss"),
    ("nn.Unfold", 1452, "nn.functional.unfold"),
    ("nn.RReLU", 1431, "nn.functional.rrelu"),
    ("nn.CosineEmbeddingLoss", 1357, "nn.functional.cosine_embedding_loss"),
    ("nn.LocalResponseNorm", 1331, "nn.functional.local_response_norm"),
    ("nn.Softmax2d", 1300, "nn.functional.softmax"),
    ("nn.PairwiseDistance", 1241, "nn.functional.pairwise_distance"),
    ("nn.LogSigmoid", 1235, "nn.functional.logsigmoid"),
    ("nn.TripletMarginLoss", 1230, "nn.functional.triplet_margin_loss"),
    ("nn.RNNBase", 1133, None),
    ("nn.Threshold", 1043, "nn.functional.threshold"),
    ("nn.AdaptiveMaxPool3d", 1025, "nn.functional.adaptive_max_pool3d"),
    ("nn.CELU", 1018, "nn.functional.celu"),
    ("nn.NLLLoss2d", 966, "nn.functional.nll_loss"),
    ("nn.Softsign", 877, "nn.functional.softsign"),
    ("nn.ReplicationPad1d", 862, "nn.functional.pad"),
    ("nn.SoftMarginLoss", 856, "nn.functional.soft_margin_loss"),
    ("nn.ParameterDict", 742, None),
    ("nn.ReflectionPad1d", 731, "nn.functional.pad"),
    ("nn.Softshrink", 713, "nn.functional.softshrink"),
    ("nn.AlphaDropout", 710, "nn.functional.alpha_dropout"),
    ("nn.Tanhshrink", 681, "nn.functional.tanhshrink"),
    ("nn.PoissonNLLLoss", 676, "nn.functional.poisson_nll_loss"),
    ("nn.MaxUnpool3d", 660, "nn.functional.max_unpool3d"),
    ("nn.Fold", 630, "nn.functional.fold"),
    ("nn.MultiMarginLoss", 622, "nn.functional.multi_margin_loss"),
    ("nn.TransformerDecoderLayer", 614, None),
    ("nn.TransformerDecoder", 607, None),
    ("nn.Hardshrink", 592, "nn.functional.hardshrink"),
    ("nn.ConstantPad3d", 582, "nn.functional.pad"),
    ("nn.MultiLabelMarginLoss", 580, "nn.functional.multilabel_margin_loss"),
    ("nn.LPPool2d", 550, "nn.functional.lp_pool2d"),
    ("nn.Softmin", 537, "nn.functional.softmin"),
    ("nn.MaxUnpool1d", 518, "nn.functional.max_unpool1d"),
    ("nn.FractionalMaxPool2d", 484, "nn.functional.fractional_max_pool2d"),
    ("nn.Hardsigmoid", 477, "nn.functional.hardsigmoid"),
    ("nn.ReplicationPad3d", 470, "nn.functional.pad"),
    ("nn.HingeEmbeddingLoss", 442, "nn.functional.hinge_embedding_loss"),
    ("nn.LPPool1d", 386, "nn.functional.lp_pool1d"),
    ("nn.FractionalMaxPool3d", 252, "nn.functional.fractional_max_pool3d"),
    ("nn.Container", 217, None),
    ("nn.Unflatten", 206, "nn.functional.unflatten"),
    ("nn.FeatureAlphaDropout", 136, "nn.functional.feature_alpha_dropout"),
    ("nn.TripletMarginWithDistanceLoss", 107, "nn.functional.triplet_margin_with_distance_loss"),
    ("nn.ChannelShuffle", 90, "nn.functional.channel_shuffle"),
    ("nn.RNNCellBase", 88, None),
    ("nn.LazyLinear", 81, "nn.functional.linear"),
    ("nn.UninitializedParameter", 60, None),
    ("nn.CrossMapLRN2d", 59, None),
    ("nn.GaussianNLLLoss", 55, "nn.functional.gaussian_nll_loss"),
    ("nn.PixelUnshuffle", 45, "nn.functional.pixel_unshuffle"),
    ("nn.Mish", 31, "nn.functional.mish"),
    ("nn.ReflectionPad3d", 22, "nn.functional.pad"),
    ("nn.HuberLoss", 18, "nn.functional.huber_loss"),
    ("nn.LazyConv2d", 15, None),
    ("nn.LazyConv1d", 9, None),
    ("nn.LazyConv3d", 8, None),
    ("nn.LazyConvTranspose1d", 8, None),
    ("nn.LazyConvTranspose2d", 8, None),
    ("nn.LazyConvTranspose3d", 8, None),
    ("nn.LazyBatchNorm1d", 3, None),
    ("nn.LazyBatchNorm2d", 3, None),
    ("nn.LazyBatchNorm3d", 3, None),
    ("nn.UninitializedBuffer", 3, None),
]

# No rankings because these are a little hard to get rankings for
method_only_ops = [
    'bfloat16',
    'bool',
    'byte',
    'char',
    'contiguous',
    'cpu',
    'cuda',
    'detach',
    'double',
    'expand',
    'expand_as',
    'float',
    'get_device',
    'half',
    'hardshrink',
    'index_add',
    'index_copy',
    'index_fill',
    'index_put',
    'int',
    'is_contiguous',
    'is_pinned',
    'is_set_to',
    'is_shared',
    'is_signed',
    'item',
    'long',
    'masked_scatter',
    'masked_fill',
    'narrow_copy',
    'numpy',
    'pin_memory',
    'repeat',
    'reshape_as',
    'select',
    'short',
    'storage_offset',
    'sum_to_size',
    'to',
    'to_mkldnn',
    'tolist',
    'type',
    'type_as',
    'unfold',
    'view',
    'view_as',
]


def get_nn_functional_top_list():
    top_nn_functional_ = {k: v for k, v in top_nn_functional}
    for _, count, functional_name in top_nn_module:
        if functional_name is None:
            continue
        if functional_name == 'torch.flatten':
            continue
        if functional_name not in top_nn_functional_:
            top_nn_functional_[functional_name] = count
        else:
            top_nn_functional_[functional_name] += count

    top_nn_functional_ = [(k, v) for k, v in top_nn_functional_.items()]
    top_nn_functional_.sort(key=lambda x: x[1], reverse=True)
    return top_nn_functional_


usage_count = {}
for k, v in get_nn_functional_top_list():
    usage_count[k] = v
for k, v in top_torch:
    usage_count[k] = v

##########################################################

import torch
from torch.testing._internal.common_methods_invocations import op_db

do_not_req_gradients = {
    # Ops that don't require gradients
    "tensor",
    "zeros",
    "load",
    "no_grad",
    "save",
    "from_numpy",
    "manual_seed",
    "ones",
    "randn",
    "arange",
    "rand",
    "zeros_like",
    "empty",
    "is_tensor",
    "ones_like",
    "nonzero",
    "full",
    "randperm",
    "eye",
    "as_tensor",
    "randint",
    "linspace",
    "set_grad_enabled",
    "multinomial",
    "isnan",
    "randn_like",
    "eq",
    "allclose",
    "unique",
    "full_like",
    "equal",
    "normal",
    "set_default_tensor_type",
    "set_num_threads",
    "argmax",  # not differentiable
    "isfinite",
    "gt",
    "set_printoptions",
    "range",
    "empty_like",
    "bernoulli",
    "lt",
    "enable_grad",
    "rand_like",
    "argsort",
    "bincount",
    "seed",
    "ge",
    "ne",
    "numel",
    "isinf",
    "le",
    "set_default_dtype",
    "argmin",
}

no_opinfo_but_actually_have_formula = {
    # Some have no OpInfo but are actualy implemented:
    "nn.functional.conv3d",
    "unbind",
}

fwgrad_bwgrad_implemented = set()
for op in op_db:
    if op.supports_fwgrad_bwgrad:
        fwgrad_bwgrad_implemented.add(str(op.name))
        for alias in op.aliases:
            fwgrad_bwgrad_implemented.add(alias.name)

# Get top 125 operators across torch.* and torch.nn.functional.*
sorted_all = sorted([(name, count) for (name, count) in usage_count.items()], key=lambda x: x[1])[-125 - len(do_not_req_gradients):]

# Filter for implemented ones
sorted_all = list(filter(lambda x: x[0] not in fwgrad_bwgrad_implemented, sorted_all))
sorted_all = list(filter(lambda x: x[0] not in do_not_req_gradients.union(no_opinfo_but_actually_have_formula), sorted_all))

for name, count in reversed(sorted_all):
    print(f"- [ ] {name}")

```

</details>
In addition to the ones generated by the code above, several items were added because they technically have `supports_fwgrad_bwgrad=True` but are actually skipped for forward AD and/or forwrad-over-reverse AD.

cc @ezyang @gchanan @zou3519 @albanD @gqchen @pearu @nikitaved @soulitzer @Lezcano @Varal7