managing 1 worker per agent.


Use 4 x double GPU instances, place an agent per instance,
      managing 2 workers per agent.


Use 2 x quad GPU instances, place an agent per instance,
      managing 4 workers per agent.


Use 1 x 8 GPU instance, place an agent per instance, managing 8
      workers per agent.


Usage
  group_result = agent.run()
   if group_result.is_failed():
     # workers failed
     failure = group_result.failures[0]
     log.exception(f"worker 0 failed with exit code : {failure.exit_code}")
   else:
     return group_result.return_values[0] # return rank 0's results

abstract get_worker_group(role='default')
  Returns:
     The "WorkerGroup" for the given "role". Note that the worker
     group is a mutable object and hence in a multi-
     threaded/process environment it may change state.
     Implementors are encouraged (but not required) to return a
     defensive read-only copy.

  Return type:
