in vision/m4/evaluation/launch.py [0:0]
def main(args):
accelerate.utils.set_seed(args.hparams.seed)
kwargs_handlers = [InitProcessGroupKwargs(timeout=timedelta(seconds=args.hparams.timeout))]
rngs_types = ["torch", "cuda", "generator"] if torch.cuda.is_available() else ["torch", "generator"]
accelerator = Accelerator(rng_types=rngs_types, kwargs_handlers=kwargs_handlers)
logging.basicConfig(
format="%(asctime)s - %(levelname)s - %(name)s - %(message)s",
datefmt="%m/%d/%Y %H:%M:%S",
level=logging.INFO,
)
args.hparams.save_to_jsonl.parent.mkdir(parents=True, exist_ok=True)
start = time()
args.hparams.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model_name = args.tasks.model_name
tokenizer_name = args.tasks.tokenizer_name if args.tasks.tokenizer_name is not None else args.tasks.model_name
evaluation_version = args.tasks.evaluation_version
tokenizer_use_fast = args.tasks.tokenizer_use_fast
vision_encoder_type = args.tasks.vision_encoder_type
scale_up_images = args.tasks.scale_up_images
image_size_after_scaling = args.tasks.image_size_after_scaling
do_tasks = args.tasks.do_tasks if args.tasks.do_tasks != ["all"] else ALL_TASKS
model = get_model_from_config_file(args, is_deepspeed=accelerator.distributed_type == DistributedType.DEEPSPEED)
model_config = model.config
logger.info("Model loaded.")
vision_encoder_max_image_size = model_config.vision_config.image_size
image_seq_len = (
model_config.perceiver_config.resampler_n_latents
if model_config.use_resampler
else int(((vision_encoder_max_image_size // model_config.vision_config.patch_size) ** 2) / 9)
)
dummy_dataloader = torch.utils.data.DataLoader([0 for _ in range(20)], batch_size=args.hparams.batch_size_per_gpu)
if accelerator.distributed_type == DistributedType.DEEPSPEED:
# Deepspeed doesn't allow custom device placement
_, model = accelerator.prepare(dummy_dataloader, model)
else:
_, model = accelerator.prepare(
dummy_dataloader,
model,
device_placement=[
False,
True,
], # Only letting accelerate handle the device placement for the model. For the dataloader, as it loads very big batches to then mini split them, we handle the device placement mini batch by mini batch.
)
for current_task in do_tasks:
task_class = getattr(tasks, current_task)
task = task_class(
model_name=model_name,
tokenizer_name=tokenizer_name,
tokenizer_use_fast=tokenizer_use_fast,
evaluation_version=evaluation_version,
vision_encoder_max_image_size=vision_encoder_max_image_size,
vision_encoder_type=vision_encoder_type,
image_seq_len=image_seq_len,
scale_up_images=scale_up_images,
image_size_after_scaling=image_size_after_scaling,
)
check_valid_tokenizer(task.tokenizer)
logger.info(f" *** Running {current_task} *** ")
evaluator = EVALUATOR_MAPPING[task.predictor_class]
score = evaluator(task, accelerator, model, args)
logger.info(f"{current_task} {score}")
is_main_process = True
try:
from accelerate.state import AcceleratorState
state = AcceleratorState()
is_main_process = state.process_index == 0
except ValueError:
# We are not using Accelerate
pass
if args.hparams.save_to_jsonl is not None and is_main_process:
prompt_template_id = get_prompt_template_id(args, task)
with open(args.hparams.save_to_jsonl, "a", newline="") as f_object:
data_dict = {
"model_name_or_path": model_name,
"task": current_task,
"score": str(score),
"evaluator": evaluator.__name__,
"in_context_params": {
"num_shots": args.tasks.in_context_params.num_shots,
"shot_selection_mode": args.tasks.in_context_params.shot_selection_mode.name,
"vision_encoder": args.tasks.in_context_params.vision_encoder_name,
},
"text_generation_params": {
"num_beams": args.tasks.text_generation_params.num_beams,
"no_repeat_ngram_size": args.tasks.text_generation_params.no_repeat_ngram_size,
"max_new_tokens": args.tasks.text_generation_params.max_new_tokens,
},
"evaluation_version": evaluation_version.name,
"commit_hash": args.hparams.commit_hash,
"prompt_template_id": prompt_template_id,
"dataset_split": args.tasks.dataset_split.value,
"scale_up_images": args.tasks.scale_up_images,
"image_size_after_scaling": args.tasks.image_size_after_scaling,
}
json.dump(data_dict, f_object)
f_object.write(os.linesep)
end = time()
logger.info(f"Took {end-start} seconds.")