the module. These "dry runs" send inputs of the correct size,
   dtype, and device through the network and to each one of its lazy
   modules. After this the network can be used as usual.



class LazyMLP(torch.nn.Module):
   ...    def init(self):
   ...        super().init()
   ...        self.fc1 = torch.nn.LazyLinear(10)
   ...        self.relu1 = torch.nn.ReLU()
   ...        self.fc2 = torch.nn.LazyLinear(1)
   ...        self.relu2 = torch.nn.ReLU()
   ...
   ...    def forward(self, input):
   ...        x = self.relu1(self.fc1(input))
   ...        y = self.relu2(self.fc2(x))
   ...        return y
constructs a network with lazy modules
lazy_mlp = LazyMLP()
transforms the network's device and dtype
NOTE: these transforms can and should be applied after construction and before any 'dry runs'
lazy_mlp = lazy_mlp.cuda().double()
lazy_mlp
   LazyMLP( (fc1): LazyLinear(in_features=0, out_features=10, bias=True)
     (relu1): ReLU()


