ImageNetTrainLoop(
        study_name='imagenet',
        experiment_name='exp000',
        base_dir='/opt/scratch',
        working_dir=PosixPath('/opt/scratch/runs/imagenet/exp000'),
        doc='',
        step=ImageNetTrainStep.Config(
        │   model=TorchvisionResNet.Config(
        │       arch=PartialConfig(torchvision.models.resnet.resnet50),
        │       channels_out=1_000,
        │       use_blurpool=True,
        │       image_size=(160, 160)
        │   ),
        │   optimizer=CompositeOptimizer.Config(
        │       optimizers=[
        │           PartialConfig(
        │               <class 'torch.optim.sgd.SGD'>,
        │               lr=1.0,
        │               momentum=0.9,
        │               weight_decay=0.0
        │           ),
        │           PartialConfig(
        │               <class 'torch.optim.sgd.SGD'>,
        │               lr=1.0,
        │               momentum=0.9,
        │               weight_decay=0.0001
        │           )
        │       ],
        │       select=[matching('bn'), complement(matching('bn'))],
        │       require_total=True,
        │       drop_empty=False
        │   ),
        │   loss=SimpleLoss.Config(
        │       loss_fn=priml.loss.simple_loss.bce_with_logits,
        │       target_key='label',
        │       kwargs={'reduction': 'none'},
        │       channels_out=-1
        │   ),
        │   accumulate_grad_batches=1,
        │   drop_partial_accumulation_on_epoch_end=True,
        │   train_budget_steps=40_032,
        │   train_budget_sec=inf,
        │   train_budget_epochs=inf,
        │   lr_schedule=PartialConfig(priml.math.schedules.constant),
        │   parallelism=NoParallel.Config(device=None),
        │   model_quantization=NoModelQuantization.Config(),
        │   activation_memoization=DefaultActivationStorage.Config(),
        │   compile=PartialConfig(torch.compile, fullgraph=True),
        │   ema=NoEMA.Config(),
        │   gradient_clip_norm=inf,
        │   skip_step_on_nonfinite_grad=False,
        │   device_init='eager',
        │   dtype_autocast=torch.float16,
        │   autocast_cache_enabled=False,
        │   schedule=PartialConfig(priml.math.schedules.cyclic, peak=0.125),
        │   learning_rate=0.5,
        │   label_smoothing=0.1,
        │   resolution_min=160,
        │   resolution_max=192,
        │   resize_start=0.6875,
        │   resize_end=0.8125,
        │   use_tta=True,
        │   loss_scale_init=65536.0,
        │   mean=(0.485, 0.456, 0.406),
        │   std=(0.229, 0.224, 0.225)
        ),
        dataset=ImageNetData.Config(
        │   train_data_pipeline=DataPipeline.Config(
        │   │   source=ExtractedImageNetSource.Config(
        │   │       base_dir=PosixPath('/opt/scratch'),
        │   │       working_dir=PosixPath('/opt/scratch/datasets/imagenet'),
        │   │       split='train',
        │   │       validation_labels_file=None,
        │   │       worker_slice=None,
        │   │       shuffle=True,
        │   │       epoch_seed=0
        │   │   ),
        │   │   processors=[
        │   │   │   GetBytesFromFile.Config(),
        │   │   │   GetDimensionsFromBytes.Config(),
        │   │   │   ImagenetSynsetToIndex.Config(
        │   │   │       labels_file='labels_imagenet.txt'
        │   │   │   ),
        │   │   │   GetRandomResizedCropBoxFromDimensions.Config(
        │   │   │       size=(160, 160),
        │   │   │       scale=(0.08, 1.0),
        │   │   │       ratio=(0.75, 1.3333333333333333)
        │   │   │   ),
        │   │   │   FieldRenameKeys.Config(
        │   │   │       mappings={   'media': 'media',
        │   │   │           'crop': 'crop',
        │   │   │           'target_height': 'target_height',
        │   │   │           'target_width': 'target_width',
        │   │   │           'label': 'label',
        │   │   │           '*': None}
        │   │   │   ),
        │   │   │   Batcher.Config(
        │   │   │       size=512,
        │   │   │       field_names=[
        │   │   │           'media',
        │   │   │           'crop',
        │   │   │           'target_height',
        │   │   │           'target_width',
        │   │   │           'label'
        │   │   │       ],
        │   │   │       drop_remainder=True,
        │   │   │       device=None
        │   │   │   ),
        │   │   │   DecodeCropResizeBatch.Config(
        │   │   │       num_threads=2,
        │   │   │       flip_p=0.5,
        │   │   │       scale_to_target=False,
        │   │   │       fast_dct=True
        │   │   │   ),
        │   │   │   AsTensor.Config(
        │   │   │       device=None,
        │   │   │       dtype=torch.int64,
        │   │   │       include=['label'],
        │   │   │       exclude=['raw'],
        │   │   │       pin_memory=False,
        │   │   │       non_blocking=False,
        │   │   │       stream_field='pending_tensorizations'
        │   │   │   ),
        │   │   │   PrefetchBuffer.Config(
        │   │   │       size=2,
        │   │   │       fill_first=False,
        │   │   │       poll_sec=0.1
        │   │   │   )
        │   │   ],
        │   │   filters_shortcircuit=True,
        │   │   enable_cache=False,
        │   │   base_dir=PosixPath('/opt/scratch'),
        │   │   working_dir=PosixPath('/opt/scratch')
        │   ),
        │   eval_data_pipeline=DataPipeline.Config(
        │   │   source=ExtractedImageNetSource.Config(
        │   │       base_dir=PosixPath('/opt/scratch'),
        │   │       working_dir=PosixPath('/opt/scratch/datasets/imagenet'),
        │   │       split='val',
        │   │       validation_labels_file=PosixPath('validation_labels.txt'),
        │   │       worker_slice=None,
        │   │       shuffle=False,
        │   │       epoch_seed=0
        │   │   ),
        │   │   processors=[
        │   │   │   ImagenetSynsetToIndex.Config(
        │   │   │       labels_file='labels_imagenet.txt'
        │   │   │   ),
        │   │   │   GetBytesFromFile.Config(),
        │   │   │   GetDimensionsFromBytes.Config(),
        │   │   │   GetCenterCropBoxFromDimensions.Config(
        │   │   │       size=(256, 256),
        │   │   │       ratio=0.875
        │   │   │   ),
        │   │   │   FieldRenameKeys.Config(
        │   │   │       mappings={   'media': 'media',
        │   │   │           'crop': 'crop',
        │   │   │           'target_height': 'target_height',
        │   │   │           'target_width': 'target_width',
        │   │   │           'label': 'label',
        │   │   │           '*': None}
        │   │   │   ),
        │   │   │   Batcher.Config(
        │   │   │       size=512,
        │   │   │       field_names=[
        │   │   │           'media',
        │   │   │           'crop',
        │   │   │           'target_height',
        │   │   │           'target_width',
        │   │   │           'label'
        │   │   │       ],
        │   │   │       drop_remainder=False,
        │   │   │       device=None
        │   │   │   ),
        │   │   │   DecodeCropResizeBatch.Config(
        │   │   │       num_threads=2,
        │   │   │       flip_p=0.0,
        │   │   │       scale_to_target=False,
        │   │   │       fast_dct=True
        │   │   │   ),
        │   │   │   AsTensor.Config(
        │   │   │       device=None,
        │   │   │       dtype=torch.int64,
        │   │   │       include=['label'],
        │   │   │       exclude=['raw'],
        │   │   │       pin_memory=False,
        │   │   │       non_blocking=False,
        │   │   │       stream_field='pending_tensorizations'
        │   │   │   ),
        │   │   │   PrefetchBuffer.Config(
        │   │   │       size=4,
        │   │   │       fill_first=False,
        │   │   │       poll_sec=0.1
        │   │   │   )
        │   │   ],
        │   │   filters_shortcircuit=True,
        │   │   enable_cache=False,
        │   │   base_dir=PosixPath('/opt/scratch'),
        │   │   working_dir=PosixPath('/opt/scratch')
        │   ),
        │   num_workers=0,
        │   prefetch_factor=2,
        │   base_dir='/opt/scratch',
        │   working_dir=PosixPath('/opt/scratch')
        ),
        metrics_train={},
        metrics_eval={'accuracy': TopK.Config(k_values=[1, 5])},
        checkpointer=Checkpointer.Config(
            base_dir=PosixPath('/opt/scratch/runs/imagenet/exp000'),
            working_dir=PosixPath('/opt/scratch/runs/imagenet/exp000/checkpoints'),
            filename='step_{step:08d}.pt',
            save_every=1_000,
            keep_last_n=-1,
            keep_every=0,
            storer=SyncLocalStateDictStorer.Config(),
            resume=True,
            resume_step=-1,
            allow_checkpoint_overwrite=False,
            best_metric='',
            best_mode='max'
        ),
        profiler=None,
        phase_timer=PhaseTimer.Config(
            enabled=False,
            torch_profile=False,
            base_dir=PosixPath('/opt/scratch/runs/imagenet/exp000'),
            working_dir=PosixPath('/opt/scratch/runs/imagenet/exp000/profiling'),
            heartbeat_interval_sec=20.0,
            fault_dump_interval_sec=40.0,
            cuda_events=False
        ),
        tracker=None,
        max_steps=40_032,
        max_epochs=inf,
        max_time=inf,
        max_time_kind='wall',
        max_eval_time=inf,
        eval_stop_on_time_limit=False,
        num_steps_eval=2_502,
        num_steps_log=10,
        early_train_log_steps=100,
        eval_every_epoch=True,
        eval_extras_every_eval=False,
        eval_warmup_batches=0,
        eval_only=False,
        restore_rng_state=True,
        seed=None,
        model_torch_seed=None,
        num_steps_garbage_collect=inf,
        mesh_dim_model_seed='pp',
        mesh_dim_data_seed='dp',
        runtime=SingleProcess.Config(
            device=None,
            deterministic=False,
            float32_matmul_precision=None
        )
    )
