class_docstr: Args:
      detached_trainer_name_list: str list to get ray actor handles
      strategy:
      kl_coef: the coefficient of kl divergence loss
      sync_models_from_trainers: whether to sync models from trainers. If True, you must call sync_models_to_remote_makers() in trainers to sync models.
class_docstr_tok: ["Args",":","detached_trainer_name_list",":","str","list","to","get","ray","actor","handles","strategy",":","kl_coef",":","the","coefficient","of","kl","divergence","loss","sync_models_from_trainers",":","whether","to","sync","models","from","trainers",".","If","True",",","you","must","call","sync_models_to_remote_makers","(",")","in","trainers","to","sync","models","."]
code: def _on_batch_end(self) -> None:
      for callback in self.callbacks:
          callback.on_batch_end()
  
imports: import os
  import time
  import tracemalloc
  from threading import Lock
  from typing import Any, Callable, Dict, Iterable, List, Tuple, Union
  import ray
  import torch
  from coati.experience_buffer.utils import split_experience_batch
  from coati.experience_maker import Experience, NaiveExperienceMaker
  from coati.models.base import Actor, Critic, RewardModel
  from coati.trainer.strategies import Strategy
  from torch import Tensor
  from tqdm import tqdm
  from .callbacks import ExperienceMakerPerformanceEvaluator, MakerCallback
  from .lora_constructor import LoRAConstructor
  from .utils import get_model_numel, get_rank, is_rank_0, set_dist_env, state_dict_to
label_desc: Use image node_id 17 for calling the ExperienceMakerHolder obj's underlying member method code with example usage: obj._on_batch_end() without return types