class_docstr: Distributed wrapper for a :class:`~pyro.optim.optim.PyroOptim` optimizer.
  
  This class wraps a ``PyroOptim`` object similar to the way
  :func:`horovod.torch.DistributedOptimizer` wraps a
  :class:`torch.optim.Optimizer`.
  
  .. note::
  
      This requires :mod:`horovod.torch` to be installed, e.g. via
      ``pip install pyro[horovod]``. For details see
      https://horovod.readthedocs.io/en/stable/install.html
  
  :param: A Pyro optimizer instance.
  :type pyro_optim: ~pyro.optim.optim.PyroOptim
  :param \*\*horovod_kwargs: Extra parameters passed to
      :func:`horovod.torch.DistributedOptimizer`.
code: def __call__(
      self, params: Union[List, ValuesView], *args, **kwargs
  ) -> None:
      # Sort by name to ensure deterministic processing order.
      params = sorted(params, key=pyro.get_param_store().param_name)
      super().__call__(params, *args, **kwargs)
  
file_path: pyro/pyro/optim/horovod.py
imports: from typing import List, Union, ValuesView
  from torch.optim import Optimizer
  import pyro
  from .optim import PyroOptim
label_desc: Use image node_id 2 for calling the HorovodOptimizer obj's underlying member method code with example usage: obj.__call__(params) without return types