code: def _subscribe_forward(
      self,
      microbatch_id: int,
      output_pp_ranks: List[int],
      ret_future: Dict[int, List[Future]],
  ):
      key = UniqueKey(microbatch_id, Phase.FORWARD)
      offset = (microbatch_id % 2) * self.stage_num
      for pp_rank in output_pp_ranks:
          worker_rref = self.pp_rank_to_worker_rref[pp_rank + offset]
          ret_future[pp_rank + offset][
              microbatch_id
          ] = worker_rref.rpc_async().get_output_by_key(key)
  
imports: import threading
  from typing import Callable, Dict, List
  import torch
  from torch._C._distributed_rpc import PyRRef
  from torch.futures import Future
  from colossalai.legacy.pipeline.pipeline_process_group import ppg
  from colossalai.legacy.pipeline.rpc._pipeline_base import Phase, PipelineEngineBase, UniqueKey, WorkerBase, WorkItem
label_desc: Use image node_id 8 for calling the ChimeraPipelineEngine obj's underlying member method code with example usage: obj._subscribe_forward(microbatch_id, output_pp_ranks, ret_future) without return types