The current ResNet implementation seems to accept different normalization layers as an argument (you might need to update torchvision, if your installed version doesn’t have this argument).
Here is a small code snippet:
from torchvision.models import resnet


class MyGroupNorm(nn.Module):
    def __init__(self, num_channels):
        super(MyGroupNorm, self).__init__()
        self.norm = nn.GroupNorm(num_groups=2, num_channels=num_channels,
                                 eps=1e-5, affine=True)
    
    def forward(self, x):
        x = self.norm(x)
        return x

model = resnet.ResNet(resnet.BasicBlock, [2, 2, 2, 2], num_classes=1000, zero_init_residual=False,
                 groups=1, width_per_group=64, replace_stride_with_dilation=None,
                 norm_layer=MyGroupNorm)
print(model)

Note that I needed to define the proxy MyGroupNorm module, since the initialization of the norm_layer will only take one argument (as seen in this line of code 4), while nn.GroupNorm needs two.