code: def _build_dataloaders(
      tokenizer,
      train_dataset,
      eval_dataset,
      extra_eval_dataset,
      cfg_impl,
  ):
      """Construct dataloaders according to cfg_impl settings. Validation samplers always repeat on all devices."""
      train_dataloader = prepare_downstream_dataloader(
          train_dataset, tokenizer, "training", cfg_impl
      )
      eval_dataloader = prepare_downstream_dataloader(
          eval_dataset, tokenizer, "eval", cfg_impl
      )
      if extra_eval_dataset is not None:
          extra_eval_dataloader = prepare_downstream_dataloader(
              extra_eval_dataset, tokenizer, "eval", cfg_impl
          )
      else:
          extra_eval_dataloader = None
      return train_dataloader, eval_dataloader, extra_eval_dataloader
  
file_path: bert-ultrafast/training/cramming/data/downstream_task_preparation.py
imports: import torch
  import datasets
  import os
  import logging
  from collections import defaultdict
  from datasets import load_dataset
  from .pretraining_preparation import main_process_first
  from ..backend.utils import prepare_downstream_dataloader
label_desc: Use image node_id 2 for calling a global function with example usage: _build_dataloaders(tokenizer, train_dataset, eval_dataset, extra_eval_dataset, cfg_impl) and returns: train_dataloader,  eval_dataloader,  extra_eval_dataloader