docstr: Perfrom model inference using async mode.
  
  :param input_data: Input data to be inferenced.
                     Users can put multiple input data in a list to infer them together.
                     Can be List[numpy.ndarray] or
                     List[List[numpy.ndarray]] if the model has multiple inputs.
  :param num_requests: Number of requests in the asynchronous infer requests pool.
                       Each element in input_data will be bound to an idle async
                       infer request in the pool to do inference.
                       Defaults to 0.
                       If 0, it will be set automatically to the optimal number.
  
  :return: A List containing result of each inference. Type: List[numpy.ndarray]
docstr_tok: ["Perfrom","model","inference","using","async","mode",".",":","param","input_data",":","Input","data","to","be","inferenced",".","Users","can","put","multiple","input","data","in","a","list","to","infer","them","together",".","Can","be","List","[","numpy.ndarray","]","or","List","[","List","[","numpy.ndarray","]","]","if","the","model","has","multiple","inputs",".",":","param","num_requests",":","Number","of","requests","in","the","asynchronous","infer","requests","pool",".","Each","element","in","input_data","will","be","bound","to","an","idle","async","infer","request","in","the","pool","to","do","inference",".","Defaults","to","0",".","If","0",",","it","will","be","set","automatically","to","the","optimal","number",".",":","return",":","A","List","containing","result","of","each","inference",".","Type",":","List","[","numpy.ndarray","]"]
code: def async_predict(
      self,
      input_data: Union[List[np.ndarray], List[List[np.ndarray]]],
      num_requests: int = 0,
  ) -> List[np.ndarray]:
      """
      Perfrom model inference using async mode.
  
      :param input_data: Input data to be inferenced.
                         Users can put multiple input data in a list to infer them together.
                         Can be List[numpy.ndarray] or
                         List[List[numpy.ndarray]] if the model has multiple inputs.
      :param num_requests: Number of requests in the asynchronous infer requests pool.
                           Each element in input_data will be bound to an idle async
                           infer request in the pool to do inference.
                           Defaults to 0.
                           If 0, it will be set automatically to the optimal number.
  
      :return: A List containing result of each inference. Type: List[numpy.ndarray]
      """
      results = [0 for _ in range(len(input_data))]
  
      # call back function is called when a infer_request in the infer_queue
      # finishes the inference
      def call_back(requests, idx):
          results[idx] = self.on_forward_end(requests.results)
  
      infer_queue = AsyncInferQueue(
          self._compiled_model, jobs=num_requests
      )
      infer_queue.set_callback(call_back)
  
      for id, model_input in enumerate(input_data):
          if isinstance(model_input, np.ndarray):
              # start_async accpet a list of input data
              # so put data in a list
              model_input = [model_input]
          infer_queue.start_async(model_input, userdata=id)
  
      infer_queue.wait_all()
  
      return results
  
imports: from pathlib import Path
  from tempfile import TemporaryDirectory
  from typing import List, Union
  from openvino.runtime import Core
  from bigdl.nano.utils.common import invalidInputError, _flatten, invalidOperationError
  from openvino.runtime import Model
  from openvino.runtime import AsyncInferQueue
  import numpy
  from datetime import datetime
  from .utils import save, OpenVINO_LESS_2022_3
label_desc: Use image node_id 17 for calling the OpenVINOModel obj's underlying member method code with example usage: obj.async_predict(input_data, num_requests) and returns: results