code: def __add_server_model(
      self, model, loss_fn=None, optimizer_cls=None, optimizer_args={}
  ):
      # add model and pickle to server
      if loss_fn is None:
          logging.info(
              f"loss_fn on FLServer not specified, \
                  using same as client: {self.loss_fn}"
          )
          loss_fn = self.loss_fn
      if optimizer_cls is None:
          logging.info(
              f"optimizer on FLServer not specified, \
                  using same as client: {self.optimizer} (with no args)"
          )
          optimizer_cls = self.optimizer.__class__
  
      msg_model = self.fl_client.nn_stub.upload_file(
          TensorflowEstimator.load_model_as_bytes(model)
      )
      logging.info(msg_model)
  
      msg = self.fl_client.upload_meta(
          loss_fn, optimizer_cls, optimizer_args
      ).message
      logging.info(msg)
  
imports: import logging
  import os
  import shutil
  import tempfile
  from numpy import ndarray
  from bigdl.dllib.utils.log4Error import invalidInputError
  from bigdl.ppml.fl.nn.fl_client import FLClient
  from bigdl.ppml.fl.nn.nn_client import NNClient
  from bigdl.ppml.fl.nn.utils import file_chunk_generate, print_file_size_in_dir, tensor_map_to_ndarray_map
  import tensorflow
  from tensorflow.keras.layers import Dense, Flatten, Conv2D
  from tensorflow.keras import Model
  from bigdl.ppml.fl.nn.generated.nn_service_pb2 import ByteChunk
  from nn_service_pb2 import LoadModelRequest, SaveModelRequest
label_desc: Use image node_id 5 for calling the TensorflowEstimator obj's underlying member method code with example usage: obj.__add_server_model(model, loss_fn, optimizer_cls, optimizer_args) without return types