class_docstr: We only test the case with ``affine=True`` here, because it is the only case that will actually
  compute a gradient. There is no grad_sample from this module otherwise.
code: def test_3d_input_groups(
      self,
      N: int,
      C: int,
      H: int,
      W: int,
      num_groups: Union[int, str],
  ):
      if num_groups == "C":
          num_groups = C
  
      if C % num_groups != 0:
          return
  
      x = torch.randn([N, C, H, W])
      norm = nn.GroupNorm(
          num_groups=num_groups, num_channels=C, affine=True
      )
      self.run_test(x, norm, batch_first=True, ew_compatible=N > 0)
  
file_path: opacus/opacus/tests/grad_samples/group_norm_test.py
imports: from typing import Union
  import hypothesis.strategies
  import torch
  import torch.nn
  from hypothesis import given, settings
  from .common import GradSampleHooks_test
label_desc: Use image node_id 1 for calling the GroupNorm_test obj's underlying member method code with example usage: obj.test_3d_input_groups(N, C, H, W, num_groups) without return types