code: def notify(self, message: Optional[str] = None, **kwargs):
      for sub in self._notifiers:
          attempt = 0
          while attempt < self.MAX_RETRIES:
              try:
                  sub.notify(message, **kwargs)
                  break
              except Exception as e:
                  attempt += 1
                  if attempt == self.MAX_RETRIES:
                      logger.error(
                          f'Notifier {sub} failed to send message "{message}". '
                          f"No retries left."
                      )
                      raise NotificationSendError(e)
                  else:
                      logger.error(
                          f'Notifier {sub} failed to send message "{message}". '
                          f"Retry attempts left {self.MAX_RETRIES - attempt} "
                          f"Next retry in {self.RETRY_DELAY} seconds."
                      )
                      time.sleep(self.RETRY_DELAY)
  
file_path: aim/aim/ext/notifier/notifier.py
imports: import logging
  import time
  from typing import List, Optional
  from aim.ext.notifier.base_notifier import BaseNotifier
label_desc: Use image node_id 3 for calling the Notifier obj's underlying member method code with example usage: obj.notify(message) without return types