code: def call_for_each_tower(self, tower_fn):
          
          ps_device = 'cpu' if len(self.towers) >= 4 else 'gpu'
  
          raw_devices = ['/gpu:{}'.format(k) for k in self.towers]
          if ps_device == 'gpu':
              devices = [LeastLoadedDeviceSetter(d, raw_devices) for d in raw_devices]
          else:
              devices = [tf.train.replica_device_setter(
                  worker_device=d, ps_device='/cpu:0', ps_tasks=1) for d in raw_devices]
  
          return DataParallelBuilder.build_on_towers(self.towers, tower_fn, devices)
docs: Call the function `tower_fn` under :class:`TowerContext` for each tower.
  
          Returns:
              a list, contains the return values of `tower_fn` on each tower.