docstr: following code is copied from pytorch quick start
  link: https://www.tensorflow.org/tutorials/quickstart/advanced
docstr_tok: ["following","code","is","copied","from","pytorch","quick","start","link",":","https",":","\/\/www.tensorflow.org\/tutorials\/quickstart\/advanced"]
code: def test_mnist(self) -> None:
      """
      following code is copied from pytorch quick start
      link: https://www.tensorflow.org/tutorials/quickstart/advanced
      """
      mnist = tf.keras.datasets.mnist
  
      (x_train, y_train), (x_test, y_test) = mnist.load_data()
      x_train, x_test = x_train / 255.0, x_test / 255.0
  
      # Add a channels dimension
      x_train = x_train[..., tf.newaxis].astype("float32")
      x_test = x_test[..., tf.newaxis].astype("float32")
      train_ds = tf.data.Dataset.from_tensor_slices(
          (x_train[:5000], y_train[:5000])
      ).batch(32)
      test_ds = tf.data.Dataset.from_tensor_slices(
          (x_test, y_test)
      ).batch(32)
  
      model = build_whole_model()
      set_one_like_parameter(model)
  
      loss_object = tf.keras.losses.SparseCategoricalCrossentropy(
          from_logits=True
      )
  
      init_fl_context(1, self.target)
      vfl_model_1 = build_client_model()
      vfl_model_2 = build_server_model()
      vfl_client_ppl = Estimator.from_keras(
          client_model=vfl_model_1,
          loss_fn=loss_object,
          optimizer_cls=tf.keras.optimizers.SGD,
          optimizer_args={"lr": 1e-3},
          server_model=vfl_model_2,
          server_model_path=TestSaveLoad.server_model_path,
          client_model_path=TestSaveLoad.client_model_path,
      )
  
      vfl_client_ppl.fit(train_ds)
      self.fl_server.stop()
      self.setUp()
      client_model_loaded = tf.keras.models.load_model(
          TestSaveLoad.client_model_path
      )
      ppl_from_file = Estimator.from_keras(
          client_model=client_model_loaded,
          loss_fn=loss_object,
          optimizer_cls=tf.keras.optimizers.SGD,
          optimizer_args={"lr": 1e-3},
      )
      ppl_from_file.load_server_model(TestSaveLoad.server_model_path)
      ppl_from_file.fit(train_ds)
      assert (
          ppl_from_file.loss_history[-1] < 2.10
      ), f"Validation failed, incremental training loss does not meet requirement, \
              required < 2.10, current {ppl_from_file.loss_history[-1]}"
  
imports: from multiprocessing import Process
  import unittest
  import numpy
  import os
  from bigdl.ppml.fl import *
  from bigdl.ppml.fl.estimator import Estimator
  from bigdl.ppml.fl.nn.fl_server import FLServer
  from bigdl.ppml.fl.nn.tensorflow.utils import set_one_like_parameter
  from bigdl.ppml.fl.nn.fl_context import init_fl_context
  from bigdl.ppml.fl.nn.tensorflow.estimator import TensorflowEstimator
  import tensorflow
  from tensorflow.keras.layers import Dense, Flatten, Conv2D, InputLayer
  from tensorflow.keras import Model, Input
  import shutil
label_desc: Use image node_id 3 for calling the TestSaveLoad obj's underlying member method code with example usage: obj.test_mnist() without return types