class_docstr: Importing two different types of horovod in the same python process (horovod.tensorflow and
  horovod.pytorch, for instance) results in a segfault.
  
  _PolyHorovod is a wrapper around the horovod module to delay the actual importing of horovod
  until it is known which version is actually needed for the task. The result is that horovod
  importing across Determined becomes simple, easy, and robust.
  
  After require_horovod_type() is called once, horovod is imported, and _PolyHorovod passes all
  other calls to the real horovod module.
code: def cross_size(self) -> Any:
      if hasattr(self._poly_hvd_module, "cross_size"):
          return self._poly_hvd_module.cross_size()
      if "HOROVOD_CROSS_SIZE" in os.environ:
          return int(os.environ["HOROVOD_CROSS_SIZE"])
      raise RuntimeError(
          "hvd has no cross_size() and HOROVOD_CROSS_SIZE is not set"
      )
  
file_path: determined/harness/determined/horovod.py
imports: import importlib
  import os
  from typing import Any, Dict, List, Optional
  from determined import constants
  from determined.common import check
label_desc: Use image node_id 5 for calling the _PolyHorovod obj's underlying member method code with example usage: obj.cross_size() and returns: self, int