class_docstr: Singleton for distributed communication backend.
  
  Attributes:
      share_cuda_visible_devices: If True, each worker
          process will have CUDA_VISIBLE_DEVICES set as the visible device
          IDs of all workers on the same node for this training instance.
          If False, each worker will have CUDA_VISIBLE_DEVICES set to the
          device IDs allocated by Ray for that worker.
class_docstr_tok: ["Singleton","for","distributed","communication","backend",".","Attributes",":","share_cuda_visible_devices",":","If","True",",","each","worker","process","will","have","CUDA_VISIBLE_DEVICES","set","as","the","visible","device","IDs","of","all","workers","on","the","same","node","for","this","training","instance",".","If","False",",","each","worker","will","have","CUDA_VISIBLE_DEVICES","set","to","the","device","IDs","allocated","by","Ray","for","that","worker","."]
docstr: Logic ran right before training is started.
  
  Session API is available at this point.
docstr_tok: ["Logic","ran","right","before","training","is","started",".","Session","API","is","available","at","this","point","."]
code: def on_training_start(
      self, worker_group: WorkerGroup, backend_config: BackendConfig
  ):
      """Logic ran right before training is started.
  
      Session API is available at this point."""
      pass
  
file_path: ray/python/ray/train/backend.py
imports: import logging
  from typing import TypeVar
  from ray.train._internal.utils import Singleton
  from ray.train._internal.worker_group import WorkerGroup
  from ray.util.annotations import DeveloperAPI
  from ray.widgets import make_table_html_repr
label_desc: Use image node_id 3 for calling the Backend obj's underlying member method code with example usage: obj.on_training_start(worker_group, backend_config) without return types