- backward_op : add_double_grad forward : add_grad (Tensor x, Tensor y, Tensor grad_out, int axis = -1) -> Tensor(grad_x), Tensor(grad_y) args : (Tensor y, Tensor grad_out, Tensor grad_x_grad, Tensor grad_y_grad, int axis = -1) output : Tensor(grad_out_grad) infer_meta : func : UnchangedInferMeta param : [grad_out] kernel : func : add_double_grad optional : grad_x_grad, grad_y_grad backward : add_triple_grad inplace : (grad_x_grad -> grad_out_grad) composite : add_double_grad(y, grad_out, grad_x_grad, grad_y_grad, axis, grad_out_grad) - backward_op : add_grad forward : add (Tensor x, Tensor y) -> Tensor(out) args : (Tensor x, Tensor y, Tensor out_grad, int axis = -1) output : Tensor(x_grad), Tensor(y_grad) infer_meta : func : GeneralBinaryGradInferMeta param : [x, y] spmd_rule : ElementwiseBinaryGradInferSpmd kernel : func : add_grad no_need_buffer : x, y composite : add_grad(x, y, out_grad, axis, x_grad, y_grad) backward : add_double_grad inplace : (out_grad -> x_grad) - backward_op : add_triple_grad forward : add_double_grad (Tensor y, Tensor grad_out, Tensor grad_grad_x, Tensor grad_grad_y, int axis = -1) -> Tensor(grad_grad_out) args : (Tensor grad_grad_x, Tensor grad_grad_y, Tensor grad_grad_out_grad, int axis = -1) output : Tensor(grad_grad_x_grad), Tensor(grad_grad_y_grad) infer_meta : func : GeneralBinaryGradInferMeta param : [grad_grad_x, grad_grad_y] kernel : func : add_triple_grad inplace : (grad_grad_out_grad -> grad_grad_x_grad) composite : add_triple_grad (grad_grad_x, grad_grad_y, grad_grad_out_grad, axis, grad_grad_x_grad, grad_grad_y_grad ) - backward_op : assign_grad forward : assign (Tensor x) -> Tensor(out) args : (Tensor out_grad) output : Tensor(x_grad) composite: assign_grad(out_grad, x_grad) invoke : assign(out_grad) - backward_op : assign_out__grad forward : assign_out_ (Tensor x, Tensor output) -> Tensor(out) args : (Tensor out_grad) output : Tensor(x_grad) infer_meta : func : UnchangedInferMeta kernel : func : assign inplace : (out_grad -> x_grad) - backward_op : batch_norm_double_grad forward : batch_norm_grad (Tensor x, Tensor scale, Tensor bias, Tensor mean_out, Tensor variance_out, Tensor saved_mean, Tensor saved_variance, Tensor reserve_space, Tensor grad_out, float momentum, float epsilon, str data_format, bool is_test, bool use_global_stats, bool trainable_statistics) -> Tensor(grad_x), Tensor(grad_scale), Tensor(grad_bias) args : (Tensor x, Tensor scale, Tensor mean_out, Tensor variance_out, Tensor saved_mean, Tensor saved_variance, Tensor grad_out, Tensor grad_x_grad, Tensor grad_scale_grad, Tensor grad_bias_grad, float momentum, float epsilon, str data_format, bool is_test, bool use_global_stats, bool trainable_statistics) output : Tensor(x_grad), Tensor(scale_grad), Tensor(grad_out_grad) infer_meta : func : GeneralTernaryGradInferMeta param : [x, scale, x] kernel : func : batch_norm_double_grad data_type : x optional : scale, mean_out, variance_out, grad_x_grad, grad_scale_grad, grad_bias_grad inplace : (grad_out -> grad_out_grad) - backward_op : batch_norm_grad forward : batch_norm (Tensor x, Tensor mean, Tensor variance, Tensor scale, Tensor bias, bool is_test, float momentum, float epsilon, str data_format, bool use_global_stats, bool trainable_statistics) -> Tensor(out), Tensor(mean_out), Tensor(variance_out), Tensor(saved_mean), Tensor(saved_variance), Tensor(reserve_space) args : (Tensor x, Tensor scale, Tensor bias, Tensor mean_out, Tensor variance_out, Tensor saved_mean, Tensor saved_variance, Tensor reserve_space, Tensor out_grad, float momentum, float epsilon, str data_format, bool is_test, bool use_global_stats, bool trainable_statistics) output : Tensor(x_grad), Tensor(scale_grad), Tensor(bias_grad) infer_meta : func : GeneralTernaryGradInferMeta param : [x, scale, bias] spmd_rule : BatchNormGradInferSpmd kernel : func : batch_norm_grad data_type : out_grad optional : scale, bias, mean_out, variance_out, reserve_space composite: batch_norm_grad(x, scale, bias, mean_out, variance_out, saved_mean, saved_variance, reserve_space, out_grad, momentum, epsilon, data_format, is_test, use_global_stats, trainable_statistics) backward : batch_norm_double_grad - backward_op : c_embedding_grad forward : c_embedding (Tensor weight, Tensor x, int64_t start_index=0, int64_t vocab_size=-1) -> Tensor(out) args : (Tensor weight, Tensor x, Tensor out_grad, int64_t start_index=0) output : Tensor(weight_grad) infer_meta : func : EmbeddingGradInferMeta param : [x, weight] kernel : func : c_embedding_grad no_need_buffer : weight - backward_op : div_scale_grad forward : div_scale (Tensor x, Scalar scale) -> Tensor(out) args : (Tensor out_grad, Scalar scale=1.0) output : Tensor(x_grad) invoke : div_scale(out_grad, scale) - backward_op : divide_double_grad forward : divide_grad (Tensor x, Tensor y, Tensor out, Tensor grad_out, int axis = -1) -> Tensor(grad_x), Tensor(grad_y) args : (Tensor y, Tensor out, Tensor grad_out, Tensor grad_x, Tensor grad_x_grad, Tensor grad_y_grad, int axis = -1) output : Tensor(y_grad), Tensor(out_grad), Tensor(grad_out_grad) infer_meta : func : GeneralTernaryGradInferMeta param : [y, out, out] kernel : func : divide_double_grad data_type : out optional : grad_x, grad_x_grad, grad_y_grad inplace : (grad_x_grad -> grad_out_grad) - backward_op : divide_grad forward : divide (Tensor x, Tensor y) -> Tensor(out) args : (Tensor x, Tensor y, Tensor out, Tensor out_grad, int axis = -1) output : Tensor(x_grad), Tensor(y_grad) infer_meta : func : GeneralBinaryGradInferMeta param : [x, y] spmd_rule : ElementwiseBinaryGradInferSpmd kernel : func : divide_grad composite : divide_grad(x, y, out, out_grad, axis, x_grad, y_grad) backward : divide_double_grad - backward_op : einsum_grad forward : einsum (Tensor[] x, str equation) -> Tensor(out), Tensor[](inner_cache), Tensor[](x_shape) args : (Tensor[] x_shape, Tensor[] inner_cache, Tensor out_grad, str equation) output : Tensor[](x_grad){x_shape.size()} infer_meta : func : UnchangedMultiInferMeta param : [x_shape] spmd_rule : EinsumGradInferSpmd kernel : func : einsum_grad - backward_op : elementwise_pow_grad forward : elementwise_pow(Tensor x, Tensor y) -> Tensor(out) args : (Tensor x, Tensor y, Tensor out_grad) output : Tensor(x_grad), Tensor(y_grad) infer_meta : func : GeneralBinaryGradInferMeta param: [x, y] spmd_rule : ElementwiseBinaryGradInferSpmd composite : elementwise_pow_grad(x, y, out_grad, x_grad, y_grad) kernel : func : elementwise_pow_grad - backward_op : embedding_grad forward : embedding (Tensor x, Tensor weight, int64_t padding_idx=-1, bool sparse=false) -> Tensor(out) args : (Tensor x, Tensor weight, Tensor out_grad, int64_t padding_idx=-1, bool sparse=false) output : Tensor(weight_grad) invoke : embedding_grad_impl(x, weight, out_grad, padding_idx, sparse, weight_grad) no_need_buffer : weight - backward_op : exponential__grad forward : exponential_ (Tensor x, float lam) -> Tensor(out) args : (Tensor out_grad) output : Tensor(x_grad) infer_meta : func : UnchangedInferMeta invoke : zeros_like(out_grad) - backward_op : hardswish_grad forward : hardswish (Tensor x) -> Tensor(out) args : (Tensor x, Tensor out_grad) output : Tensor(x_grad) infer_meta : func : UnchangedInferMeta param : [x] kernel : func : hardswish_grad inplace : (out_grad -> x_grad) - backward_op : matmul_double_grad forward : matmul_grad (Tensor x, Tensor y, Tensor grad_out, bool transpose_x=false, bool transpose_y=false) -> Tensor(grad_x), Tensor(grad_y) args : (Tensor x, Tensor y, Tensor grad_out, Tensor grad_x_grad, Tensor grad_y_grad, bool transpose_x=false, bool transpose_y=false) output : Tensor(x_grad), Tensor(y_grad), Tensor(grad_out_grad) infer_meta : func : GeneralTernaryGradInferMeta param : [x, y, grad_out] kernel : func : matmul_double_grad composite : matmul_double_grad(x, y, grad_out, grad_x_grad, grad_y_grad, transpose_x=false, transpose_y=false) optional : grad_x_grad, grad_y_grad - backward_op : matmul_grad forward : matmul (Tensor x, Tensor y, bool transpose_x=false, bool transpose_y=false) -> Tensor(out) args : (Tensor x, Tensor y, Tensor out_grad, bool transpose_x=false, bool transpose_y=false) output : Tensor(x_grad), Tensor(y_grad) infer_meta : func : GeneralBinaryGradInferMeta param : [x, y] spmd_rule : MatmulGradInferSpmd kernel : func : matmul_grad backward : matmul_double_grad - backward_op : maximum_grad forward : maximum(Tensor x, Tensor y) -> Tensor(out) args : (Tensor x, Tensor y, Tensor out_grad) output : Tensor(x_grad), Tensor(y_grad) infer_meta : func : GeneralBinaryGradInferMeta param: [x, y] spmd_rule: ElementwiseBinaryGradInferSpmd kernel : func : maximum_grad composite : maximum_grad(x, y, out_grad, x_grad, y_grad) backward : maximum_double_grad - backward_op : min_grad forward: min (Tensor x, IntArray axis={}, bool keepdim=false) -> Tensor(out) args : (Tensor x, Tensor out, Tensor out_grad, IntArray axis={}, bool keepdim=false, bool reduce_all=false) output : Tensor(x_grad) infer_meta : func : UnchangedInferMeta param: [x] spmd_rule : ReductionGradInferSpmd kernel : func : min_grad composite : min_grad(x, out, out_grad, axis, keepdim, reduce_all, x_grad) - backward_op : minimum_grad forward : minimum(Tensor x, Tensor y) -> Tensor(out) args : (Tensor x, Tensor y, Tensor out_grad) output : Tensor(x_grad), Tensor(y_grad) infer_meta : func : GeneralBinaryGradInferMeta param: [x, y] kernel : func : minimum_grad composite : minimum_grad(x, y, out_grad, axis, x_grad, y_grad) backward : minimum_double_grad - backward_op : multiply_double_grad forward : multiply_grad (Tensor x, Tensor y, Tensor grad_out, int axis = -1) -> Tensor(grad_x), Tensor(grad_y) args : (Tensor x, Tensor y, Tensor grad_out, Tensor grad_x_grad, Tensor grad_y_grad, int axis = -1) output : Tensor(x_grad), Tensor(y_grad), Tensor(grad_out_grad) infer_meta : func : GeneralTernaryGradInferMeta param : [x, y, grad_out] kernel : func : multiply_double_grad optional : grad_x_grad, grad_y_grad inplace : (grad_x_grad -> grad_out_grad) backward : multiply_triple_grad composite : multiply_double_grad(x, y, grad_out, grad_x_grad, grad_y_grad, axis, x_grad, y_grad, grad_out_grad) - backward_op : multiply_grad forward : multiply (Tensor x, Tensor y) -> Tensor(out) args : (Tensor x, Tensor y, Tensor out_grad, int axis = -1) output : Tensor(x_grad), Tensor(y_grad) infer_meta : func : GeneralBinaryGradInferMeta param : [x, y] spmd_rule : ElementwiseBinaryGradInferSpmd kernel : func : multiply_grad composite: multiply_grad(x, y, out_grad, axis, x_grad, y_grad) backward : multiply_double_grad - backward_op : multiply_triple_grad forward : multiply_double_grad (Tensor x, Tensor y, Tensor fwd_grad_out, Tensor fwd_grad_grad_x, Tensor fwd_grad_grad_y, int axis = -1) -> Tensor(grad_x), Tensor(grad_y), Tensor(grad_grad_out) args : (Tensor x, Tensor y, Tensor fwd_grad_out, Tensor fwd_grad_grad_x, Tensor fwd_grad_grad_y, Tensor grad_x_grad, Tensor grad_y_grad, Tensor grad_grad_out_grad, int axis = -1) output : Tensor(x_grad), Tensor(y_grad), Tensor(fwd_grad_out_grad), Tensor(fwd_grad_grad_x_grad), Tensor(fwd_grad_grad_y_grad) infer_meta : func : GeneralQuinaryGradInferMeta param : [x, y, fwd_grad_out, fwd_grad_grad_x, fwd_grad_grad_y] kernel : func : multiply_triple_grad optional : fwd_grad_grad_x, fwd_grad_grad_y, grad_x_grad, grad_y_grad, grad_grad_out_grad - backward_op : remainder_grad forward : remainder (Tensor x, Tensor y) -> Tensor(out) args : (Tensor x, Tensor y, Tensor out_grad) output : Tensor(x_grad), Tensor(y_grad) infer_meta : func : GeneralBinaryGradInferMeta param : [x, y] kernel : func : remainder_grad - backward_op : set_value_grad forward : set_value (Tensor x, IntArray starts, IntArray ends, IntArray steps, int64_t[] axes, int64_t[] decrease_axes, int64_t[] none_axes, int64_t[] shape, Scalar[] values) -> Tensor(out) args : (Tensor out_grad, IntArray starts, IntArray ends, IntArray steps, int64_t[] axes, int64_t[] decrease_axes, int64_t[] none_axes) output : Tensor(x_grad) infer_meta: func: UnchangedInferMeta param: [out_grad] kernel: func: set_value_with_scalar_grad param: [out_grad, starts, ends, steps, axes, decrease_axes, none_axes] - backward_op : softmax_grad forward : softmax (Tensor x, int axis) -> Tensor(out) args : (Tensor out, Tensor out_grad, int axis) output : Tensor(x_grad) infer_meta : func : UnchangedInferMeta param : [out] spmd_rule : SoftmaxGradInferSpmd kernel : func : softmax_grad composite : softmax_grad(out, out_grad, axis, x_grad) - backward_op : subtract_double_grad forward : subtract_grad (Tensor x, Tensor y, Tensor grad_out, int axis = -1) -> Tensor(grad_x), Tensor(grad_y) args : (Tensor y, Tensor grad_out, Tensor grad_x_grad, Tensor grad_y_grad, int axis = -1) output : Tensor(grad_out_grad) infer_meta : func : UnchangedInferMeta param : [grad_out] kernel : func : subtract_double_grad optional : grad_x_grad, grad_y_grad no_need_buffer : y, grad_out inplace : (grad_x_grad -> grad_out_grad) composite : subtract_double_grad(y, grad_out, grad_x_grad, grad_y_grad, axis, grad_out_grad) - backward_op : subtract_grad forward : subtract (Tensor x, Tensor y) -> Tensor(out) args : (Tensor x, Tensor y, Tensor out_grad, int axis = -1) output : Tensor(x_grad), Tensor(y_grad) infer_meta : func : GeneralBinaryGradInferMeta param : [x, y] spmd_rule : ElementwiseBinaryGradInferSpmd kernel : func : subtract_grad no_need_buffer : x, y composite : subtract_grad(x, y, out_grad, axis, x_grad, y_grad) backward : subtract_double_grad inplace : (out_grad -> x_grad) - backward_op : tensor_unfold_grad forward : tensor_unfold (Tensor input, int64_t axis, int64_t size, int64_t step) -> Tensor(out) args : (Tensor input, Tensor out_grad, int64_t axis, int64_t size, int64_t step) output : Tensor(input_grad) infer_meta : func : StridedUnChangedInferMeta param : [input] kernel : func : tensor_unfold_grad - backward_op : tile_double_grad forward : tile_grad (Tensor x, Tensor grad_out, IntArray repeat_times) -> Tensor(grad_x) args : (Tensor grad_x_grad, IntArray repeat_times) output : Tensor(grad_out_grad) invoke : tile(grad_x_grad, repeat_times) - backward_op : tile_grad forward : tile (Tensor x, IntArray repeat_times) -> Tensor(out) args : (Tensor x, Tensor out_grad, IntArray repeat_times) output : Tensor(x_grad) infer_meta : func : UnchangedInferMeta param : [x] spmd_rule : TileGradInferSpmdDynamic kernel : func : tile_grad no_need_buffer : x composite : tile_grad(x, out_grad, repeat_times, x_grad) backward : tile_double_grad - backward_op: fused_gemm_epilogue_grad forward : fused_gemm_epilogue(Tensor x, Tensor y, Tensor bias, bool trans_x, bool trans_y, str activation) -> Tensor(out), Tensor(reserve_space) args : (Tensor x, Tensor y, Tensor reserve_space, Tensor out_grad, bool trans_x, bool trans_y, str activation) output : Tensor(x_grad), Tensor(y_grad), Tensor(bias_grad) infer_meta : func : FusedGemmEpilogueGradInferMeta kernel: func : fused_gemm_epilogue_grad optional : reserve_space - backward_op: maximum_double_grad forward: maximum_grad(Tensor x, Tensor y, Tensor grad_out) -> Tensor(grad_x), Tensor(grad_y) args: (Tensor x, Tensor y, Tensor grad_x_grad, Tensor grad_y_grad) output: Tensor(grad_out_grad) composite: maximum_double_grad(x, y, grad_x_grad, grad_y_grad, grad_out_grad) optional : grad_x_grad, grad_y_grad - backward_op: minimum_double_grad forward: minimum_grad(Tensor x, Tensor y, Tensor grad_out) -> Tensor(grad_x), Tensor(grad_y) args: (Tensor x, Tensor y, Tensor grad_x_grad, Tensor grad_y_grad) output: Tensor(grad_out_grad) composite: minimum_double_grad(x, y, grad_x_grad, grad_y_grad, grad_out_grad) optional : grad_x_grad, grad_y_grad