code: def save_model(self, output_dir):
      if not os.path.exists(output_dir):
          os.makedirs(output_dir)
      model_to_save = get_model_obj(self.model)
      output_model_file = os.path.join(output_dir, WEIGHTS_NAME)
      output_config_file = os.path.join(output_dir, CONFIG_NAME)
      torch.save(model_to_save.state_dict(), output_model_file)
      model_to_save.config.to_json_file(output_config_file)
  
imports: import os
  import numpy
  import torch
  import torch.nn
  import torch.nn.functional
  from collections import OrderedDict
  from tqdm import tqdm
  from pytorch_transformers.modeling_utils import CONFIG_NAME, WEIGHTS_NAME
  from pytorch_transformers.modeling_bert import BertPreTrainedModel, BertConfig, BertModel
  from pytorch_transformers.modeling_roberta import RobertaConfig, RobertaModel
  from pytorch_transformers.tokenization_bert import BertTokenizer
  from pytorch_transformers.tokenization_roberta import RobertaTokenizer
  from blink.common.ranker_base import BertEncoder, get_model_obj
  from blink.common.optimizer import get_bert_optimizer
  from blink.common.params import ENT_START_TAG, ENT_END_TAG, ENT_TITLE_TAG
label_desc: Use image node_id 5 for calling the CrossEncoderRanker obj's underlying member method code with example usage: obj.save_model(output_dir) without return types