class_docstr: Shared interface of all model server runners.
  
  Model server runner is responsible for managing the model server job and
  relevant resources in the serving platform. For example, model server runner
  for kubernetes will launch a Pod of model server with required resources
  allocated, and tear down all the kubernetes resources once infra validation
  is done. Note that model server runner does *not* interact with model server
  app.
  
  Model server job have 5 states: Initial, Scheduled, Running, Aborted, and End.
  Each state transition is depicted in the diagram below.
  
  ```
             +-----------+
             |  Initial  |
             +-----+-----+
                   | Start()
             +-----v-----+
          +--+ Scheduled |
          |  +-----+-----+
          |        | WaitUntilRunning()
          |  +-----v-----+
          +--+  Running  |
          |  +-----+-----+
          |        |
    +-----v-----+  |
    |  Aborted  +--+ Stop()
    +-----------+  |
                   |
             +-----v-----+
             |    End    |
             +-----------+
  ```
  
  At any step, the job can be aborted in the serving platform. Model server
  runner will NOT recover a job from failure (even if it can) and regard the
  abortion as a validation failure.
  
  All the infra validation logic (waiting for model loaded, sending requests,
  measuring metrics, etc.) will happen when model server job has reached Running
  state. This is not a scope of model server runner work.
  
  Depending on the serving platform, some of the states might be the same. For
  example, in a GCP cloud AI prediction service we have a global model server
  instance running, which makes Scheduled state and Running state
  indistinguishable. In such case, `WaitUntilRunning()` action will be a no-op.
docstr: Start the model server in non-blocking manner.
  
  `Start()` will transition the job state from Initial to Scheduled. Serving
  platform will turn the job into Running state in the future.
  
  In `Start()`, model server runner should prepare the resources model server
  requires including config files, environment variables, volumes, proper
  authentication, computing resource allocation, etc.. Cleanup for the
  resources does not happen automatically, and you should call `Stop()` to do
  that if you have ever called `Start()`.
  
  It is not allowed to run `Start()` twice. If you need to restart the job,
  you should create another model server runner instance.
code: def Start(self) -> None:
      """Start the model server in non-blocking manner.
  
      `Start()` will transition the job state from Initial to Scheduled. Serving
      platform will turn the job into Running state in the future.
  
      In `Start()`, model server runner should prepare the resources model server
      requires including config files, environment variables, volumes, proper
      authentication, computing resource allocation, etc.. Cleanup for the
      resources does not happen automatically, and you should call `Stop()` to do
      that if you have ever called `Start()`.
  
      It is not allowed to run `Start()` twice. If you need to restart the job,
      you should create another model server runner instance.
      """
  
file_path: tfx/tfx/components/infra_validator/model_server_runners/base_runner.py
imports: import abc
  from typing import Optional
label_desc: Use image node_id 3 for calling the BaseModelServerRunner obj's underlying member method code with example usage: obj.Start() without return types