You’re right, it is related to the OrderedDict you’re using to instantiate the nn.Sequential modules. Because PyTorch is imperative whenever you write PyTorch code it is executed immediately, so when yo do
net_spec = OrderedDict([('0', torch.nn.Linear(D_in, H)),
                    ('1', torch.nn.ReLU()),
                    ('2', torch.nn.Linear(H, D_out))])

you’re actually instantiating a linear module with dims. [D_in, H], a relu module and another linear with dims [H, D_out]. These modules are grouped in your OrderedDict and when you pass this to nn.Sequential what happens is that you wrap those SAME modules that are already created in a new Sequential module. So the two Sequential modules are indeed different instances, but they both wrap the same underlying Linear modules:
 id(net_spec['0']) == id(m1[0]) == id(m2[0])  # Same nn.Linear instance