code: def add_subtask(self, subtask_info: SubtaskScheduleInfo):
      # duplicate subtask add will be handled in `_speculative_execution`.
      subtask = subtask_info.subtask
      self._grouped_unfinished_subtasks[subtask.logic_key][
          subtask.subtask_id
      ] = subtask_info
  
file_path: mars/mars/services/scheduling/supervisor/speculation.py
imports: import asyncio
  import logging
  import time
  import numpy
  from collections import defaultdict
  from typing import Dict
  from ....utils import parse_readable_size, create_task_with_error_log
  from ..errors import NoAvailableBand
  from .manager import SubtaskScheduleInfo
label_desc: Use image node_id 2 for calling the SpeculativeScheduler obj's underlying member method code with example usage: obj.add_subtask(subtask_info) without return types