code: def test_data_creator(self):
      estimator = get_estimator(workers_per_node=2)
      train_stats = estimator.fit(
          train_data_loader, epochs=2, batch_size=128
      )
      print(train_stats)
      val_stats = estimator.evaluate(val_data_loader, batch_size=64)
      print(val_stats)
      assert 0 < val_stats["Accuracy"] < 1
      assert estimator.get_model()
  
      # Verify syncing weights, i.e. the two workers have the same weights after training
      import ray
  
      remote_workers = estimator.estimator.remote_workers
      state_dicts = ray.get(
          [worker.state_dict.remote() for worker in remote_workers]
      )
      weights = [state["models"] for state in state_dicts]
      worker1_weights = weights[0][0]
      worker2_weights = weights[1][0]
      for layer in list(worker1_weights.keys()):
          assert np.allclose(
              worker1_weights[layer].numpy(),
              worker2_weights[layer].numpy(),
          )
      estimator.shutdown()
  
imports: import os
  from unittest import TestCase
  import numpy
  import pytest
  import torch
  import torch.nn
  from zoo.orca import OrcaContext
  from zoo.orca.data.pandas import read_csv
  from zoo.orca.learn.metrics import Accuracy
  from zoo import init_nncontext
  from zoo.orca.learn.pytorch import Estimator
  from zoo.orca.data import SparkXShards
  from zoo.orca.data.image.utils import chunks
label_desc: Use image node_id 1 for calling the TestPyTorchEstimator obj's underlying member method code with example usage: obj.test_data_creator() without return types