creates an "Optimizer()" instance on each distinct RRef owner, and
   updates parameters accordingly when running "step()". When you have
   distributed forward and backward passes, parameters and gradients
   will be scattered across multiple workers, and hence it requires an
   optimizer on each of the involved workers. Distributed Optimizer
   wraps all those local optimizers into one, and provides a concise
   constructor and "step()" API.
RPC
Before using RPC and distributed autograd primitives, initialization
must take place. To initialize the RPC framework we need to use
"init_rpc()" which would initialize the RPC framework, RRef framework
and distributed autograd.
torch.distributed.rpc.init_rpc(name, backend=None, rank=- 1, world_size=None, rpc_backend_options=None)
Initializes RPC primitives such as the local RPC agent and
   distributed autograd, which immediately makes the current process
   ready to send and receive RPCs.
Parameters: