class_docstr: Base class for the remote client.
  
  For each training task, there is a global client in the cluster which
  submits jobs to the master node. Different `@parl.remote_class` objects
  connect to the same global client in a training task.
  
  Attributes:
      submit_job_socket (zmq.Context.socket): A socket which submits job to
                                              the master node.
      pyfiles (bytes): A serialized dictionary containing the code of python
                       files in local working directory.
      executable_path (str): File path of the executable python script.
      start_time (time): A timestamp to record the start time of the program.
class_docstr_tok: ["Base","class","for","the","remote","client",".","For","each","training","task",",","there","is","a","global","client","in","the","cluster","which","submits","jobs","to","the","master","node",".","Different","`","@","parl.remote_class","`","objects","connect","to","the","same","global","client","in","a","training","task",".","Attributes",":","submit_job_socket","(","zmq.Context.socket",")",":","A","socket","which","submits","job","to","the","master","node",".","pyfiles","(","bytes",")",":","A","serialized","dictionary","containing","the","code","of","python","files","in","local","working","directory",".","executable_path","(","str",")",":","File","path","of","the","executable","python","script",".","start_time","(","time",")",":","A","timestamp","to","record","the","start","time","of","the","program","."]
docstr: Verify that the parl & python version as well as some other packages in 'worker' process
  matches that of the 'master' process
docstr_tok: ["Verify","that","the","parl","&","python","version","as","well","as","some","other","packages","in","'worker","'","process","matches","that","of","the","'master","'","process"]
code: def check_env_consistency(self):
      """Verify that the parl & python version as well as some other packages in 'worker' process
      matches that of the 'master' process"""
      self.submit_job_socket.send_multipart(
          [remote_constants.CHECK_VERSION_TAG]
      )
      message = self.submit_job_socket.recv_multipart()
      tag = message[0]
      if tag == remote_constants.NORMAL_TAG:
          client_parl_version = parl.__version__
          client_python_version_major = str(sys.version_info.major)
          client_python_version_minor = str(sys.version_info.minor)
          assert (
              client_parl_version == to_str(message[1])
              and client_python_version_major == to_str(message[2])
              and client_python_version_minor == to_str(message[3])
          ), """Version mismatch: the 'master' is of version 'parl={}, python={}.{}'. However, \
                  'parl={}, python={}.{}'is provided in your environment.""".format(
              to_str(message[1]),
              to_str(message[2]),
              to_str(message[3]),
              client_parl_version,
              client_python_version_major,
              client_python_version_minor,
          )
          client_pyarrow_version = str(get_version("pyarrow"))
          master_pyarrow_version = to_str(message[4])
          if client_pyarrow_version != master_pyarrow_version:
              if master_pyarrow_version == "None":
                  error_message = """"pyarrow" is provided in your current environment, however, it is not \
  found in "master"'s environment. To use "pyarrow" for serialization, please install \
  "pyarrow={}" in "master"'s environment!""".format(
                      client_pyarrow_version
                  )
              elif client_pyarrow_version == "None":
                  error_message = """"pyarrow" is provided in "master"'s environment, however, it is not \
  found in your current environment. To use "pyarrow" for serialization, please install \
  "pyarrow={}" in your current environment!""".format(
                      master_pyarrow_version
                  )
              else:
                  error_message = """Version mismatch: the 'master' is of version 'pyarrow={}'. However, \
  'pyarrow={}'is provided in your current environment.""".format(
                      master_pyarrow_version, client_pyarrow_version
                  )
              raise Exception(error_message)
      else:
          raise NotImplementedError
  
imports: import cloudpickle
  import datetime
  import os
  import socket
  import sys
  import threading
  import zmq
  import parl
  import time
  import glob
  import multiprocessing
  from parl.utils import to_str, to_byte, get_ip_address, logger, isnotebook
  from parl.remote.utils import get_subfiles_recursively
  from parl.remote import remote_constants
  from parl.remote.grpc_heartbeat import HeartbeatServerThread, HeartbeatServerProcess
  from parl.remote.utils import get_version
label_desc: Use image node_id 7 for calling the Client obj's underlying member method code with example usage: obj.check_env_consistency() without return types