class_docstr: TensorboardManager stores tensorboard logs (tfevent files, .gz zipped archives,
  and .pb protobuf graph and model definition files) to a supported storage backend. The
  trial will generate tfevent files during training. If a profiling callback is used,
  .pb and .gz files will also be generated. These files must be written to the same
  base_path as the base_path used in the constructor of this class.
  
  Each supported persistent storage backend must define a subclass which
  implements the sync method.
docstr: list_files returns Tensorboard-relevant file names located in the base_path directory
  and all sub-directories that have been modified since a certain time.
  
  If many files have been created, the syscall to stat on each of them can be quite
  expensive, taking on the order of 1ms for every 100 files. Each file gets stat'd every call
  to this function, which can be a bottleneck late in training or in local training when many
  files exist but few or none need to be re-synced.
docstr_tok: ["list_files","returns","Tensorboard-relevant","file","names","located","in","the","base_path","directory","and","all","sub-directories","that","have","been","modified","since","a","certain","time",".","If","many","files","have","been","created",",","the","syscall","to","stat","on","each","of","them","can","be","quite","expensive",",","taking","on","the","order","of","1ms","for","every","100","files",".","Each","file","gets","stat","'d","every","call","to","this","function",",","which","can","be","a","bottleneck","late","in","training","or","in","local","training","when","many","files","exist","but","few","or","none","need","to","be","re-synced","."]
code: def list_tb_files(
      self,
      since: float,
      selector: Callable[[pathlib.Path], bool],
  ) -> List[pathlib.Path]:
      """
      list_files returns Tensorboard-relevant file names located in the base_path directory
      and all sub-directories that have been modified since a certain time.
  
      If many files have been created, the syscall to stat on each of them can be quite
      expensive, taking on the order of 1ms for every 100 files. Each file gets stat'd every call
      to this function, which can be a bottleneck late in training or in local training when many
      files exist but few or none need to be re-synced.
      """
  
      if not self.base_path.exists():
          return []
      return [
          file
          for file in self.base_path.rglob("*")
          if file.stat().st_mtime > since
          and file.is_file()
          and selector(file)
      ]
  
imports: import abc
  import logging
  import pathlib
  import queue
  import threading
  import time
  from dataclasses import dataclass
  from typing import Any, Callable, List
  from determined import tensorboard
  from determined.common import util
label_desc: Use image node_id 2 for calling the TensorboardManager obj's underlying member method code with example usage: obj.list_tb_files(since, selector) and returns: unknown, list