Answer to your questions:

Your model is indeed put on multiple devices, but there is no synchronization of gradients during training likely causing the accuracy loss
Look into DDP (Distributed Data Parallel — PyTorch 1.9.1 documentation) which provides a framework to do distributed training across multiple gpus and multiple machines.
Example modifications of your example to fit DDP (I did not test locally, may have typos):

# main.py

    model = Net()  # not to specific device any more

    processes = []
    for rank in range(args.num_processes):
        dist.init_process_group("gloo", rank=rank, world_size=2)
        p = mp.Process(target=train, args=(rank, args, model, dataset1, kwargs))
        
        p.start()
        processes.append(p)

# train.py
def train(rank, args, model, dataset, dataloader_kwargs):
    ddp_model = DDP(model, device_ids=[rank])
    torch.manual_seed(args.seed + rank)

    train_loader = torch.utils.data.DataLoader(dataset, **dataloader_kwargs)

    optimizer = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum)
    for epoch in range(1, args.epochs + 1):
        train_epoch(epoch, args, model, device, train_loader, optimizer)