def METHOD_NAME(self):
    # key: batch_index; value: extracted_feature_map
    extracted_feature_dict = dict()
    # key: batch_index; value: logits
    logits_dict = dict()
    # key: batch_index; value: label
    labels_dict = dict()
    # for test - key: batch_index; value: extracted_feature_map
    extracted_feature_dict_test = dict()
    labels_dict_test = dict()
    if self.args.whether_training_on_client == 1:
        self.client_model.METHOD_NAME()
        # train and update
        epoch_loss = []
        for epoch in range(self.args.epochs_client):
            batch_loss = []
            for batch_idx, (images, labels) in enumerate(self.local_training_data):
                images, labels = images.to(self.device), labels.to(self.device)
                # logging.info("shape = " + str(images.shape))
                log_probs, _ = self.client_model(images)
                loss_true = self.criterion_CE(log_probs, labels)
                if len(self.server_logits_dict) != 0:
                    large_model_logits = torch.from_numpy(
                        self.server_logits_dict[batch_idx]
                    ).to(self.device)
                    loss_kd = self.criterion_KL(log_probs, large_model_logits)
                    loss = loss_true + self.args.alpha * loss_kd
                else:
                    loss = loss_true
                self.optimizer.zero_grad()
                loss.backward()
                self.optimizer.step()
                # logging.info(
                #     "client {} - Update Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}".format(
                #         self.client_index,
                #         epoch,
                #         batch_idx * len(images),
                #         len(self.local_training_data.dataset),
                #         100.0 * batch_idx / len(self.local_training_data),
                #         loss.item(),
                #     )
                # )
                batch_loss.append(loss.item())
            epoch_loss.append(sum(batch_loss) / len(batch_loss))
    self.client_model.eval()
    """
        If the training dataset is too large, we may meet the following issue.
        ===================================================================================
        =   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
        =   PID 28488 RUNNING AT ChaoyangHe-GPU-RTX2080Tix4
        =   EXIT CODE: 9
        =   CLEANING UP REMAINING PROCESSES
        =   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
        ===================================================================================
        The signal 9 may indicate that the job is out of memory.
        So it is better to run this program in a 256G CPU host memory. 
        If deploying our algorithm in real world system, please optimize the memory usage by compression.
    """
    for batch_idx, (images, labels) in enumerate(self.local_training_data):
        images, labels = images.to(self.device), labels.to(self.device)
        # logging.info("shape = " + str(images.shape))
        log_probs, extracted_features = self.client_model(images)
        # logging.info("shape = " + str(extracted_features.shape))
        # logging.info("element size = " + str(extracted_features.element_size()))
        # logging.info("nelement = " + str(extracted_features.nelement()))
        # logging.info("GPU memory1 = " + str(extracted_features.nelement() * extracted_features.element_size()))
        extracted_feature_dict[batch_idx] = (
            extracted_features.cpu().detach().numpy()
        )
        log_probs = log_probs.cpu().detach().numpy()
        logits_dict[batch_idx] = log_probs
        labels_dict[batch_idx] = labels.cpu().detach().numpy()
    for batch_idx, (images, labels) in enumerate(self.local_test_data):
        test_images, test_labels = images.to(self.device), labels.to(self.device)
        _, extracted_features_test = self.client_model(test_images)
        extracted_feature_dict_test[batch_idx] = (
            extracted_features_test.cpu().detach().numpy()
        )
        labels_dict_test[batch_idx] = test_labels.cpu().detach().numpy()
    return (
        extracted_feature_dict,
        logits_dict,
        labels_dict,
        extracted_feature_dict_test,
        labels_dict_test,
    )