GroupNorm значительно медленнее и потребляет больше памяти GPU, чем BatchNorm в Pytorch - PullRequest
0 голосов
/ 19 сентября 2019

Я использую GroupNorm в pytorch вместо BatchNorm и оставляю все остальные (сетевая архитектура) без изменений.Это показывает, что в наборе данных Imagenet, использующем архитектуру resnet50, GroupNorm работает на 40% медленнее, чем BatchNorm, и потребляет на 33% больше памяти графического процессора, чем BatchNorm.Я действительно запутался, потому что GroupNorm не должен нуждаться в большем расчете, чем BatchNorm.Подробная информация приведена ниже.

Подробную информацию о нормализации группы можно найти в этом документе: https://arxiv.org/pdf/1803.08494.pdf

Для BatchNorm одна мини-партия потребляет 12,8 секунды с памятью графического процессора 7,51 ГБ;

Для GroupNorm один мини-пакет потребляет 17,9 секунды с объемом памяти графического процессора 10,02 ГБ.

Я использую следующий код для преобразования всех слоев BatchNorm в слои GroupNorm.

def convert_bn_model_to_gn(module, num_groups=16):
"""
Recursively traverse module and its children to replace all instances of
``torch.nn.modules.batchnorm._BatchNorm`` with :class:`torch.nn.GroupNorm`.
Args:
    module: your network module
    num_groups: num_groups of GN
"""
mod = module
if isinstance(module, nn.modules.batchnorm._BatchNorm):
    mod = nn.GroupNorm(num_groups, module.num_features,
                       eps=module.eps, affine=module.affine)
    # mod = nn.modules.linear.Identity()
    if module.affine:
        mod.weight.data = module.weight.data.clone().detach()
        mod.bias.data = module.bias.data.clone().detach()
for name, child in module.named_children():
    mod.add_module(name, convert_bn_model_to_gn(
        child, num_groups=num_groups))
del module
return mod
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...