code: def upload_meta(self, loss_fn, optimizer_cls, optimizer_args):
      # upload model to server
      loss_fn = SafePickle.dumps(loss_fn)
      optimizer = ClassAndArgsWrapper(
          optimizer_cls, optimizer_args
      ).to_protobuf()
      request = UploadMetaRequest(
          client_uuid=self.client_uuid,
          loss_fn=loss_fn,
          optimizer=optimizer,
          aggregator=self.aggregator,
      )
      return self.nn_stub.upload_meta(request)
  
file_path: BigDL/python/ppml/src/bigdl/ppml/fl/nn/nn_client.py
imports: from bigdl.ppml.utils.safepickle import SafePickle
  from bigdl.ppml.fl.nn.fl_client import FLClient
  from bigdl.ppml.fl.nn.generated.nn_service_pb2 import TrainRequest, PredictRequest, UploadMetaRequest
  from bigdl.ppml.fl.nn.generated.nn_service_pb2_grpc import *
  from bigdl.ppml.fl.nn.utils import ndarray_map_to_tensor_map
  import threading
  from bigdl.dllib.utils.log4Error import invalidInputError, invalidOperationError
  from bigdl.ppml.fl.nn.utils import ClassAndArgsWrapper
label_desc: Use image node_id 4 for calling the NNClient obj's underlying member method code with example usage: obj.upload_meta(loss_fn, optimizer_cls, optimizer_args) and returns: self