test_parallel.py 1.93 KB
Newer Older
Kai Chen's avatar
Kai Chen committed
1
2
from unittest.mock import MagicMock, patch

3
import torch
Kai Chen's avatar
Kai Chen committed
4
5
6
import torch.nn as nn
from torch.nn.parallel import DataParallel, DistributedDataParallel

Harry's avatar
Harry committed
7
8
from mmcv.parallel import (MODULE_WRAPPERS, MMDataParallel,
                           MMDistributedDataParallel, is_module_wrapper)
Kai Chen's avatar
Kai Chen committed
9
10
11
12
from mmcv.parallel.distributed_deprecated import \
    MMDistributedDataParallel as DeprecatedMMDDP


Kai Chen's avatar
Kai Chen committed
13
14
15
16
17
18
def mock(*args, **kwargs):
    pass


@patch('torch.distributed._broadcast_coalesced', mock)
@patch('torch.distributed.broadcast', mock)
19
@patch('torch.nn.parallel.DistributedDataParallel._ddp_init_helper', mock)
Harry's avatar
Harry committed
20
def test_is_module_wrapper():
Kai Chen's avatar
Kai Chen committed
21
22
23
24
25
26
27
28
29
30

    class Model(nn.Module):

        def __init__(self):
            super().__init__()
            self.conv = nn.Conv2d(2, 2, 1)

        def forward(self, x):
            return self.conv(x)

31
32
33
34
35
36
    # _verify_model_across_ranks is added in torch1.9.0 so we should check
    # wether _verify_model_across_ranks is the member of torch.distributed
    # before mocking
    if hasattr(torch.distributed, '_verify_model_across_ranks'):
        torch.distributed._verify_model_across_ranks = mock

Kai Chen's avatar
Kai Chen committed
37
    model = Model()
Harry's avatar
Harry committed
38
    assert not is_module_wrapper(model)
Kai Chen's avatar
Kai Chen committed
39
40

    dp = DataParallel(model)
Harry's avatar
Harry committed
41
    assert is_module_wrapper(dp)
Kai Chen's avatar
Kai Chen committed
42
43

    mmdp = MMDataParallel(model)
Harry's avatar
Harry committed
44
    assert is_module_wrapper(mmdp)
Kai Chen's avatar
Kai Chen committed
45
46

    ddp = DistributedDataParallel(model, process_group=MagicMock())
Harry's avatar
Harry committed
47
    assert is_module_wrapper(ddp)
Kai Chen's avatar
Kai Chen committed
48
49

    mmddp = MMDistributedDataParallel(model, process_group=MagicMock())
Harry's avatar
Harry committed
50
    assert is_module_wrapper(mmddp)
Kai Chen's avatar
Kai Chen committed
51
52

    deprecated_mmddp = DeprecatedMMDDP(model)
Harry's avatar
Harry committed
53
54
55
56
57
58
59
60
61
62
63
64
65
66
    assert is_module_wrapper(deprecated_mmddp)

    # test module wrapper registry
    @MODULE_WRAPPERS.register_module()
    class ModuleWrapper(object):

        def __init__(self, module):
            self.module = module

        def forward(self, *args, **kwargs):
            return self.module(*args, **kwargs)

    module_wraper = ModuleWrapper(model)
    assert is_module_wrapper(module_wraper)