(args)
| 111 | |
| 112 | @hydra.main(config_path="config", config_name="default", version_base=None) |
| 113 | def main(args): |
| 114 | assert torch.cuda.is_available(), "Training currently requires at least one GPU." |
| 115 | from accelerate.utils import AutocastKwargs |
| 116 | |
| 117 | kwargs = AutocastKwargs(enabled=True) |
| 118 | # https://github.com/pytorch/pytorch/issues/40497#issuecomment-709846922 |
| 119 | # https://github.com/huggingface/accelerate/issues/2487#issuecomment-1969997224 |
| 120 | |
| 121 | accelerator = accelerate.Accelerator( |
| 122 | kwargs_handlers=[kwargs], mixed_precision=args.mixed_precision |
| 123 | ) |
| 124 | device = accelerator.device |
| 125 | accelerate.utils.set_seed(args.global_seed, device_specific=True) |
| 126 | rank = accelerator.state.process_index |
| 127 | logging.info( |
| 128 | f"Starting rank={rank}, world_size={accelerator.state.num_processes}, accelerator.mixed_precision={accelerator.mixed_precision},device={device}." |
| 129 | ) |
| 130 | is_multiprocess = True if accelerator.state.num_processes > 1 else False |
| 131 | if accelerator.state.num_processes >= 4 * 8: |
| 132 | args.data.sample_fid_n = min(args.data.sample_fid_n, 1_000) |
| 133 | print( |
| 134 | "decreasing sample_fid_n to 1_000 in node with >= 4*8 GPUs, an unknown bug from torchmetrics" |
| 135 | ) |
| 136 | |
| 137 | _fid_eval_batch_nums = args.data.sample_fid_n // ( |
| 138 | args.data.sample_fid_bs * accelerator.state.num_processes |
| 139 | ) |
| 140 | assert _fid_eval_batch_nums > 0, f"{_fid_eval_batch_nums} <= 0" |
| 141 | |
| 142 | slurm_job_id = os.environ.get("SLURM_JOB_ID") |
| 143 | logging.info(f"slurm_job_id: {slurm_job_id}") |
| 144 | |
| 145 | local_bs = args.data.batch_size |
| 146 | |
| 147 | train_steps = 0 |
| 148 | |
| 149 | accelerator.wait_for_everyone() |
| 150 | if accelerator.is_main_process: |
| 151 | logging.info(args) |
| 152 | experiment_dir = HydraConfig.get().run.dir |
| 153 | logging.info(f"Experiment directory created at {experiment_dir}") |
| 154 | checkpoint_dir = ( |
| 155 | f"{experiment_dir}/checkpoints" # Stores saved model checkpoints |
| 156 | ) |
| 157 | os.makedirs(checkpoint_dir, exist_ok=True) |
| 158 | logger = create_logger(rank, experiment_dir) |
| 159 | logger.info(f"Experiment directory created at {experiment_dir}") |
| 160 | |
| 161 | if args.use_wandb: |
| 162 | config_dict = OmegaConf.to_container(args, resolve=True) |
| 163 | config_dict = { |
| 164 | **config_dict, |
| 165 | "experiment_dir": experiment_dir, |
| 166 | "world_size": accelerator.state.num_processes, |
| 167 | "local_batch_size": args.data.batch_size |
| 168 | * accelerator.state.num_processes, |
| 169 | "job_id": slurm_job_id, |
| 170 | } |
no test coverage detected