| import argparse |
| import lm_eval |
| import os |
| import json |
|
|
| TASKS = { |
| "blimp": ["anaphor_agreement.json", "argument_structure.json", "binding.json", |
| "control_raising.json", "determiner_noun_agreement.json", "ellipsis.json", |
| "filler_gap.json", "irregular_forms.json", "island_effects.json", |
| "npi_licensing.json", "quantifiers.json", "subject_verb_agreement.json"], |
| "supplement": ["hypernym.json", "qa_congruence_easy.json", "qa_congruence_tricky.json", |
| "subject_aux_inversion.json", "turn_taking.json"] |
| } |
|
|
|
|
| def accuracy_on_task(task_name, eval_model, template_name, num_fewshot): |
| predictions_path = os.path.join(args.model_path, "zeroshot", task_title, "predictions.txt") |
| predictions_dir = os.path.dirname(predictions_path) |
| if not os.path.exists(predictions_dir): |
| os.makedirs(predictions_dir) |
|
|
| eval_task = lm_eval.get_task_list(task_name, template_names=[template_name]) |
| results = lm_eval.evaluate(model=eval_model, tasks=eval_task, seed=12, |
| num_fewshot=num_fewshot, predictions_path=predictions_path) |
| accuracy = results['results'][0]['acc'] |
| return accuracy |
|
|
|
|
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser() |
| parser.add_argument("model_path", type=str, |
| help="Path to huggingface model and tokenizer.") |
| parser.add_argument("model_type", type=str, choices=["decoder only", "decoder", "encoder only", "encoder", "encoder-decoder",], |
| help="Language model architecture.") |
| parser.add_argument("--tasks", "-t", type=str, choices=["blimp", "supplement", "all"], default="all", |
| help="Tasks on which we evaluate.") |
| parser.add_argument("--run_aoa", "-a", action="store_true", |
| help="Will run the additional AoA prediction task.") |
| parser.add_argument("--trust_remote_code", "-r", action="store_true", |
| help="Trust remote code (e.g. from huggingface) when loading model.") |
| parser.add_argument("--num_fewshot", "-n", type=int, default=0, |
| help="Number of few-shot examples to show the model for each test example.") |
| args = parser.parse_args() |
|
|
| MODEL_TYPE_REMAP = {"decoder only": "hf-causal", "decoder": "hf-causal", |
| "encoder only": "hf-mlm", "encoder": "hf-mlm", |
| "encoder-decoder": "hf-seq2seq",} |
| eval_model = lm_eval.get_model(MODEL_TYPE_REMAP[args.model_type], |
| pretrained=args.model_path, |
| trust_remote_code=args.trust_remote_code, |
| device="cuda") |
| tasks = [] |
| if args.tasks == "all": |
| for task_type in TASKS.keys(): |
| tasks.extend(TASKS[task_type]) |
| else: |
| tasks = TASKS[args.tasks] |
|
|
| accuracies = {} |
| |
| for task in tasks: |
| if task in TASKS["blimp"]: |
| template = None |
| task_title = task.split(".json")[0] |
| task = f"blimp_from_file:filter-data/blimp_filtered/{task}" |
| elif task in TASKS["supplement"]: |
| template = None |
| task_title = task.split(".json")[0] |
| task = f"blimp_from_file:filter-data/supplement_filtered/{task}" |
| else: |
| raise ValueError("Unrecognized task!") |
| accuracies[task_title] = accuracy_on_task(task, eval_model, template, |
| args.num_fewshot) |
| print(f"{task_title}:\t{accuracies[task_title] * 100:.2f}%") |
| |
| out_path = os.path.join(args.model_path, "zeroshot", task_title, "eval_results.json") |
| out_dir = os.path.dirname(out_path) |
| if not os.path.exists(out_dir): |
| os.makedirs(out_dir) |
| with open(out_path, 'w') as out_file: |
| json.dump({"eval_accuracy": accuracies[task_title]}, out_file) |
|
|
| |
| print("\nScores:") |
| for task in accuracies.keys(): |
| print(f"{task}:\t{accuracies[task] * 100:.2f}%") |
|
|
| if args.run_aoa: |
| |
| word_surprisals_n, mad_results = lm_eval.aoa_pred_eval(eval_model.model, eval_model.tokenizer, MODEL_TYPE_REMAP[args.model_type], batch_size = 32) |
| out_dir = os.path.join(args.model_path, "aoa_prediction") |
| if not os.path.exists(out_dir): |
| os.makedirs(out_dir) |
| with open(os.path.join(out_dir, "extracted_average_surprisals.json") , 'w') as out_file: |
| json.dump(word_surprisals_n, out_file) |
| with open(os.path.join(out_dir, "mean_absolute_deviation_results.json"), 'w') as out_file: |
| json.dump(mad_results, out_file) |
|
|