code: def forward(ctx, kwarg_names, _, *expanded_args_and_kwargs):
      expanded_args, expanded_kwargs = standard_kwargs(
          kwarg_names, expanded_args_and_kwargs
      )
      input, num_groups = expanded_args
      N = input.shape[0]
      C = input.shape[1]
      HxW = reduce(operator.mul, input.shape[2:], 1)
      weight, bias, eps = (
          expanded_kwargs["weight"],
          expanded_kwargs["bias"],
          expanded_kwargs["eps"],
      )
      output, mean, rstd = forward_helper(
          torch.native_group_norm,
          (input, weight, bias, N, C, HxW, num_groups, eps),
          {},
      )
      ctx.input, ctx.num_groups = input, num_groups
      ctx.weight, ctx.eps = weight, eps
      ctx.mean, ctx.rstd = mean, rstd
      if isinstance(bias, ExpandedWeight):
          ctx.bias = bias
      if input.requires_grad and isinstance(weight, ExpandedWeight):
          ctx.weight = weight
      return output
  
file_path: pytorch/torch/nn/utils/_expanded_weights/group_norm_expanded_weights.py
imports: from functools import reduce
  import operator
  import torch
  import torch.nn.functional
  from .expanded_weights_impl import ExpandedWeight, implements_per_sample_grads
  from .expanded_weights_utils import standard_kwargs, forward_helper, set_grad_sample_if_exists, unpack_expanded_weight_or_tensor
  from typing import List, Optional
label_desc: Use image node_id 1 for calling the GroupNormPerSampleGrad obj's underlying member method code with example usage: obj.forward(ctx, kwarg_names, _) and returns: output