import concurrent.futures
import torch
import torch.nn as nn
import torch.optim as optimizer
from torch.distributions import Categorical

class mymodel1(nn.Module):
    def __init__(self):
        super(mymodel1,self).__init__()
        self.weight = nn.Linear(3,2)
        
    def forward(self, X):
        out = self.weight(X)
        out = nn.Softmax(dim = 0)(out)
        return out

class mymodel2(nn.Module):
    def __init__(self):
        super(mymodel2,self).__init__()
        self.weight = nn.Linear(3,2)
        
    def forward(self, X):
        out = self.weight(X)
        out = nn.Softmax(dim = 0)(out)
        return out


class mymodel3(nn.Module):
    def __init__(self):
        super(mymodel3,self).__init__()
        self.weight = nn.Linear(3,2)
        
    def forward(self, X):
        out = self.weight(X)
        out = nn.Softmax(dim = 0)(out)
        return out


        
def doTrain(model, X):     
    a1 = model()
    return list(a1.parameters())

X = torch.randn(12,3)


updatedParams = []
results = []


with concurrent.futures.ProcessPoolExecutor() as executor:
    f1 = executor.submit(doTrain, mymodel1, X[0*4:(0+1)*4])
    f2 = executor.submit(doTrain, mymodel2, X[1*4:(1+1)*4])
    f3 = executor.submit(doTrain, mymodel3, X[2*4:(2+1)*4])
    

print(f1.result())
print(f2.result())
print(f3.result())

Output
[Parameter containing:
tensor([[-0.3413, -0.4291,  0.0850],
        [-0.4270, -0.4523, -0.3700]], requires_grad=True), Parameter containing:
tensor([0.5327, 0.2588], requires_grad=True)]
[Parameter containing:
tensor([[-0.3413, -0.4291,  0.0850],
        [-0.4270, -0.4523, -0.3700]], requires_grad=True), Parameter containing:
tensor([0.5327, 0.2588], requires_grad=True)]
[Parameter containing:
tensor([[-0.3413, -0.4291,  0.0850],
        [-0.4270, -0.4523, -0.3700]], requires_grad=True), Parameter containing:
tensor([0.5327, 0.2588], requires_grad=True)]

Can somebody tell me why I am getting same parameters returned from the different processes although the models are different ?