code: def handle_dataset_validation(self, data_creator, config, steps):
      config, local_batch_size = self._handle_batch_size(config)
      config["rank"] = self.rank
      config["size"] = self.size
      dataset = data_creator(config, config["batch_size"])
      if isinstance(dataset, list) and all(
          [isinstance(x, ray.ObjectID) for x in dataset]
      ):
          invalidInputError(
              steps is not None, "steps must be provided for xshard"
          )
          dataset = self._handle_xshards(
              dataset,
              steps=steps,
              local_batch_size=local_batch_size,
              shuffle=False,
          )
      else:
          dataset = self._handle_sharding(dataset)
  
      return dataset
  
imports: import json
  import os
  import socket
  import shutil
  import tempfile
  import copy
  import ray
  from contextlib import closing
  from bigdl.dllib.utils import log4Error
  from bigdl.orca.data.utils import partitions_get_data_label, partitions_get_tf_dataset
  from bigdl.orca.data.file import is_file, get_remote_file_to_local, get_remote_dir_to_local, get_remote_files_with_prefix_to_local, put_local_file_to_remote, put_local_dir_tree_to_remote, put_local_files_with_prefix_to_remote
  from bigdl.orca.learn.utils import process_tensorboard_in_callbacks
  from bigdl.dllib.utils.log4Error import *
label_desc: Use image node_id 3 for calling the DatasetHandler obj's underlying member method code with example usage: obj.handle_dataset_validation(data_creator, config, steps) and returns: dataset