From 2c03baf04b363c0509e8a3561390b788f06916e9 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Tue, 16 Apr 2024 13:29:46 +0000 Subject: [PATCH 001/181] Squashed commits from internal development repo --- .github/issue_template.md | 0 .github/pull_request_template.md | 0 .github/workflows/black.yml | 0 .gitignore | 0 .pre-commit-config.yaml | 0 README.md | 0 docs/README.md | 0 docs/commands.md | 0 docs/model_guide.md | 0 docs/task_guide.md | 0 example_eval.yaml | 11 +- llava_repr_requirements.txt | 17 - lmms_eval/__init__.py | 0 lmms_eval/__main__.py | 0 lmms_eval/api/__init__.py | 0 lmms_eval/api/filter.py | 0 lmms_eval/api/instance.py | 0 lmms_eval/api/metrics.py | 0 lmms_eval/api/model.py | 0 lmms_eval/api/registry.py | 0 lmms_eval/api/samplers.py | 4 +- lmms_eval/api/task.py | 25 ++ lmms_eval/evaluator.py | 0 lmms_eval/filters/__init__.py | 3 +- lmms_eval/filters/decontamination.py | 0 lmms_eval/filters/extraction.py | 186 ++++++++- lmms_eval/filters/selection.py | 0 lmms_eval/filters/transformation.py | 0 lmms_eval/logging_utils.py | 18 +- lmms_eval/models/__init__.py | 11 +- lmms_eval/models/fuyu.py | 2 +- lmms_eval/models/gpt4v.py | 17 +- lmms_eval/models/instructblip.py | 2 + lmms_eval/models/llava.py | 63 +++- lmms_eval/models/llava_vid.py | 356 ++++++++++++++++++ lmms_eval/models/minicpm_v.py | 0 lmms_eval/models/model_utils/__init__.py | 0 .../model_utils/qwen/qwen_generate_utils.py | 0 lmms_eval/models/qwen_vl.py | 5 +- lmms_eval/tasks/__init__.py | 0 lmms_eval/tasks/_task_utils/file_utils.py | 0 lmms_eval/tasks/_task_utils/gpt_eval_utils.py | 0 .../tasks/_task_utils/vqa_eval_metric.py | 0 lmms_eval/tasks/ai2d/ai2d.yaml | 0 lmms_eval/tasks/ai2d/upload_ai2d.py | 0 lmms_eval/tasks/ai2d/utils.py | 0 lmms_eval/tasks/chartqa/chartqa.yaml | 0 lmms_eval/tasks/chartqa/upload_chartqa.py | 0 lmms_eval/tasks/chartqa/utils.py | 0 lmms_eval/tasks/cmmmu/_cmmmu.yaml | 0 .../tasks/cmmmu/_default_template_cmmmu_yaml | 0 lmms_eval/tasks/cmmmu/cmmmu_test.yaml | 0 lmms_eval/tasks/cmmmu/cmmmu_val.yaml | 0 lmms_eval/tasks/cmmmu/utils.py | 0 lmms_eval/tasks/coco_cap/coco2014_cap.yaml | 0 .../tasks/coco_cap/coco2014_cap_test.yaml | 0 .../tasks/coco_cap/coco2014_cap_val.yaml | 0 lmms_eval/tasks/coco_cap/coco2017_cap.yaml | 0 .../tasks/coco_cap/coco2017_cap_test.yaml | 0 .../tasks/coco_cap/coco2017_cap_val.yaml | 0 lmms_eval/tasks/coco_cap/coco_cap.yaml | 0 lmms_eval/tasks/coco_cap/utils.py | 0 .../docvqa/_default_template_docvqa_yaml | 0 lmms_eval/tasks/docvqa/docvqa.yaml | 0 lmms_eval/tasks/docvqa/docvqa_test.yaml | 0 lmms_eval/tasks/docvqa/docvqa_val.yaml | 0 lmms_eval/tasks/docvqa/utils.py | 0 lmms_eval/tasks/ferret/ferret.yaml | 0 lmms_eval/tasks/ferret/rule.json | 0 lmms_eval/tasks/ferret/utils.py | 0 lmms_eval/tasks/flickr30k/flickr30k.yaml | 0 lmms_eval/tasks/flickr30k/flickr30k_test.yaml | 0 lmms_eval/tasks/flickr30k/utils.py | 0 lmms_eval/tasks/gqa/gqa.yaml | 0 lmms_eval/tasks/gqa/utils.py | 0 .../tasks/hallusion_bench/evaluate_hb.py | 0 .../hallusion_bench_image.yaml | 0 lmms_eval/tasks/hallusion_bench/utils.py | 0 .../iconqa/_default_template_docvqa_yaml | 0 lmms_eval/tasks/iconqa/iconqa.yaml | 0 lmms_eval/tasks/iconqa/iconqa_test.yaml | 0 lmms_eval/tasks/iconqa/iconqa_val.yaml | 0 lmms_eval/tasks/iconqa/utils.py | 0 .../infovqa/_default_template_infovqa_yaml | 0 lmms_eval/tasks/infovqa/infovqa.yaml | 0 lmms_eval/tasks/infovqa/infovqa_test.yaml | 0 lmms_eval/tasks/infovqa/infovqa_val.yaml | 0 lmms_eval/tasks/infovqa/utils.py | 0 .../llava-bench-coco/llava-bench-coco.yaml | 0 lmms_eval/tasks/llava-bench-coco/rule.json | 0 lmms_eval/tasks/llava-bench-coco/utils.py | 0 .../llava-in-the-wild/llava-in-the-wild.yaml | 0 lmms_eval/tasks/llava-in-the-wild/rule.json | 0 lmms_eval/tasks/llava-in-the-wild/utils.py | 0 lmms_eval/tasks/mathvista/mathvista.yaml | 0 lmms_eval/tasks/mathvista/mathvista_evals.py | 2 +- lmms_eval/tasks/mathvista/mathvista_test.yaml | 0 .../tasks/mathvista/mathvista_testmini.yaml | 0 lmms_eval/tasks/mathvista/utils.py | 0 .../tasks/mix_evals/_default_template_yaml | 9 + .../tasks/mix_evals/mix_evals_video2text.yaml | 5 + .../mix_evals_video2text_freeform.yaml | 20 + .../mix_evals/mix_evals_video2text_mc.yaml | 28 ++ .../mix_evals_video2text_openended.yaml | 13 + lmms_eval/tasks/mix_evals/utils.py | 200 ++++++++++ lmms_eval/tasks/mmbench/cc_utils.py | 0 lmms_eval/tasks/mmbench/cn_utils.py | 0 lmms_eval/tasks/mmbench/en_utils.py | 0 lmms_eval/tasks/mmbench/mmbench.yaml | 0 lmms_eval/tasks/mmbench/mmbench_cc.yaml | 0 lmms_eval/tasks/mmbench/mmbench_cn.yaml | 0 lmms_eval/tasks/mmbench/mmbench_cn_dev.yaml | 0 lmms_eval/tasks/mmbench/mmbench_cn_test.yaml | 0 lmms_eval/tasks/mmbench/mmbench_en.yaml | 0 lmms_eval/tasks/mmbench/mmbench_en_dev.yaml | 0 lmms_eval/tasks/mmbench/mmbench_en_test.yaml | 0 lmms_eval/tasks/mmbench/mmbench_evals.py | 0 lmms_eval/tasks/mme/mme.yaml | 0 lmms_eval/tasks/mme/utils.py | 0 lmms_eval/tasks/mmmu/mmmu.yaml | 0 lmms_eval/tasks/mmmu/mmmu_test.yaml | 0 lmms_eval/tasks/mmmu/mmmu_val.yaml | 0 lmms_eval/tasks/mmmu/utils.py | 12 +- lmms_eval/tasks/mmvet/mmvet.yaml | 0 lmms_eval/tasks/mmvet/utils.py | 0 lmms_eval/tasks/multidocvqa/multidocvqa.yaml | 0 .../tasks/multidocvqa/multidocvqa_test.yaml | 0 .../tasks/multidocvqa/multidocvqa_val.yaml | 0 lmms_eval/tasks/multidocvqa/utils.py | 0 .../nocaps/_default_template_nocaps_yaml | 0 lmms_eval/tasks/nocaps/nocaps.yaml | 0 lmms_eval/tasks/nocaps/nocaps_test.yaml | 0 lmms_eval/tasks/nocaps/nocaps_val.yaml | 0 lmms_eval/tasks/nocaps/utils.py | 0 .../tasks/ok_vqa/_default_template_vqa_yaml | 0 lmms_eval/tasks/ok_vqa/_generate_config.py | 0 lmms_eval/tasks/ok_vqa/_ok_vqa.yaml | 0 lmms_eval/tasks/ok_vqa/ok_vqa_val2014.yaml | 0 lmms_eval/tasks/ok_vqa/utils.py | 0 lmms_eval/tasks/olympiadbench/cn_utils.py | 18 +- lmms_eval/tasks/olympiadbench/en_utils.py | 24 +- .../olympiadbench/olympiadbench_evals.py | 72 ++-- lmms_eval/tasks/pope/pope.yaml | 0 lmms_eval/tasks/pope/utils.py | 0 lmms_eval/tasks/realworldqa/realworldqa.yaml | 42 +++ lmms_eval/tasks/realworldqa/utils.py | 117 ++++++ .../refcoco+/_default_template_bbox_yaml | 0 .../tasks/refcoco+/_default_template_seg_yaml | 0 lmms_eval/tasks/refcoco+/_generate_config.py | 0 lmms_eval/tasks/refcoco+/_refcoco.yaml | 0 .../tasks/refcoco+/refcoco+_bbox_testA.yaml | 0 .../tasks/refcoco+/refcoco+_bbox_testB.yaml | 0 .../tasks/refcoco+/refcoco+_bbox_val.yaml | 0 .../tasks/refcoco+/refcoco+_seg_testA.yaml | 0 .../tasks/refcoco+/refcoco+_seg_testB.yaml | 0 .../tasks/refcoco+/refcoco+_seg_val.yaml | 0 lmms_eval/tasks/refcoco+/utils.py | 0 .../tasks/refcoco/_default_template_bbox_yaml | 0 .../tasks/refcoco/_default_template_seg_yaml | 0 lmms_eval/tasks/refcoco/_generate_config.py | 0 lmms_eval/tasks/refcoco/_refcoco.yaml | 0 .../tasks/refcoco/refcoco_bbox_test.yaml | 0 .../tasks/refcoco/refcoco_bbox_testA.yaml | 0 .../tasks/refcoco/refcoco_bbox_testB.yaml | 0 lmms_eval/tasks/refcoco/refcoco_bbox_val.yaml | 0 lmms_eval/tasks/refcoco/refcoco_seg_test.yaml | 0 .../tasks/refcoco/refcoco_seg_testA.yaml | 0 .../tasks/refcoco/refcoco_seg_testB.yaml | 0 lmms_eval/tasks/refcoco/refcoco_seg_val.yaml | 0 lmms_eval/tasks/refcoco/utils.py | 0 .../refcocog/_default_template_bbox_yaml | 0 .../tasks/refcocog/_default_template_seg_yaml | 0 lmms_eval/tasks/refcocog/_generate_config.py | 0 lmms_eval/tasks/refcocog/_refcoco.yaml | 0 .../tasks/refcocog/refcocog_bbox_test.yaml | 0 .../tasks/refcocog/refcocog_bbox_val.yaml | 0 .../tasks/refcocog/refcocog_seg_test.yaml | 0 .../tasks/refcocog/refcocog_seg_val.yaml | 0 lmms_eval/tasks/refcocog/utils.py | 0 lmms_eval/tasks/scienceqa/scienceqa.yaml | 0 lmms_eval/tasks/scienceqa/scienceqa_full.yaml | 0 lmms_eval/tasks/scienceqa/scienceqa_img.yaml | 0 lmms_eval/tasks/scienceqa/utils.py | 0 lmms_eval/tasks/seedbench/seedbench.yaml | 0 lmms_eval/tasks/seedbench/seedbench_ppl.yaml | 0 lmms_eval/tasks/seedbench/utils.py | 0 lmms_eval/tasks/seedbench_2/seedbench_2.yaml | 0 lmms_eval/tasks/seedbench_2/utils.py | 0 .../_default_sft_eval_ocr_rec_template_yaml | 23 ++ .../_default_sft_eval_rest_template_yaml | 20 + lmms_eval/tasks/sft_eval/_generate_config.py | 94 +++++ lmms_eval/tasks/sft_eval/_sft_eval.yaml | 34 ++ lmms_eval/tasks/sft_eval/sft_activity.yaml | 5 + lmms_eval/tasks/sft_eval/sft_arts.yaml | 5 + lmms_eval/tasks/sft_eval/sft_body.yaml | 5 + lmms_eval/tasks/sft_eval/sft_car.yaml | 5 + lmms_eval/tasks/sft_eval/sft_color.yaml | 5 + lmms_eval/tasks/sft_eval/sft_commodity.yaml | 5 + lmms_eval/tasks/sft_eval/sft_count.yaml | 5 + lmms_eval/tasks/sft_eval/sft_daily.yaml | 5 + lmms_eval/tasks/sft_eval/sft_engineer.yaml | 5 + .../tasks/sft_eval/sft_entertainment.yaml | 5 + lmms_eval/tasks/sft_eval/sft_exist.yaml | 5 + lmms_eval/tasks/sft_eval/sft_face.yaml | 5 + lmms_eval/tasks/sft_eval/sft_food.yaml | 5 + lmms_eval/tasks/sft_eval/sft_healthcare.yaml | 5 + lmms_eval/tasks/sft_eval/sft_landmark.yaml | 5 + lmms_eval/tasks/sft_eval/sft_logo.yaml | 5 + lmms_eval/tasks/sft_eval/sft_natural.yaml | 5 + lmms_eval/tasks/sft_eval/sft_ocr_qa_adv.yaml | 5 + .../tasks/sft_eval/sft_ocr_qa_chart.yaml | 5 + lmms_eval/tasks/sft_eval/sft_ocr_qa_form.yaml | 5 + .../tasks/sft_eval/sft_ocr_qa_scene.yaml | 5 + .../tasks/sft_eval/sft_ocr_qa_screen.yaml | 5 + lmms_eval/tasks/sft_eval/sft_ocr_rec_adv.yaml | 5 + lmms_eval/tasks/sft_eval/sft_ocr_rec_doc.yaml | 5 + .../tasks/sft_eval/sft_ocr_rec_handwrite.yaml | 5 + .../tasks/sft_eval/sft_ocr_rec_markdown.yaml | 5 + .../tasks/sft_eval/sft_ocr_rec_scene.yaml | 5 + .../tasks/sft_eval/sft_ocr_rec_screen.yaml | 5 + lmms_eval/tasks/sft_eval/sft_place.yaml | 5 + lmms_eval/tasks/sft_eval/sft_position.yaml | 5 + lmms_eval/tasks/sft_eval/sft_sport.yaml | 5 + lmms_eval/tasks/sft_eval/sft_status.yaml | 5 + lmms_eval/tasks/sft_eval/utils.py | 109 ++++++ lmms_eval/tasks/stvqa/stvqa.yaml | 0 lmms_eval/tasks/stvqa/utils.py | 0 .../textcaps/_default_template_textcaps_yaml | 0 lmms_eval/tasks/textcaps/textcaps.yaml | 0 lmms_eval/tasks/textcaps/textcaps_test.yaml | 0 lmms_eval/tasks/textcaps/textcaps_train.yaml | 0 lmms_eval/tasks/textcaps/textcaps_val.yaml | 0 lmms_eval/tasks/textcaps/utils.py | 0 .../textvqa/_default_template_textvqa_yaml | 0 lmms_eval/tasks/textvqa/_textvqa.yaml | 0 lmms_eval/tasks/textvqa/textvqa_test.yaml | 0 lmms_eval/tasks/textvqa/textvqa_val.yaml | 0 lmms_eval/tasks/textvqa/utils.py | 0 .../vizwiz_vqa/_default_template_vqa_yaml | 0 .../tasks/vizwiz_vqa/_generate_config.py | 0 lmms_eval/tasks/vizwiz_vqa/_vizwiz_vqa.yaml | 0 lmms_eval/tasks/vizwiz_vqa/utils.py | 0 .../tasks/vizwiz_vqa/vizwiz_vqa_test.yaml | 0 .../tasks/vizwiz_vqa/vizwiz_vqa_val.yaml | 0 .../tasks/vqav2/_default_template_vqav2_yaml | 0 lmms_eval/tasks/vqav2/_vqav2.yaml | 0 lmms_eval/tasks/vqav2/utils.py | 0 lmms_eval/tasks/vqav2/vqav2_test.yaml | 0 lmms_eval/tasks/vqav2/vqav2_val.yaml | 0 .../tasks/worldqa/_default_template_yaml | 10 + lmms_eval/tasks/worldqa/utils.py | 113 ++++++ .../tasks/worldqa/worldqa_generation.yaml | 13 + lmms_eval/tasks/worldqa/worldqa_mc.yaml | 11 + lmms_eval/tasks/worldqa/worldqa_mcppl.yaml | 11 + lmms_eval/utils.py | 0 miscs/llava_result_check.md | 0 miscs/repr_scripts.sh | 0 miscs/repr_torch_envs.txt | 0 miscs/scienceqa_id.txt | 0 miscs/script.sh | 2 +- miscs/test_llava.py | 0 miscs/test_scienceqa.py | 0 pyproject.toml | 7 +- setup.py | 0 tools/make_hf_dataset.ipynb | 0 265 files changed, 1730 insertions(+), 159 deletions(-) mode change 100644 => 100755 .github/issue_template.md mode change 100644 => 100755 .github/pull_request_template.md mode change 100644 => 100755 .github/workflows/black.yml mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .pre-commit-config.yaml mode change 100644 => 100755 README.md mode change 100644 => 100755 docs/README.md mode change 100644 => 100755 docs/commands.md mode change 100644 => 100755 docs/model_guide.md mode change 100644 => 100755 docs/task_guide.md mode change 100644 => 100755 example_eval.yaml mode change 100644 => 100755 llava_repr_requirements.txt mode change 100644 => 100755 lmms_eval/__init__.py mode change 100644 => 100755 lmms_eval/__main__.py mode change 100644 => 100755 lmms_eval/api/__init__.py mode change 100644 => 100755 lmms_eval/api/filter.py mode change 100644 => 100755 lmms_eval/api/instance.py mode change 100644 => 100755 lmms_eval/api/metrics.py mode change 100644 => 100755 lmms_eval/api/model.py mode change 100644 => 100755 lmms_eval/api/registry.py mode change 100644 => 100755 lmms_eval/api/samplers.py mode change 100644 => 100755 lmms_eval/api/task.py mode change 100644 => 100755 lmms_eval/evaluator.py mode change 100644 => 100755 lmms_eval/filters/__init__.py mode change 100644 => 100755 lmms_eval/filters/decontamination.py mode change 100644 => 100755 lmms_eval/filters/extraction.py mode change 100644 => 100755 lmms_eval/filters/selection.py mode change 100644 => 100755 lmms_eval/filters/transformation.py mode change 100644 => 100755 lmms_eval/logging_utils.py mode change 100644 => 100755 lmms_eval/models/__init__.py mode change 100644 => 100755 lmms_eval/models/fuyu.py mode change 100644 => 100755 lmms_eval/models/gpt4v.py mode change 100644 => 100755 lmms_eval/models/instructblip.py mode change 100644 => 100755 lmms_eval/models/llava.py create mode 100755 lmms_eval/models/llava_vid.py mode change 100644 => 100755 lmms_eval/models/minicpm_v.py mode change 100644 => 100755 lmms_eval/models/model_utils/__init__.py mode change 100644 => 100755 lmms_eval/models/model_utils/qwen/qwen_generate_utils.py mode change 100644 => 100755 lmms_eval/models/qwen_vl.py mode change 100644 => 100755 lmms_eval/tasks/__init__.py mode change 100644 => 100755 lmms_eval/tasks/_task_utils/file_utils.py mode change 100644 => 100755 lmms_eval/tasks/_task_utils/gpt_eval_utils.py mode change 100644 => 100755 lmms_eval/tasks/_task_utils/vqa_eval_metric.py mode change 100644 => 100755 lmms_eval/tasks/ai2d/ai2d.yaml mode change 100644 => 100755 lmms_eval/tasks/ai2d/upload_ai2d.py mode change 100644 => 100755 lmms_eval/tasks/ai2d/utils.py mode change 100644 => 100755 lmms_eval/tasks/chartqa/chartqa.yaml mode change 100644 => 100755 lmms_eval/tasks/chartqa/upload_chartqa.py mode change 100644 => 100755 lmms_eval/tasks/chartqa/utils.py mode change 100644 => 100755 lmms_eval/tasks/cmmmu/_cmmmu.yaml mode change 100644 => 100755 lmms_eval/tasks/cmmmu/_default_template_cmmmu_yaml mode change 100644 => 100755 lmms_eval/tasks/cmmmu/cmmmu_test.yaml mode change 100644 => 100755 lmms_eval/tasks/cmmmu/cmmmu_val.yaml mode change 100644 => 100755 lmms_eval/tasks/cmmmu/utils.py mode change 100644 => 100755 lmms_eval/tasks/coco_cap/coco2014_cap.yaml mode change 100644 => 100755 lmms_eval/tasks/coco_cap/coco2014_cap_test.yaml mode change 100644 => 100755 lmms_eval/tasks/coco_cap/coco2014_cap_val.yaml mode change 100644 => 100755 lmms_eval/tasks/coco_cap/coco2017_cap.yaml mode change 100644 => 100755 lmms_eval/tasks/coco_cap/coco2017_cap_test.yaml mode change 100644 => 100755 lmms_eval/tasks/coco_cap/coco2017_cap_val.yaml mode change 100644 => 100755 lmms_eval/tasks/coco_cap/coco_cap.yaml mode change 100644 => 100755 lmms_eval/tasks/coco_cap/utils.py mode change 100644 => 100755 lmms_eval/tasks/docvqa/_default_template_docvqa_yaml mode change 100644 => 100755 lmms_eval/tasks/docvqa/docvqa.yaml mode change 100644 => 100755 lmms_eval/tasks/docvqa/docvqa_test.yaml mode change 100644 => 100755 lmms_eval/tasks/docvqa/docvqa_val.yaml mode change 100644 => 100755 lmms_eval/tasks/docvqa/utils.py mode change 100644 => 100755 lmms_eval/tasks/ferret/ferret.yaml mode change 100644 => 100755 lmms_eval/tasks/ferret/rule.json mode change 100644 => 100755 lmms_eval/tasks/ferret/utils.py mode change 100644 => 100755 lmms_eval/tasks/flickr30k/flickr30k.yaml mode change 100644 => 100755 lmms_eval/tasks/flickr30k/flickr30k_test.yaml mode change 100644 => 100755 lmms_eval/tasks/flickr30k/utils.py mode change 100644 => 100755 lmms_eval/tasks/gqa/gqa.yaml mode change 100644 => 100755 lmms_eval/tasks/gqa/utils.py mode change 100644 => 100755 lmms_eval/tasks/hallusion_bench/evaluate_hb.py mode change 100644 => 100755 lmms_eval/tasks/hallusion_bench/hallusion_bench_image.yaml mode change 100644 => 100755 lmms_eval/tasks/hallusion_bench/utils.py mode change 100644 => 100755 lmms_eval/tasks/iconqa/_default_template_docvqa_yaml mode change 100644 => 100755 lmms_eval/tasks/iconqa/iconqa.yaml mode change 100644 => 100755 lmms_eval/tasks/iconqa/iconqa_test.yaml mode change 100644 => 100755 lmms_eval/tasks/iconqa/iconqa_val.yaml mode change 100644 => 100755 lmms_eval/tasks/iconqa/utils.py mode change 100644 => 100755 lmms_eval/tasks/infovqa/_default_template_infovqa_yaml mode change 100644 => 100755 lmms_eval/tasks/infovqa/infovqa.yaml mode change 100644 => 100755 lmms_eval/tasks/infovqa/infovqa_test.yaml mode change 100644 => 100755 lmms_eval/tasks/infovqa/infovqa_val.yaml mode change 100644 => 100755 lmms_eval/tasks/infovqa/utils.py mode change 100644 => 100755 lmms_eval/tasks/llava-bench-coco/llava-bench-coco.yaml mode change 100644 => 100755 lmms_eval/tasks/llava-bench-coco/rule.json mode change 100644 => 100755 lmms_eval/tasks/llava-bench-coco/utils.py mode change 100644 => 100755 lmms_eval/tasks/llava-in-the-wild/llava-in-the-wild.yaml mode change 100644 => 100755 lmms_eval/tasks/llava-in-the-wild/rule.json mode change 100644 => 100755 lmms_eval/tasks/llava-in-the-wild/utils.py mode change 100644 => 100755 lmms_eval/tasks/mathvista/mathvista.yaml mode change 100644 => 100755 lmms_eval/tasks/mathvista/mathvista_evals.py mode change 100644 => 100755 lmms_eval/tasks/mathvista/mathvista_test.yaml mode change 100644 => 100755 lmms_eval/tasks/mathvista/mathvista_testmini.yaml mode change 100644 => 100755 lmms_eval/tasks/mathvista/utils.py create mode 100644 lmms_eval/tasks/mix_evals/_default_template_yaml create mode 100755 lmms_eval/tasks/mix_evals/mix_evals_video2text.yaml create mode 100755 lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml create mode 100755 lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml create mode 100755 lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml create mode 100755 lmms_eval/tasks/mix_evals/utils.py mode change 100644 => 100755 lmms_eval/tasks/mmbench/cc_utils.py mode change 100644 => 100755 lmms_eval/tasks/mmbench/cn_utils.py mode change 100644 => 100755 lmms_eval/tasks/mmbench/en_utils.py mode change 100644 => 100755 lmms_eval/tasks/mmbench/mmbench.yaml mode change 100644 => 100755 lmms_eval/tasks/mmbench/mmbench_cc.yaml mode change 100644 => 100755 lmms_eval/tasks/mmbench/mmbench_cn.yaml mode change 100644 => 100755 lmms_eval/tasks/mmbench/mmbench_cn_dev.yaml mode change 100644 => 100755 lmms_eval/tasks/mmbench/mmbench_cn_test.yaml mode change 100644 => 100755 lmms_eval/tasks/mmbench/mmbench_en.yaml mode change 100644 => 100755 lmms_eval/tasks/mmbench/mmbench_en_dev.yaml mode change 100644 => 100755 lmms_eval/tasks/mmbench/mmbench_en_test.yaml mode change 100644 => 100755 lmms_eval/tasks/mmbench/mmbench_evals.py mode change 100644 => 100755 lmms_eval/tasks/mme/mme.yaml mode change 100644 => 100755 lmms_eval/tasks/mme/utils.py mode change 100644 => 100755 lmms_eval/tasks/mmmu/mmmu.yaml mode change 100644 => 100755 lmms_eval/tasks/mmmu/mmmu_test.yaml mode change 100644 => 100755 lmms_eval/tasks/mmmu/mmmu_val.yaml mode change 100644 => 100755 lmms_eval/tasks/mmmu/utils.py mode change 100644 => 100755 lmms_eval/tasks/mmvet/mmvet.yaml mode change 100644 => 100755 lmms_eval/tasks/mmvet/utils.py mode change 100644 => 100755 lmms_eval/tasks/multidocvqa/multidocvqa.yaml mode change 100644 => 100755 lmms_eval/tasks/multidocvqa/multidocvqa_test.yaml mode change 100644 => 100755 lmms_eval/tasks/multidocvqa/multidocvqa_val.yaml mode change 100644 => 100755 lmms_eval/tasks/multidocvqa/utils.py mode change 100644 => 100755 lmms_eval/tasks/nocaps/_default_template_nocaps_yaml mode change 100644 => 100755 lmms_eval/tasks/nocaps/nocaps.yaml mode change 100644 => 100755 lmms_eval/tasks/nocaps/nocaps_test.yaml mode change 100644 => 100755 lmms_eval/tasks/nocaps/nocaps_val.yaml mode change 100644 => 100755 lmms_eval/tasks/nocaps/utils.py mode change 100644 => 100755 lmms_eval/tasks/ok_vqa/_default_template_vqa_yaml mode change 100644 => 100755 lmms_eval/tasks/ok_vqa/_generate_config.py mode change 100644 => 100755 lmms_eval/tasks/ok_vqa/_ok_vqa.yaml mode change 100644 => 100755 lmms_eval/tasks/ok_vqa/ok_vqa_val2014.yaml mode change 100644 => 100755 lmms_eval/tasks/ok_vqa/utils.py mode change 100644 => 100755 lmms_eval/tasks/pope/pope.yaml mode change 100644 => 100755 lmms_eval/tasks/pope/utils.py create mode 100644 lmms_eval/tasks/realworldqa/realworldqa.yaml create mode 100644 lmms_eval/tasks/realworldqa/utils.py mode change 100644 => 100755 lmms_eval/tasks/refcoco+/_default_template_bbox_yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco+/_default_template_seg_yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco+/_generate_config.py mode change 100644 => 100755 lmms_eval/tasks/refcoco+/_refcoco.yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco+/refcoco+_bbox_testA.yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco+/refcoco+_bbox_testB.yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco+/refcoco+_bbox_val.yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco+/refcoco+_seg_testA.yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco+/refcoco+_seg_testB.yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco+/refcoco+_seg_val.yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco+/utils.py mode change 100644 => 100755 lmms_eval/tasks/refcoco/_default_template_bbox_yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco/_default_template_seg_yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco/_generate_config.py mode change 100644 => 100755 lmms_eval/tasks/refcoco/_refcoco.yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco/refcoco_bbox_test.yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco/refcoco_bbox_testA.yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco/refcoco_bbox_testB.yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco/refcoco_bbox_val.yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco/refcoco_seg_test.yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco/refcoco_seg_testA.yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco/refcoco_seg_testB.yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco/refcoco_seg_val.yaml mode change 100644 => 100755 lmms_eval/tasks/refcoco/utils.py mode change 100644 => 100755 lmms_eval/tasks/refcocog/_default_template_bbox_yaml mode change 100644 => 100755 lmms_eval/tasks/refcocog/_default_template_seg_yaml mode change 100644 => 100755 lmms_eval/tasks/refcocog/_generate_config.py mode change 100644 => 100755 lmms_eval/tasks/refcocog/_refcoco.yaml mode change 100644 => 100755 lmms_eval/tasks/refcocog/refcocog_bbox_test.yaml mode change 100644 => 100755 lmms_eval/tasks/refcocog/refcocog_bbox_val.yaml mode change 100644 => 100755 lmms_eval/tasks/refcocog/refcocog_seg_test.yaml mode change 100644 => 100755 lmms_eval/tasks/refcocog/refcocog_seg_val.yaml mode change 100644 => 100755 lmms_eval/tasks/refcocog/utils.py mode change 100644 => 100755 lmms_eval/tasks/scienceqa/scienceqa.yaml mode change 100644 => 100755 lmms_eval/tasks/scienceqa/scienceqa_full.yaml mode change 100644 => 100755 lmms_eval/tasks/scienceqa/scienceqa_img.yaml mode change 100644 => 100755 lmms_eval/tasks/scienceqa/utils.py mode change 100644 => 100755 lmms_eval/tasks/seedbench/seedbench.yaml mode change 100644 => 100755 lmms_eval/tasks/seedbench/seedbench_ppl.yaml mode change 100644 => 100755 lmms_eval/tasks/seedbench/utils.py mode change 100644 => 100755 lmms_eval/tasks/seedbench_2/seedbench_2.yaml mode change 100644 => 100755 lmms_eval/tasks/seedbench_2/utils.py create mode 100644 lmms_eval/tasks/sft_eval/_default_sft_eval_ocr_rec_template_yaml create mode 100644 lmms_eval/tasks/sft_eval/_default_sft_eval_rest_template_yaml create mode 100644 lmms_eval/tasks/sft_eval/_generate_config.py create mode 100644 lmms_eval/tasks/sft_eval/_sft_eval.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_activity.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_arts.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_body.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_car.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_color.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_commodity.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_count.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_daily.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_engineer.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_entertainment.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_exist.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_face.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_food.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_healthcare.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_landmark.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_logo.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_natural.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_qa_adv.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_qa_chart.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_qa_form.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_qa_scene.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_qa_screen.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_rec_adv.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_rec_doc.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_rec_handwrite.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_rec_markdown.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_rec_scene.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_rec_screen.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_place.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_position.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_sport.yaml create mode 100644 lmms_eval/tasks/sft_eval/sft_status.yaml create mode 100644 lmms_eval/tasks/sft_eval/utils.py mode change 100644 => 100755 lmms_eval/tasks/stvqa/stvqa.yaml mode change 100644 => 100755 lmms_eval/tasks/stvqa/utils.py mode change 100644 => 100755 lmms_eval/tasks/textcaps/_default_template_textcaps_yaml mode change 100644 => 100755 lmms_eval/tasks/textcaps/textcaps.yaml mode change 100644 => 100755 lmms_eval/tasks/textcaps/textcaps_test.yaml mode change 100644 => 100755 lmms_eval/tasks/textcaps/textcaps_train.yaml mode change 100644 => 100755 lmms_eval/tasks/textcaps/textcaps_val.yaml mode change 100644 => 100755 lmms_eval/tasks/textcaps/utils.py mode change 100644 => 100755 lmms_eval/tasks/textvqa/_default_template_textvqa_yaml mode change 100644 => 100755 lmms_eval/tasks/textvqa/_textvqa.yaml mode change 100644 => 100755 lmms_eval/tasks/textvqa/textvqa_test.yaml mode change 100644 => 100755 lmms_eval/tasks/textvqa/textvqa_val.yaml mode change 100644 => 100755 lmms_eval/tasks/textvqa/utils.py mode change 100644 => 100755 lmms_eval/tasks/vizwiz_vqa/_default_template_vqa_yaml mode change 100644 => 100755 lmms_eval/tasks/vizwiz_vqa/_generate_config.py mode change 100644 => 100755 lmms_eval/tasks/vizwiz_vqa/_vizwiz_vqa.yaml mode change 100644 => 100755 lmms_eval/tasks/vizwiz_vqa/utils.py mode change 100644 => 100755 lmms_eval/tasks/vizwiz_vqa/vizwiz_vqa_test.yaml mode change 100644 => 100755 lmms_eval/tasks/vizwiz_vqa/vizwiz_vqa_val.yaml mode change 100644 => 100755 lmms_eval/tasks/vqav2/_default_template_vqav2_yaml mode change 100644 => 100755 lmms_eval/tasks/vqav2/_vqav2.yaml mode change 100644 => 100755 lmms_eval/tasks/vqav2/utils.py mode change 100644 => 100755 lmms_eval/tasks/vqav2/vqav2_test.yaml mode change 100644 => 100755 lmms_eval/tasks/vqav2/vqav2_val.yaml create mode 100644 lmms_eval/tasks/worldqa/_default_template_yaml create mode 100755 lmms_eval/tasks/worldqa/utils.py create mode 100755 lmms_eval/tasks/worldqa/worldqa_generation.yaml create mode 100755 lmms_eval/tasks/worldqa/worldqa_mc.yaml create mode 100755 lmms_eval/tasks/worldqa/worldqa_mcppl.yaml mode change 100644 => 100755 lmms_eval/utils.py mode change 100644 => 100755 miscs/llava_result_check.md mode change 100644 => 100755 miscs/repr_scripts.sh mode change 100644 => 100755 miscs/repr_torch_envs.txt mode change 100644 => 100755 miscs/scienceqa_id.txt mode change 100644 => 100755 miscs/script.sh mode change 100644 => 100755 miscs/test_llava.py mode change 100644 => 100755 miscs/test_scienceqa.py mode change 100644 => 100755 pyproject.toml mode change 100644 => 100755 setup.py mode change 100644 => 100755 tools/make_hf_dataset.ipynb diff --git a/.github/issue_template.md b/.github/issue_template.md old mode 100644 new mode 100755 diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md old mode 100644 new mode 100755 diff --git a/.github/workflows/black.yml b/.github/workflows/black.yml old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/docs/README.md b/docs/README.md old mode 100644 new mode 100755 diff --git a/docs/commands.md b/docs/commands.md old mode 100644 new mode 100755 diff --git a/docs/model_guide.md b/docs/model_guide.md old mode 100644 new mode 100755 diff --git a/docs/task_guide.md b/docs/task_guide.md old mode 100644 new mode 100755 diff --git a/example_eval.yaml b/example_eval.yaml old mode 100644 new mode 100755 index 40e29a85d..6750ee7a6 --- a/example_eval.yaml +++ b/example_eval.yaml @@ -1,15 +1,8 @@ - model: llava model_args: pretrained=liuhaotian/llava-v1.5-7b - tasks: ai2d + tasks: mmmu_val batch_size: 1 log_samples: true - log_samples_suffix: eval_vizwiz_vqa + log_samples_suffix: eval_mmmu output_path: "./logs/" -- model: llava - model_args: pretrained=liuhaotian/llava-v1.5-13b - tasks: mme - batch_size: 1 - log_samples: true - log_samples_suffix: mme - output_path: "./logs/" diff --git a/llava_repr_requirements.txt b/llava_repr_requirements.txt old mode 100644 new mode 100755 index e3f0f5277..c09b6f5bd --- a/llava_repr_requirements.txt +++ b/llava_repr_requirements.txt @@ -27,23 +27,6 @@ shortuuid==1.0.12 sqlitedict==2.1.0 tenacity==8.2.3 torch==2.0.1 -openai>=1.0.0 -pycocoevalcap tokenizers==0.15.2 tqdm==4.66.2 -tqdm-multiprocess transformers==4.37.2 -zstandard -pillow -pyyaml -sympy -mpmath -Jinja2 -openpyxl -Levenshtein -hf_transfer -tenacity -wandb>=0.16.0 -transformers-stream-generator -tiktoken -pre-commit \ No newline at end of file diff --git a/lmms_eval/__init__.py b/lmms_eval/__init__.py old mode 100644 new mode 100755 diff --git a/lmms_eval/__main__.py b/lmms_eval/__main__.py old mode 100644 new mode 100755 diff --git a/lmms_eval/api/__init__.py b/lmms_eval/api/__init__.py old mode 100644 new mode 100755 diff --git a/lmms_eval/api/filter.py b/lmms_eval/api/filter.py old mode 100644 new mode 100755 diff --git a/lmms_eval/api/instance.py b/lmms_eval/api/instance.py old mode 100644 new mode 100755 diff --git a/lmms_eval/api/metrics.py b/lmms_eval/api/metrics.py old mode 100644 new mode 100755 diff --git a/lmms_eval/api/model.py b/lmms_eval/api/model.py old mode 100644 new mode 100755 diff --git a/lmms_eval/api/registry.py b/lmms_eval/api/registry.py old mode 100644 new mode 100755 diff --git a/lmms_eval/api/samplers.py b/lmms_eval/api/samplers.py old mode 100644 new mode 100755 index f77065e8e..2cecfe224 --- a/lmms_eval/api/samplers.py +++ b/lmms_eval/api/samplers.py @@ -37,7 +37,9 @@ def get_context(self, doc, num_fewshot): + ( str(self.doc_to_target(doc)[0]) if type(self.doc_to_target(doc)) is list - else self.doc_to_target(doc) if (self.config.doc_to_choice is None or type(self.doc_to_target(doc)) is str) else str(self.doc_to_choice(doc)[self.doc_to_target(doc)]) + else self.doc_to_target(doc) + if (self.config.doc_to_choice is None or type(self.doc_to_target(doc)) is str) + else str(self.doc_to_choice(doc)[self.doc_to_target(doc)]) ) for doc in selected_docs ] diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py old mode 100644 new mode 100755 index 3262937c8..0d5c08153 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -7,6 +7,8 @@ import ast import logging import random +from glob import glob +import shutil from tqdm import tqdm import datasets @@ -18,6 +20,7 @@ from typing import Union, List, Any from collections.abc import Callable from tenacity import retry, stop_after_attempt, wait_fixed +from huggingface_hub import snapshot_download from lmms_eval import utils from lmms_eval.api import samplers @@ -678,6 +681,26 @@ def _prepare_metric_and_aggregation(self): @retry(stop=stop_after_attempt(5), wait=wait_fixed(2)) def download(self, dataset_kwargs=None) -> None: + # If the dataset is a video dataset, + # Recursively search whether their is a zip and unzip it to the huggingface home + if dataset_kwargs is not None and "video" in dataset_kwargs and dataset_kwargs["video"]: + hf_home = os.environ["HF_HOME"] + cache_dir = dataset_kwargs["cache_dir"] + + cache_dir = os.path.join(hf_home, cache_dir) + cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset") + zip_files = glob(os.path.join(cache_path, "**/*.zip"), recursive=True) + if not os.path.exists(cache_dir): + for zip_file in zip_files: + shutil.unpack_archive(zip_file, cache_dir) + + if "builder_script" in dataset_kwargs: + builder_script = dataset_kwargs["builder_script"] + self.DATASET_PATH = os.path.join(cache_path, builder_script) + dataset_kwargs.pop("builder_script") + + dataset_kwargs.pop("cache_dir") + dataset_kwargs.pop("video") download_config = DownloadConfig() download_config.max_retries = dataset_kwargs.get("max_retries", 3) if dataset_kwargs is not None else 3 download_config.num_proc = dataset_kwargs.get("num_proc", 8) if dataset_kwargs is not None else 8 @@ -973,6 +996,8 @@ def construct_requests(self, doc_id: int, ctx: str, **kwargs) -> Union[List[Inst return Instance(request_type=self.OUTPUT_TYPE, arguments=arguments, idx=0, **kwargs) def process_results(self, doc, results): + # if self.OUTPUT_TYPE == "generate_until": + # results[0] = results[0].strip() if callable(self.config.process_results): return self.config.process_results(doc, results) diff --git a/lmms_eval/evaluator.py b/lmms_eval/evaluator.py old mode 100644 new mode 100755 diff --git a/lmms_eval/filters/__init__.py b/lmms_eval/filters/__init__.py old mode 100644 new mode 100755 index a4242343e..38ab7d8a5 --- a/lmms_eval/filters/__init__.py +++ b/lmms_eval/filters/__init__.py @@ -1,4 +1,4 @@ -from lmms_eval.api.filter import FilterEnsemble +from lmms_eval.api.filter import FilterEnsemble, Filter from . import selection from . import extraction from . import transformation @@ -13,6 +13,7 @@ "lowercase": transformation.LowercaseFilter, "uppercase": transformation.UppercaseFilter, "map": transformation.MapFilter, + "multi_choice_regex": extraction.MultiChoiceRegexFilter, # TODO: implement this filter. either it should take in an arbitrary "scoring"/reward function # that takes an input and returns a scalar and then should select the max reward, # or should implement different filters for different ways of handling a reward model's inference. diff --git a/lmms_eval/filters/decontamination.py b/lmms_eval/filters/decontamination.py old mode 100644 new mode 100755 diff --git a/lmms_eval/filters/extraction.py b/lmms_eval/filters/extraction.py old mode 100644 new mode 100755 index 3f85899b0..329d75409 --- a/lmms_eval/filters/extraction.py +++ b/lmms_eval/filters/extraction.py @@ -1,18 +1,47 @@ import re - +import sys +import unicodedata from lmms_eval.api.filter import Filter +class WhitespaceFilter(Filter): + """ """ + + def __init__(self) -> None: + pass + + def apply(self, resps, docs): + def filter_set(inst): + filtered_resp = [] + for resp in inst: + if resp.startswith(" "): + resp = resp[1:] + + filtered_resp.append(resp) + + return filtered_resp + + filtered_resps = [filter_set(resp) for resp in resps] + + return filtered_resps + + class RegexFilter(Filter): """ """ - def __init__(self, regex_pattern: str = r"#### (\-?[0-9\.\,]+)", fallback: str = "[invalid]") -> None: + def __init__( + self, + regex_pattern: str = r"#### (\-?[0-9\.\,]+)", + group_select=0, + fallback: str = "[invalid]", + ) -> None: """ pass a string `regex` to run `re.compile(r"regex")` on. `fallback` defines the output returned if no matches for the regex are located. """ self.regex_pattern = regex_pattern self.regex = re.compile(regex_pattern) + self.group_select = group_select self.fallback = fallback def apply(self, resps, docs): @@ -23,9 +52,12 @@ def apply(self, resps, docs): def filter_set(inst): filtered = [] for resp in inst: - match = self.regex.search(resp) + match = self.regex.findall(resp) if match: - match = match.group(1).strip() + match = match[self.group_select] + if isinstance(match, tuple): + match = [m for m in match if m][0] + match = match.strip() else: match = self.fallback filtered.append(match) @@ -38,23 +70,145 @@ def filter_set(inst): return filtered_resps -class WhitespaceFilter(Filter): - """ """ +class MultiChoiceRegexFilter(RegexFilter): + """ + A filter used to extract a model's answer on multiple choice questions with + letter answers. assumes each document has a "choices" field + containing the list of answer choices and that the answer label symbols + are of the form (A), (B), (C), ... or A, B, C. + """ - def __init__(self) -> None: - pass + def __init__( + self, + regex_pattern: str = r"#### (\-?[0-9\.\,]+)", + group_select=0, + fallback: str = "[invalid]", + ignore_case=False, + ignore_punctuation=False, + regexes_to_ignore=None, + ) -> None: + """ + regex_pattern: The basic regex pattern to use. If fails to match, we will use the customized match procedure + - step 1 : We parse the choices between ([A-Z])s then try to find these choices in the response. + - step 2 : We parse the choice with regex :[\s]*([A-?]), where ? varies by number of choices. + group_select: Selects the (group_select)th match from the findall result. + ignore_case: Ignores the case during step 1 matching + ignore_punctuation: Remove the punctuation during step 1 matching + regexes_to_ignore: Remove these regexes during step 1 matching + """ + super().__init__(regex_pattern, group_select, fallback) + self.ignore_case = ignore_case + self.ignore_punctuation = ignore_punctuation + self.regexes_to_ignore = regexes_to_ignore def apply(self, resps, docs): - def filter_set(inst): - filtered_resp = [] - for resp in inst: - if resp.startswith(" "): - resp = resp[1:] + # here, we assume we have a list, in which each element is + # a list of model responses for some particular input/target pair. + # so we process each of these (same input/target response sets) + # independently (and keep them a list.) - filtered_resp.append(resp) + def find_match(regex, resp, convert_dict={}): + match = regex.findall(resp) + if match: + match = match[self.group_select] + if isinstance(match, tuple): + match = [m for m in match if m][0] + match = match.strip() + if match and match in convert_dict: + match = convert_dict[match] + return match - return filtered_resp + punct_tbl = dict.fromkeys(i for i in range(sys.maxunicode) if unicodedata.category(chr(i)).startswith("P")) - filtered_resps = [filter_set(resp) for resp in resps] + def filter_ignores(st): + if self.regexes_to_ignore is not None: + for s in self.regexes_to_ignore: + st = re.sub(s, "", st) + + if self.ignore_case: + st = st.lower() + + if self.ignore_punctuation: + # https://stackoverflow.com/a/266162 + st = st.translate(punct_tbl) + return st + + filtered_resps = [] + + for r, doc in zip(resps, docs): + fallback_regexes = [] + choice_to_alpha = {} + next_alpha = "A" + + without_paren_fallback_regexes = [] + without_paren_to_target = {} + + choices = doc["choices"] + for c in choices: + m = filter_ignores(c.strip()) + fallback_regexes.append(f"{re.escape(m)}") + choice_to_alpha[m] = f"({next_alpha})" + + without_paren_fallback_regexes.append(next_alpha) + without_paren_to_target[next_alpha] = f"({next_alpha})" + + next_alpha = chr(ord(next_alpha) + 1) + fallback_regex = re.compile("|".join(fallback_regexes)) + without_paren_fallback_regex = "|".join(without_paren_fallback_regexes) + without_paren_fallback_regex = re.compile(f":[\s]*({without_paren_fallback_regex})") + + filtered = [] + for resp in r: + match = find_match(self.regex, resp) + if not match: + match = find_match(fallback_regex, filter_ignores(resp), choice_to_alpha) + if not match: + match = find_match(without_paren_fallback_regex, resp, without_paren_to_target) + if not match: + match = self.fallback + filtered.append(match) + filtered_resps.append(filtered) return filtered_resps + + +class ExtendedRegexFilter(RegexFilter): + punct_tbl = dict.fromkeys(i for i in range(sys.maxunicode) if unicodedata.category(chr(i)).startswith("P")) + + def __init__( + self, + regex_pattern: str = r"#### (\-?[0-9\.\,]+)", + group_select=0, + fallback: str = "[invalid]", + ignore_case=False, + ignore_punctuation=False, + regexes_to_ignore=None, + ) -> None: + super().__init__(regex_pattern, group_select, fallback) + self.ignore_case = ignore_case + self.ignore_punctuation = ignore_punctuation + self.regexes_to_ignore = regexes_to_ignore + + def filter_ignores(self, st): + if self.regexes_to_ignore is not None: + for s in self.regexes_to_ignore: + st = re.sub(s, "", st) + + if self.ignore_case: + st = st.lower() + + if self.ignore_punctuation: + # https://stackoverflow.com/a/266162 + st = st.translate(self.punct_tbl) + return st + + def find_match(self, regex, resp, convert_dict={}): + match = regex.findall(resp) + if match: + match = match[self.group_select] + if isinstance(match, tuple): + match = [m for m in match if m][0] + match = match.strip() + if match and match in convert_dict: + match = convert_dict[match] + return match diff --git a/lmms_eval/filters/selection.py b/lmms_eval/filters/selection.py old mode 100644 new mode 100755 diff --git a/lmms_eval/filters/transformation.py b/lmms_eval/filters/transformation.py old mode 100644 new mode 100755 diff --git a/lmms_eval/logging_utils.py b/lmms_eval/logging_utils.py old mode 100644 new mode 100755 index 21a2ee047..6107d21b9 --- a/lmms_eval/logging_utils.py +++ b/lmms_eval/logging_utils.py @@ -89,10 +89,10 @@ def finish(self): def init_run(self): if "name" not in self.wandb_args: if "config" in self.all_args_dict and self.all_args_dict["config"] != "": - self.wandb_args["name"] = self.all_args_dict["config"].split("/")[-1].replace(".yaml", "") + "_" + self.args.log_samples_suffix + self.wandb_args["name"] = self.all_args_dict["config"].split("/")[-1].replace(".yaml", "") + "/" + self.args.log_samples_suffix else: task_names = self.args.tasks.replace(",", "/") - self.wandb_args["name"] = f"{self.args.model}_{task_names}_{self.args.log_samples_suffix}" + self.wandb_args["name"] = f"{self.args.model}/<{task_names}>/{self.args.log_samples_suffix}" if self.args.num_fewshot: self.wandb_args["name"] += f"_{self.args.num_fewshot}shot" if "project" not in self.wandb_args: @@ -119,6 +119,7 @@ def _get_config(self) -> Dict[str, Any]: def _sanitize_results_dict(self) -> Tuple[Dict[str, str], Dict[str, Any]]: """Sanitize the results dictionary.""" _results = copy.deepcopy(self.results.get("results", dict())) + _results["model_configs"] = self.results.get("model_configs", dict()) # Remove None from the metric string name tmp_results = copy.deepcopy(_results) @@ -138,15 +139,18 @@ def _sanitize_results_dict(self) -> Tuple[Dict[str, str], Dict[str, Any]]: if isinstance(metric_value, str): wandb_summary[f"{task}/{metric_name}"] = metric_value + wandb_summary["model_configs"] = self.results.get("model_configs", dict()) for summary_metric, summary_value in wandb_summary.items(): - _task, _summary_metric = summary_metric.split("/") - _results[_task].pop(_summary_metric) + if summary_metric != "model_configs": + _task, _summary_metric = summary_metric.split("/") + _results[_task].pop(_summary_metric) tmp_results = copy.deepcopy(_results) for task_name, task_results in tmp_results.items(): - for metric_name, metric_value in task_results.items(): - _results[f"{task_name}/{metric_name}"] = metric_value - _results[task_name].pop(metric_name) + if task_name != "model_configs": + for metric_name, metric_value in task_results.items(): + _results[f"{task_name}/{metric_name}"] = metric_value + _results[task_name].pop(metric_name) for task in self.task_names: _results.pop(task) diff --git a/lmms_eval/models/__init__.py b/lmms_eval/models/__init__.py old mode 100644 new mode 100755 index 9135311cc..88c0d37ed --- a/lmms_eval/models/__init__.py +++ b/lmms_eval/models/__init__.py @@ -1,14 +1,6 @@ import os -AVAILABLE_MODELS = { - "llava": "Llava", - "llava_hf": "LlavaHf", - "qwen_vl": "Qwen_VL", - "fuyu": "Fuyu", - "gpt4v": "GPT4V", - "instructblip": "InstructBLIP", - "minicpm_v": "MiniCPM_V", -} +AVAILABLE_MODELS = {"llava": "Llava", "llava_hf": "LlavaHf", "qwen_vl": "Qwen_VL", "fuyu": "Fuyu", "gpt4v": "GPT4V", "instructblip": "InstructBLIP", "minicpm_v": "MiniCPM_V", "llava_vid": "LlavaVid"} for model_name, model_class in AVAILABLE_MODELS.items(): try: @@ -16,7 +8,6 @@ except ImportError: pass - import hf_transfer os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1" diff --git a/lmms_eval/models/fuyu.py b/lmms_eval/models/fuyu.py old mode 100644 new mode 100755 index 173fa6b98..34290b9f0 --- a/lmms_eval/models/fuyu.py +++ b/lmms_eval/models/fuyu.py @@ -204,7 +204,7 @@ def _collate(x): # generation_output = self.model.generate( # **model_inputs, temperature=gen_kwargs["temperature"], max_new_tokens=gen_kwargs["max_new_tokens"], top_p=gen_kwargs["top_p"], num_beams=gen_kwargs["num_beams"], pad_token_id=self.tokenizer.eos_token_id # ) - generation_output = self.model.generate(**model_inputs, max_new_tokens=gen_kwargs["max_new_tokens"]) + generation_output = self.model.generate(**model_inputs, max_new_tokens=gen_kwargs["max_new_tokens"], pad_token_id=self.tokenizer.eos_token_id) generation_texts = self.processor.batch_decode(generation_output, skip_special_tokens=True) response = [gen_text.split("\x04")[1].strip(" ").strip("\n") for gen_text in generation_texts] res.extend(response) diff --git a/lmms_eval/models/gpt4v.py b/lmms_eval/models/gpt4v.py old mode 100644 new mode 100755 index d2ec2025d..33c632a36 --- a/lmms_eval/models/gpt4v.py +++ b/lmms_eval/models/gpt4v.py @@ -35,19 +35,24 @@ } -@register_model("gpt4V") +@register_model("gpt4v") class GPT4V(lmms): - def __init__(self, **kwargs) -> None: + def __init__( + self, + model_version: str = "gpt-4-vision-preview", + **kwargs, + ) -> None: super().__init__() # Manually set a image token for GPT4V so that we can search for it # and split the text and image # Here we just use the same token as llava for convenient + self.model_version = model_version self.image_token = "" # Function to encode the image def encode_image(self, image: Image): output_buffer = BytesIO() - image.save(output_buffer, format="JPEG") + image.save(output_buffer, format="PNG") byte_data = output_buffer.getvalue() base64_str = base64.b64encode(byte_data).decode("utf-8") return base64_str @@ -72,7 +77,7 @@ def generate_until(self, requests) -> List[str]: img = self.encode_image(visual) imgs.append(img) - payload = {"model": "gpt-4-vision-preview", "messages": []} + payload = {"model": self.model_version, "messages": []} response_json = {"role": "user", "content": []} # When there is no image token in the context, append the image to the text if self.image_token not in contexts: @@ -102,8 +107,8 @@ def generate_until(self, requests) -> List[str]: if "num_beams" not in gen_kwargs: gen_kwargs["num_beams"] = 1 - # payload["max_tokens"] = gen_kwargs["max_new_tokens"] - # payload["temperature"] = gen_kwargs["temperature"] + payload["max_tokens"] = gen_kwargs["max_new_tokens"] + payload["temperature"] = gen_kwargs["temperature"] for attempt in range(5): try: diff --git a/lmms_eval/models/instructblip.py b/lmms_eval/models/instructblip.py old mode 100644 new mode 100755 index 6f83d599e..a99d20ea9 --- a/lmms_eval/models/instructblip.py +++ b/lmms_eval/models/instructblip.py @@ -9,6 +9,7 @@ from accelerate import Accelerator, DistributedType from accelerate.state import AcceleratorState from typing import List, Optional, Union, Tuple +import transformers from transformers import InstructBlipProcessor, InstructBlipForConditionalGeneration from lmms_eval.utils import stop_sequences_criteria @@ -19,6 +20,7 @@ warnings.filterwarnings("ignore") eval_logger = logging.getLogger("lmms-eval") +transformers.logging.set_verbosity_error() @register_model("instructblip") diff --git a/lmms_eval/models/llava.py b/lmms_eval/models/llava.py old mode 100644 new mode 100755 index a735f82c6..0fa3636ca --- a/lmms_eval/models/llava.py +++ b/lmms_eval/models/llava.py @@ -1,3 +1,4 @@ +import ast import torch torch.backends.cuda.matmul.allow_tf32 = True @@ -28,7 +29,10 @@ from llava.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN, IGNORE_INDEX from llava.conversation import conv_templates, SeparatorStyle except ImportError: - eval_logger.error("LLaVA is not installed. Please install LLaVA to use this model.") + import traceback + + traceback.print_exc() + # eval_logger.error("LLaVA is not installed. Please install LLaVA to use this model.") from transformers.integrations.deepspeed import ( is_deepspeed_zero3_enabled, @@ -36,6 +40,17 @@ unset_hf_deepspeed_config, ) +from transformers.utils import is_flash_attn_2_available + +# inference implementation for attention, can be "sdpa", "eager", "flash_attention_2". Seems FA2 is not effective during inference: https://discuss.huggingface.co/t/flash-attention-has-no-effect-on-inference/73453/5 +# if is_flash_attn_2_available: +# best_fit_attn_implementation = "flash_attention_2" # flash_attn has a bug that says: ERROR Error query and key must have the same dtype in generating + +if torch.__version__ > "2.1.2": + best_fit_attn_implementation = "sdpa" +else: + best_fit_attn_implementation = "eager" + @register_model("llava") class Llava(lmms): @@ -47,16 +62,17 @@ def __init__( self, pretrained: str = "liuhaotian/llava-v1.5-7b", truncation: Optional[bool] = True, - device: Optional[str] = "cuda", + device: Optional[str] = "cuda:0", dtype: Optional[Union[str, torch.dtype]] = "auto", batch_size: Optional[Union[int, str]] = 1, trust_remote_code: Optional[bool] = False, revision=None, - use_flash_attention_2=True, - device_map="auto", + attn_implementation=best_fit_attn_implementation, + device_map="cuda:0", conv_template="vicuna_v1", use_cache=True, truncate_context=False, # whether to truncate the context in generation, set it False for LLaVA-1.6 + customized_config=None, # ends in json **kwargs, ) -> None: super().__init__() @@ -65,14 +81,21 @@ def __init__( accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) - if accelerator.num_processes > 1 and device_map == "": + if accelerator.num_processes > 1: self._device = torch.device(f"cuda:{accelerator.local_process_index}") self.device_map = f"cuda:{accelerator.local_process_index}" - else: + elif accelerator.num_processes == 1 and device_map == "auto": self._device = torch.device(device) self.device_map = device_map + else: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" - self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, get_model_name_from_path(pretrained), device_map=self.device_map, use_flash_attention_2=use_flash_attention_2) + llava_model_args = {} + llava_model_args["attn_implementation"] = attn_implementation + llava_model_args["customized_config"] = customized_config + llava_model_args["use_flash_attention_2"] = False + self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, get_model_name_from_path(pretrained), device_map=self.device_map, **llava_model_args) self._config = self._model.config self.model.eval() self.model.tie_weights() @@ -82,7 +105,7 @@ def __init__( self.use_cache = use_cache self.truncate_context = truncate_context # assert self.batch_size_per_gpu == 1, "Llava currently does not support batched generation. See https://github.com/haotian-liu/LLaVA/issues/754. HF Llava also has this issue." - if accelerator.num_processes > 1 and device_map == "": + if accelerator.num_processes > 1: assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." # If you want to use DistributedType.DEEPSPEED, you have to run accelerate config before using the model # Also, you have to select zero stage 0 (equivalent to DDP) in order to make the prepare model works @@ -174,7 +197,10 @@ def tok_encode(self, string: str, left_truncate_len=None, add_special_tokens=Non return encoding def tok_decode(self, tokens): - return self.tokenizer.decode(tokens) + try: + return self.tokenizer.decode(tokens) + except: + return self.tokenizer.decode([tokens]) def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: # TODO @@ -189,6 +215,7 @@ def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: continuation = doc_to_target(self.task_dict[task][split][doc_id]) visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] visuals = self.flatten(visuals) + image_sizes = [[visual.size[0], visual.size[1]] for visual in visuals] if visuals: image = process_images(visuals, self._image_processor, self._config) if type(image) is list: @@ -226,7 +253,7 @@ def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: # Context part no need to calculate for loss labels[0, : contxt_id.shape[1]] = -100 with torch.inference_mode(): - outputs = self.model(input_ids=input_ids, labels=labels, images=image, use_cache=True) + outputs = self.model(input_ids=input_ids, labels=labels, images=image, use_cache=True, image_sizes=image_sizes) loss = outputs["loss"] # loss = torch.exp(loss) logits = outputs["logits"] @@ -270,8 +297,8 @@ def _collate(x): contexts, all_gen_kwargs, doc_to_visual, doc_id, task, split = zip(*chunk) task = task[0] split = split[0] - visuals = [doc_to_visual[0](self.task_dict[task][split][ids]) for ids in doc_id] - visuals = self.flatten(visuals) + batched_visuals = [doc_to_visual[0](self.task_dict[task][split][ids]) for ids in doc_id] # [B, N] + flattened_visuals = self.flatten(batched_visuals) # [B*N] # we assume all gen kwargs in the batch are the same # this is safe to assume because the `grouper` object ensures it. gen_kwargs = all_gen_kwargs[0] @@ -292,8 +319,8 @@ def _collate(x): self._config.image_aspect_ratio = gen_kwargs.pop("image_aspect_ratio") eval_logger.info(f"Setting image aspect ratio: {self._config.image_aspect_ratio}") # encode, pad, and truncate contexts for this batch - if visuals: - image_tensor = process_images(visuals, self._image_processor, self._config) + if flattened_visuals: + image_tensor = process_images(flattened_visuals, self._image_processor, self._config) if type(image_tensor) is list: image_tensor = [_image.to(dtype=torch.float16, device=self.device) for _image in image_tensor] else: @@ -305,7 +332,7 @@ def _collate(x): question_input = [] - for visual, context in zip(visuals, contexts): + for visual, context in zip(batched_visuals, contexts): if image_tensor is not None and len(image_tensor) != 0 and DEFAULT_IMAGE_TOKEN not in context: """ Three senarios: @@ -318,7 +345,6 @@ def _collate(x): question = image_tokens + "\n" + context else: question = context - conv = conv_templates[self.conv_template].copy() conv.append_message(conv.roles[0], question) conv.append_message(conv.roles[1], None) @@ -328,7 +354,7 @@ def _collate(x): # The above for loop has bugs. When there is no visuals, e.g. pure text, # there will be no for loop execute resulting in an empty question_input (because no visuals) # Scenario 1 won't even be execute - if len(visuals) == 0: + if len(flattened_visuals) == 0: for context in contexts: question = context conv = conv_templates[self.conv_template].copy() @@ -339,7 +365,7 @@ def _collate(x): # input_ids = tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).to(self.device) # preconfigure gen_kwargs with defaults - gen_kwargs["image_sizes"] = [visuals[idx].size for idx in range(len(visuals))] + gen_kwargs["image_sizes"] = [flattened_visuals[idx].size for idx in range(len(flattened_visuals))] if "max_new_tokens" not in gen_kwargs: gen_kwargs["max_new_tokens"] = 1024 if "temperature" not in gen_kwargs: @@ -371,6 +397,7 @@ def _collate(x): ) text_outputs = self.tokenizer.batch_decode(cont, skip_special_tokens=True) except Exception as e: + raise e eval_logger.error(f"Error {e} in generating") cont = "" text_outputs = [""] diff --git a/lmms_eval/models/llava_vid.py b/lmms_eval/models/llava_vid.py new file mode 100755 index 000000000..0913dc118 --- /dev/null +++ b/lmms_eval/models/llava_vid.py @@ -0,0 +1,356 @@ +import logging +from multiprocessing import context +from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs +from accelerate.state import AcceleratorState +from typing import List, Optional, Union, Tuple +import torch +from tqdm import tqdm +from decord import VideoReader, cpu +import numpy as np +import math +from datetime import timedelta +from transformers import AutoConfig + +from lmms_eval import utils +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model +from lmms_eval.utils import stop_sequences_criteria + +eval_logger = logging.getLogger("lmms-eval") + +try: + from llavavid.model.builder import load_pretrained_model + from llavavid.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria + from llavavid.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN, IGNORE_INDEX + from llavavid.conversation import conv_templates, SeparatorStyle +except ImportError: + eval_logger.error("LLaVA-Video is not installed. Please install LLaVA-Video to use this model.") + + +@register_model("llavavid") +class LlavaVid(lmms): + """ + LlavaVid Model + """ + + def __init__( + self, + pretrained: str = "liuhaotian/llava-v1.5-7b", + truncation: Optional[bool] = True, + device: Optional[str] = "cuda:0", + dtype: Optional[Union[str, torch.dtype]] = "auto", + batch_size: Optional[Union[int, str]] = 1, + trust_remote_code: Optional[bool] = False, + revision=None, + attn_implementation=( + "sdpa" if torch.__version__ > "2.1.2" else "eager" + ), # inference implementation for attention, can be "sdpa", "eager", "flash_attention_2". Seems FA2 is not effective during inference: https://discuss.huggingface.co/t/flash-attention-has-no-effect-on-inference/73453/5 + device_map="cuda:0", + conv_template="vicuna_v1", + use_cache=True, + truncate_context=False, # whether to truncate the context in generation, set it False for LLaVA-1.6 + for_get_frames_num: int = 3, + mm_resampler_type: str = "spatial_pool", + mm_spatial_pool_stride: int = 2, + mm_spatial_pool_out_channels: int = 1024, + mm_spatial_pool_mode: str = "average", + overwrite: bool = True, + **kwargs, + ) -> None: + super().__init__() + assert kwargs == {}, f"Unexpected kwargs: {kwargs}" + + accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) + accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) + if accelerator.num_processes > 1: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + elif accelerator.num_processes == 1 and device_map == "auto": + self._device = torch.device(device) + self.device_map = device_map + else: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + + self.pretrained = pretrained + self.model_name = get_model_name_from_path(pretrained) + self._config = AutoConfig.from_pretrained(self.pretrained) + self.overwrite = overwrite + self.mm_resampler_type = mm_resampler_type + self.mm_spatial_pool_stride = int(mm_spatial_pool_stride) + self.mm_spatial_pool_out_channels = int(mm_spatial_pool_out_channels) + self.mm_spatial_pool_mode = mm_spatial_pool_mode + self.for_get_frames_num = int(for_get_frames_num) + if self.overwrite == True: + overwrite_config = {} + overwrite_config["mm_resampler_type"] = self.mm_resampler_type + overwrite_config["mm_spatial_pool_stride"] = self.mm_spatial_pool_stride + overwrite_config["mm_spatial_pool_out_channels"] = self.mm_spatial_pool_out_channels + overwrite_config["mm_spatial_pool_mode"] = self.mm_spatial_pool_mode + overwrite_config["patchify_video_feature"] = False + + cfg_pretrained = AutoConfig.from_pretrained(self.pretrained) + + if "224" in cfg_pretrained.mm_vision_tower: + # suppose the length of text tokens is around 1000, from bo's report + least_token_number = self.for_get_frames_num * (16 // self.mm_spatial_pool_stride) ** 2 + 1000 + else: + least_token_number = self.for_get_frames_num * (24 // self.mm_spatial_pool_stride) ** 2 + 1000 + + scaling_factor = math.ceil(least_token_number / 4096) + if scaling_factor >= 2: + print(float(scaling_factor)) + overwrite_config["rope_scaling"] = {"factor": float(scaling_factor), "type": "linear"} + overwrite_config["max_sequence_length"] = 4096 * scaling_factor + overwrite_config["tokenizer_model_max_length"] = 4096 * scaling_factor + self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, self.model_name, device_map=self.device_map, overwrite_config=overwrite_config) + else: + self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model( + pretrained, + None, + self.model_name, + device_map=self.device_map, + ) + + self._config = self._model.config + self.model.eval() + self.model.tie_weights() + self.truncation = truncation + self.batch_size_per_gpu = int(batch_size) + self.conv_template = conv_template + self.use_cache = use_cache + self.truncate_context = truncate_context + # assert self.batch_size_per_gpu == 1, "Llava currently does not support batched generation. See https://github.com/haotian-liu/LLaVA/issues/754. HF Llava also has this issue." + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + # If you want to use DistributedType.DEEPSPEED, you have to run accelerate config before using the model + # Also, you have to select zero stage 0 (equivalent to DDP) in order to make the prepare model works + # I tried to set different parameters in the kwargs to let default zero 2 stage works, but it didn't work. + if accelerator.distributed_type == DistributedType.DEEPSPEED: + kwargs = { + "train_micro_batch_size_per_gpu": self.batch_size_per_gpu, + "train_batch_size": self.batch_size_per_gpu * accelerator.num_processes, + } + AcceleratorState().deepspeed_plugin.deepspeed_config_process(must_match=True, **kwargs) + eval_logger.info("Detected that you are using DistributedType.DEEPSPEED. Make sure you run `accelerate config` and set zero stage to 0") + if accelerator.distributed_type == DistributedType.FSDP or accelerator.distributed_type == DistributedType.DEEPSPEED: + self._model = accelerator.prepare(self.model) + else: + self._model = accelerator.prepare_model(self.model, evaluation_mode=True) + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + elif accelerator.num_processes == 1 and device_map == "auto": + eval_logger.info(f"Using {accelerator.num_processes} devices with tensor parallelism") + self._rank = 0 + self._word_size = 1 + else: + eval_logger.info(f"Using single device: {self._device}") + self.model.to(self._device) + self._rank = 0 + self._world_size = 1 + + @property + def config(self): + # return the associated transformers.AutoConfig for the given pretrained model. + return self._config + + @property + def tokenizer(self): + return self._tokenizer + + @property + def model(self): + # returns the model, unwrapping it if using Accelerate + if hasattr(self, "accelerator"): + return self.accelerator.unwrap_model(self._model) + else: + return self._model + + @property + def eot_token_id(self): + # we use EOT because end of *text* is more accurate for what we're doing than end of *sentence* + return self.tokenizer.eos_token_id + + @property + def max_length(self): + return self._max_length + + def pad_sequence(self, input_ids, batch_first, padding_value): + if self.tokenizer.padding_side == "left": + input_ids = [torch.flip(_input_ids, [0]) for _input_ids in input_ids] + input_ids = torch.nn.utils.rnn.pad_sequence(input_ids, batch_first=batch_first, padding_value=padding_value) + if self.tokenizer.padding_side == "left": + input_ids = torch.flip(input_ids, [1]) + return input_ids + + @property + def batch_size(self): + return self.batch_size_per_gpu + + @property + def device(self): + return self._device + + @property + def rank(self): + return self._rank + + @property + def world_size(self): + return self._world_size + + def tok_encode(self, string: str, left_truncate_len=None, add_special_tokens=None) -> List[int]: + """ """ + add_special_tokens = False if add_special_tokens is None else add_special_tokens + encoding = self.tokenizer.encode(string, add_special_tokens=add_special_tokens) + # left-truncate the encoded context to be at most `left_truncate_len` tokens long + if left_truncate_len: + encoding = encoding[-left_truncate_len:] + return encoding + + def load_video(self, video_path, for_get_frames_num): + vr = VideoReader(video_path, ctx=cpu(0)) + total_frame_num = len(vr) + # fps = round(vr.get_avg_fps()) + # frame_idx = [i for i in range(0, len(vr), fps)] + uniform_sampled_frames = np.linspace(0, total_frame_num - 1, for_get_frames_num, dtype=int) + frame_idx = uniform_sampled_frames.tolist() + spare_frames = vr.get_batch(frame_idx).asnumpy() + return spare_frames + + def tok_decode(self, tokens): + return self.tokenizer.decode(tokens) + + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + res = [] + pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") + + for contexts, doc_to_target, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + # encode, pad, and truncate contexts for this batch + if type(doc_to_target) == str: + continuation = doc_to_target + else: + continuation = doc_to_target(self.task_dict[task][split][doc_id]) + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + videos = [] + for visual in visuals: + video = self.load_video(visual, self.for_get_frames_num) + video = self._image_processor.preprocess(video, return_tensors="pt")["pixel_values"].half().cuda() + videos.append(video) + + qs = contexts + if self.model.config.mm_use_im_start_end: + qs = DEFAULT_IM_START_TOKEN + DEFAULT_IMAGE_TOKEN + DEFAULT_IM_END_TOKEN + "\n" + qs + else: + qs = DEFAULT_IMAGE_TOKEN + "\n" + qs + + conv = conv_templates[self.conv_template].copy() + conv.append_message(conv.roles[0], qs) + conv.append_message(conv.roles[1], None) + prompt = conv.get_prompt() + + contxt_id = tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).to(self.device) + + conv = conv_templates[self.conv_template].copy() + conv.append_message(conv.roles[0], qs) + conv.append_message(conv.roles[1], continuation) + prompt = conv.get_prompt() + + input_ids = tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).cuda() + attention_masks = input_ids.ne(self.tokenizer.pad_token_id).long().cuda() + + labels = input_ids.clone() + # Context part no need to calculate for loss + labels[0, : contxt_id.shape[1]] = -100 + + with torch.inference_mode(): + outputs = self.model(input_ids=input_ids, labels=labels, images=videos, modalities="video") + + loss = outputs["loss"] + # loss = torch.exp(loss) + logits = outputs["logits"] + greedy_tokens = logits.argmax(dim=-1) + cont_toks = input_ids[:, contxt_id.shape[1] :] # [1, seq] + greedy_tokens = greedy_tokens[:, contxt_id.shape[1] : input_ids.shape[1]] # [1, seq] + max_equal = (greedy_tokens == cont_toks).all() + res.append((float(loss.item()), bool(max_equal))) + pbar.update(1) + pbar.close() + return res + + def flatten(self, input): + new_list = [] + for i in input: + for j in i: + new_list.append(j) + return new_list + + def generate_until(self, requests) -> List[str]: + res = [] + pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") + + for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + # encode, pad, and truncate contexts for this batch + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + videos = [] + for visual in visuals: + video = self.load_video(visual, self.for_get_frames_num) + video = self._image_processor.preprocess(video, return_tensors="pt")["pixel_values"].half().cuda() + videos.append(video) + + qs = contexts + if self.model.config.mm_use_im_start_end: + qs = DEFAULT_IM_START_TOKEN + DEFAULT_IMAGE_TOKEN + DEFAULT_IM_END_TOKEN + "\n" + qs + else: + qs = DEFAULT_IMAGE_TOKEN + "\n" + qs + + conv = conv_templates[self.conv_template].copy() + conv.append_message(conv.roles[0], qs) + conv.append_message(conv.roles[1], None) + prompt = conv.get_prompt() + + input_ids = tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).cuda() + attention_masks = input_ids.ne(self.tokenizer.pad_token_id).long().cuda() + + stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2 + keywords = [stop_str] + stopping_criteria = KeywordsStoppingCriteria(keywords, self.tokenizer, input_ids) + + cur_prompt = contexts + + if "max_new_tokens" not in gen_kwargs: + gen_kwargs["max_new_tokens"] = 1024 + if "temperature" not in gen_kwargs: + gen_kwargs["temperature"] = 0 + if "top_p" not in gen_kwargs: + gen_kwargs["top_p"] = None + if "num_beams" not in gen_kwargs: + gen_kwargs["num_beams"] = 1 + with torch.inference_mode(): + self.model.update_prompt([[cur_prompt]]) + # import pdb;pdb.set_trace() + output_ids = self.model.generate( + inputs=input_ids, + images=videos, + attention_mask=attention_masks, + modalities="video", + use_cache=self.use_cache, + stopping_criteria=[stopping_criteria], + do_sample=True if gen_kwargs["temperature"] > 0 else False, + temperature=gen_kwargs["temperature"], + top_p=gen_kwargs["top_p"], + num_beams=gen_kwargs["num_beams"], + max_new_tokens=gen_kwargs["max_new_tokens"], + ) + # output_ids = model.generate(inputs=input_ids, images=video, attention_mask=attention_masks, modalities="video", do_sample=True, temperature=0.2, use_cache=True, stopping_criteria=[stopping_criteria]) + + outputs = self.tokenizer.batch_decode(output_ids, skip_special_tokens=True)[0].strip() + res.append(outputs) + pbar.update(1) + return res diff --git a/lmms_eval/models/minicpm_v.py b/lmms_eval/models/minicpm_v.py old mode 100644 new mode 100755 diff --git a/lmms_eval/models/model_utils/__init__.py b/lmms_eval/models/model_utils/__init__.py old mode 100644 new mode 100755 diff --git a/lmms_eval/models/model_utils/qwen/qwen_generate_utils.py b/lmms_eval/models/model_utils/qwen/qwen_generate_utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/models/qwen_vl.py b/lmms_eval/models/qwen_vl.py old mode 100644 new mode 100755 index 2d73e4a5b..a8898745d --- a/lmms_eval/models/qwen_vl.py +++ b/lmms_eval/models/qwen_vl.py @@ -228,9 +228,12 @@ def _collate(x): until = [until] elif not isinstance(until, list): raise ValueError(f"Expected `gen_kwargs['until']` to be of type Union[str,list] but got {type(until)}") + # Tuple object does not support item assignment + # Error may occur here + contexts = [con for con in contexts] for i in range(len(contexts)): if "" in contexts[i]: - context[i] = contexts[i].replace("", "") + contexts[i] = contexts[i].replace("", "") questions = [self.prompt.format(visual_path, context) for visual_path, context in zip(visual_paths, contexts)] # Similar to llava, is visual paths has len 0 diff --git a/lmms_eval/tasks/__init__.py b/lmms_eval/tasks/__init__.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/_task_utils/file_utils.py b/lmms_eval/tasks/_task_utils/file_utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/_task_utils/gpt_eval_utils.py b/lmms_eval/tasks/_task_utils/gpt_eval_utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/_task_utils/vqa_eval_metric.py b/lmms_eval/tasks/_task_utils/vqa_eval_metric.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/ai2d/ai2d.yaml b/lmms_eval/tasks/ai2d/ai2d.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/ai2d/upload_ai2d.py b/lmms_eval/tasks/ai2d/upload_ai2d.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/ai2d/utils.py b/lmms_eval/tasks/ai2d/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/chartqa/chartqa.yaml b/lmms_eval/tasks/chartqa/chartqa.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/chartqa/upload_chartqa.py b/lmms_eval/tasks/chartqa/upload_chartqa.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/chartqa/utils.py b/lmms_eval/tasks/chartqa/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/cmmmu/_cmmmu.yaml b/lmms_eval/tasks/cmmmu/_cmmmu.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/cmmmu/_default_template_cmmmu_yaml b/lmms_eval/tasks/cmmmu/_default_template_cmmmu_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/cmmmu/cmmmu_test.yaml b/lmms_eval/tasks/cmmmu/cmmmu_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/cmmmu/cmmmu_val.yaml b/lmms_eval/tasks/cmmmu/cmmmu_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/cmmmu/utils.py b/lmms_eval/tasks/cmmmu/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/coco_cap/coco2014_cap.yaml b/lmms_eval/tasks/coco_cap/coco2014_cap.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/coco_cap/coco2014_cap_test.yaml b/lmms_eval/tasks/coco_cap/coco2014_cap_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/coco_cap/coco2014_cap_val.yaml b/lmms_eval/tasks/coco_cap/coco2014_cap_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/coco_cap/coco2017_cap.yaml b/lmms_eval/tasks/coco_cap/coco2017_cap.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/coco_cap/coco2017_cap_test.yaml b/lmms_eval/tasks/coco_cap/coco2017_cap_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/coco_cap/coco2017_cap_val.yaml b/lmms_eval/tasks/coco_cap/coco2017_cap_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/coco_cap/coco_cap.yaml b/lmms_eval/tasks/coco_cap/coco_cap.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/coco_cap/utils.py b/lmms_eval/tasks/coco_cap/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/docvqa/_default_template_docvqa_yaml b/lmms_eval/tasks/docvqa/_default_template_docvqa_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/docvqa/docvqa.yaml b/lmms_eval/tasks/docvqa/docvqa.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/docvqa/docvqa_test.yaml b/lmms_eval/tasks/docvqa/docvqa_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/docvqa/docvqa_val.yaml b/lmms_eval/tasks/docvqa/docvqa_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/docvqa/utils.py b/lmms_eval/tasks/docvqa/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/ferret/ferret.yaml b/lmms_eval/tasks/ferret/ferret.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/ferret/rule.json b/lmms_eval/tasks/ferret/rule.json old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/ferret/utils.py b/lmms_eval/tasks/ferret/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/flickr30k/flickr30k.yaml b/lmms_eval/tasks/flickr30k/flickr30k.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/flickr30k/flickr30k_test.yaml b/lmms_eval/tasks/flickr30k/flickr30k_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/flickr30k/utils.py b/lmms_eval/tasks/flickr30k/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/gqa/gqa.yaml b/lmms_eval/tasks/gqa/gqa.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/gqa/utils.py b/lmms_eval/tasks/gqa/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/hallusion_bench/evaluate_hb.py b/lmms_eval/tasks/hallusion_bench/evaluate_hb.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/hallusion_bench/hallusion_bench_image.yaml b/lmms_eval/tasks/hallusion_bench/hallusion_bench_image.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/hallusion_bench/utils.py b/lmms_eval/tasks/hallusion_bench/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/iconqa/_default_template_docvqa_yaml b/lmms_eval/tasks/iconqa/_default_template_docvqa_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/iconqa/iconqa.yaml b/lmms_eval/tasks/iconqa/iconqa.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/iconqa/iconqa_test.yaml b/lmms_eval/tasks/iconqa/iconqa_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/iconqa/iconqa_val.yaml b/lmms_eval/tasks/iconqa/iconqa_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/iconqa/utils.py b/lmms_eval/tasks/iconqa/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/infovqa/_default_template_infovqa_yaml b/lmms_eval/tasks/infovqa/_default_template_infovqa_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/infovqa/infovqa.yaml b/lmms_eval/tasks/infovqa/infovqa.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/infovqa/infovqa_test.yaml b/lmms_eval/tasks/infovqa/infovqa_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/infovqa/infovqa_val.yaml b/lmms_eval/tasks/infovqa/infovqa_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/infovqa/utils.py b/lmms_eval/tasks/infovqa/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/llava-bench-coco/llava-bench-coco.yaml b/lmms_eval/tasks/llava-bench-coco/llava-bench-coco.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/llava-bench-coco/rule.json b/lmms_eval/tasks/llava-bench-coco/rule.json old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/llava-bench-coco/utils.py b/lmms_eval/tasks/llava-bench-coco/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/llava-in-the-wild/llava-in-the-wild.yaml b/lmms_eval/tasks/llava-in-the-wild/llava-in-the-wild.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/llava-in-the-wild/rule.json b/lmms_eval/tasks/llava-in-the-wild/rule.json old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/llava-in-the-wild/utils.py b/lmms_eval/tasks/llava-in-the-wild/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mathvista/mathvista.yaml b/lmms_eval/tasks/mathvista/mathvista.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mathvista/mathvista_evals.py b/lmms_eval/tasks/mathvista/mathvista_evals.py old mode 100644 new mode 100755 index d40f6093f..8fcf120ee --- a/lmms_eval/tasks/mathvista/mathvista_evals.py +++ b/lmms_eval/tasks/mathvista/mathvista_evals.py @@ -62,7 +62,7 @@ def _post_request(self, payload): response.raise_for_status() return response.json() - def get_chat_response(self, prompt, temperature=0, max_tokens=256, n=1, patience=10000000, sleep_time=0): + def get_chat_response(self, prompt, temperature=0, max_tokens=256, n=1, patience=5, sleep_time=0): messages = [ {"role": "user", "content": prompt}, ] diff --git a/lmms_eval/tasks/mathvista/mathvista_test.yaml b/lmms_eval/tasks/mathvista/mathvista_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mathvista/mathvista_testmini.yaml b/lmms_eval/tasks/mathvista/mathvista_testmini.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mathvista/utils.py b/lmms_eval/tasks/mathvista/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mix_evals/_default_template_yaml b/lmms_eval/tasks/mix_evals/_default_template_yaml new file mode 100644 index 000000000..8364226c9 --- /dev/null +++ b/lmms_eval/tasks/mix_evals/_default_template_yaml @@ -0,0 +1,9 @@ +dataset_path: lmms-lab/MixEvals_Video2Text +dataset_kwargs: + token: True + video: True + cache_dir: mix_evals_video2text +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text.yaml new file mode 100755 index 000000000..bee421c0d --- /dev/null +++ b/lmms_eval/tasks/mix_evals/mix_evals_video2text.yaml @@ -0,0 +1,5 @@ +group: mix_evals_video2text +task: +- mix_evals_video2text_open +- mix_evals_video2text_mc +- mix_evals_video2text_freeform \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml new file mode 100755 index 000000000..87ca8b1ee --- /dev/null +++ b/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml @@ -0,0 +1,20 @@ +dataset_name: "video2text_closeended_free-form" +task: "mix_evals_video2text_freeform" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.mix_evals_video2text_doc_to_visual +doc_to_text: !function utils.mix_evals_video2text_doc_to_text +doc_to_target: "{{target}}" +# process_results: !function utils.mix_evals_video2text_process_results_freeform +metric_list: + - metric: exact_match + aggregation: mean + higher_is_better: true + ignore_case: true + ignore_punctuation: true +include: _default_template_yaml + +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "Answer the question using a single word or phrase." \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml new file mode 100755 index 000000000..ca19aa098 --- /dev/null +++ b/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml @@ -0,0 +1,28 @@ +include: _default_template_yaml +dataset_name: "video2text_closeended_multiple-choice" +task: "mix_evals_video2text_mc" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.mix_evals_video2text_doc_to_visual +doc_to_text: !function utils.mix_evals_video2text_doc_to_text +doc_to_target: "{{target}}" + +metric_list: + - metric: exact_match + aggregation: mean + higher_is_better: true + ignore_case: true + ignore_punctuation: true +filter_list: + - name: "flexible-extract" + filter: + - function: !function utils.MultiChoiceRegexFilter + group_select: 0 + ignore_case: true + ignore_punctuation: true + regex_pattern: "(\\([A-Z]\\))" + +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "Answer with the option’s letter from the given choices directly." \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml new file mode 100755 index 000000000..965cf750a --- /dev/null +++ b/lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml @@ -0,0 +1,13 @@ +dataset_name: "video2text_openended" +task: "mix_evals_video2text_open" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.mix_evals_video2text_doc_to_visual +doc_to_text: !function utils.mix_evals_video2text_doc_to_text_open_convs +doc_to_target: "" +process_results: !function utils.mix_evals_video2text_process_results_open_convs +metric_list: + - metric: submission + aggregation: !function utils.mix_evals_video2text_aggregate_gen + higher_is_better: true +include: _default_template_yaml diff --git a/lmms_eval/tasks/mix_evals/utils.py b/lmms_eval/tasks/mix_evals/utils.py new file mode 100755 index 000000000..2cf175f35 --- /dev/null +++ b/lmms_eval/tasks/mix_evals/utils.py @@ -0,0 +1,200 @@ +import os +import re +import sys +import datetime +import lmms_eval.tasks._task_utils.file_utils as file_utils +from lmms_eval.filters.extraction import ExtendedRegexFilter +import json +import logging +import yaml +from pathlib import Path + +with open(Path(__file__).parent / "_default_template_yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + # remove function definition since yaml load cannot handle it + if "!function" not in line: + safe_data.append(line) + + config = yaml.safe_load("".join(safe_data)) + +# A bit ugly here +# But the idea is that we will unzip all the zip files +# To HF HOME cache dir +# And load it here +HF_HOME = os.environ["HF_HOME"] +cache_dir = config["dataset_kwargs"]["cache_dir"] +cache_dir = os.path.join(HF_HOME, cache_dir) +cache_dir = os.path.join(cache_dir) + + +eval_logger = logging.getLogger("lmms-eval") + + +# Pass in video path here +# Can only work correctly with video llm +def mix_evals_video2text_doc_to_visual(doc): + video_path = doc["video_path"] + video_path = os.path.join(cache_dir, video_path) + if os.path.exists(video_path): + video_path = video_path + elif os.path.exists(video_path.replace("mp4", "MP4")): + video_path = video_path.replace("mp4", "MP4") + else: + sys.exit(f"video path:{video_path} does not exist, please check") + return [video_path] + + +# This is the place where you format your question +def mix_evals_video2text_doc_to_text(doc, model_specific_prompt_kwargs=None): + if model_specific_prompt_kwargs is None: + model_specific_prompt_kwargs = {} + pre_prompt = "" + post_prompt = "" + if "pre_prompt" in model_specific_prompt_kwargs: + pre_prompt = model_specific_prompt_kwargs["pre_prompt"] + if "post_prompt" in model_specific_prompt_kwargs: + post_prompt = model_specific_prompt_kwargs["post_prompt"] + + user_prompt = doc["prompt"] + + if "options" in doc: + option_prompt = "Here are the options:\n" + for idx, option in enumerate(doc["options"]): + char_idx = chr(ord("A") + idx) + option = option.strip() + option_prompt += f"{char_idx}. {option}\n" + + option_prompt = option_prompt.rstrip("\n") + user_prompt = f"{user_prompt}\n{option_prompt}" + + if pre_prompt: + user_prompt = f"{pre_prompt}\n{user_prompt}" + + if post_prompt: + user_prompt = f"{user_prompt}\n{post_prompt}" + return user_prompt + + +def mix_evals_video2text_doc_to_text_open_convs(doc, model_specific_prompt_kwargs=None): + if model_specific_prompt_kwargs is None: + model_specific_prompt_kwargs = {} + pre_prompt = "" + post_prompt = "" + if "pre_prompt" in model_specific_prompt_kwargs: + pre_prompt = model_specific_prompt_kwargs["pre_prompt"] + if "post_prompt" in model_specific_prompt_kwargs: + post_prompt = model_specific_prompt_kwargs["post_prompt"] + + formatted_prompt = "" + first_turn_user_prompt = doc["first_turn_user_prompt"] + + if pre_prompt: + formatted_prompt = f"{pre_prompt}\n{first_turn_user_prompt}" + else: + formatted_prompt = f"{first_turn_user_prompt}" + + if "round2" in doc and doc["round2"]: + second_turn_user_prompt = doc["second_turn_user_prompt"] + formatted_prompt += f"{formatted_prompt}\n{second_turn_user_prompt}" + if post_prompt: + formatted_prompt += f"{formatted_prompt}\n{post_prompt}" + return formatted_prompt + else: + if post_prompt: + formatted_prompt += f"{formatted_prompt}\n{post_prompt}" + return formatted_prompt + + +def mix_evals_video2text_process_results_open_convs(doc, result): + pred = result[0] + return {"submission": {"pred": pred, "question_idx": doc["question_index"], "first_turn_video_caption": doc["first_turn_video_caption"], "target": ""}} + + +def mix_evals_video2text_process_results_freeform(doc, result): + pred = result[0] + return {"submission": {"pred": pred, "question_idx": doc["question_index"], "first_turn_video_caption": doc["first_turn_video_caption"], "target": ""}} + + +def mix_evals_video2text_aggregate_submissions(results, args, task): + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + submission_file_name = f"mix_evals_video2text_{task}-{now_date_time}.json" + path = file_utils.generate_submission_file(submission_file_name, args) + with open(path, "w") as f: + json.dump(results, f) + eval_logger.info(f"Submission file saved to {path}") + + +# Factory into different aggregate +def mix_evals_video2text_aggregate_gen(results, args): + mix_evals_video2text_aggregate_submissions(results, args, "OpenConvs") + + +class MultiChoiceRegexFilter(ExtendedRegexFilter): + def __init__(self, *args, **kwargs): + """ + regex_pattern: The basic regex pattern to use. If fails to match, we will use the customized match procedure + - step 1 : We parse the choices between ([A-Z])s then try to find these choices in the response. + - step 2 : We parse the choice with regex :[\s]*([A-?]), where ? varies by number of choices. + group_select: Selects the (group_select)th match from the findall result. + ignore_case: Ignores the case during step 1 matching + ignore_punctuation: Remove the punctuation during step 1 matching + regexes_to_ignore: Remove these regexes during step 1 matching + """ + super().__init__(*args, **kwargs) + + def apply(self, resps, docs): + # here, we assume we have a list, in which each element is + # a list of model responses for some particular input/target pair. + # so we process each of these (same input/target response sets) + # independently (and keep them a list.) + + filtered_resps = [] + + for r, doc in zip(resps, docs): + fallback_regexes = [] + choice_to_alpha = {} + next_alpha = "A" + + without_paren_fallback_regexes = [] + without_paren_to_target = {} + + options_prompt = "" + for idx, option in enumerate(doc["options"]): + char_idx = chr(ord("A") + idx) + option = option.strip() + options_prompt += f"{char_idx}. {option}\n" + options_prompt = options_prompt.rstrip("\n") + # Regex to extract multiple choice options from the question + multiple_choices_regex = re.compile(r"\b([A-Z])\.\s+([^\n]*)") + matches = multiple_choices_regex.findall(options_prompt) + + # Build regex patterns and mappings for each choice + for m in matches: + choice_text = m[1].strip() + fallback_regexes.append(f"{re.escape(choice_text)}") + choice_to_alpha[choice_text] = next_alpha + + next_alpha = chr(ord(next_alpha) + 1) + + # Compile regex to match any of the extracted choices + fallback_regex = re.compile("|".join(fallback_regexes)) + + # Process each response + filtered = [] + for resp in r: + # Remove any punctuation and extra spaces + cleaned_resp = re.sub(r"[^\w\s]", "", resp).strip() + # Try to match cleaned response with the choice text + match = fallback_regex.search(cleaned_resp) + if match and match.group() in choice_to_alpha: + # Map the matched choice text back to its corresponding letter + filtered.append(choice_to_alpha[match.group()]) + else: + # If no match, return the cleaned response + filtered.append(cleaned_resp) + + filtered_resps.append(filtered[0]) + + return filtered_resps diff --git a/lmms_eval/tasks/mmbench/cc_utils.py b/lmms_eval/tasks/mmbench/cc_utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmbench/cn_utils.py b/lmms_eval/tasks/mmbench/cn_utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmbench/en_utils.py b/lmms_eval/tasks/mmbench/en_utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmbench/mmbench.yaml b/lmms_eval/tasks/mmbench/mmbench.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmbench/mmbench_cc.yaml b/lmms_eval/tasks/mmbench/mmbench_cc.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmbench/mmbench_cn.yaml b/lmms_eval/tasks/mmbench/mmbench_cn.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmbench/mmbench_cn_dev.yaml b/lmms_eval/tasks/mmbench/mmbench_cn_dev.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmbench/mmbench_cn_test.yaml b/lmms_eval/tasks/mmbench/mmbench_cn_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmbench/mmbench_en.yaml b/lmms_eval/tasks/mmbench/mmbench_en.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmbench/mmbench_en_dev.yaml b/lmms_eval/tasks/mmbench/mmbench_en_dev.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmbench/mmbench_en_test.yaml b/lmms_eval/tasks/mmbench/mmbench_en_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmbench/mmbench_evals.py b/lmms_eval/tasks/mmbench/mmbench_evals.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mme/mme.yaml b/lmms_eval/tasks/mme/mme.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mme/utils.py b/lmms_eval/tasks/mme/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmmu/mmmu.yaml b/lmms_eval/tasks/mmmu/mmmu.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmmu/mmmu_test.yaml b/lmms_eval/tasks/mmmu/mmmu_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmmu/mmmu_val.yaml b/lmms_eval/tasks/mmmu/mmmu_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmmu/utils.py b/lmms_eval/tasks/mmmu/utils.py old mode 100644 new mode 100755 index bc68c00e3..302a6dff2 --- a/lmms_eval/tasks/mmmu/utils.py +++ b/lmms_eval/tasks/mmmu/utils.py @@ -16,11 +16,11 @@ def replace_images_tokens(input_string): - for i in range(1, 8): - question_text = f"" - query_text = "" - if question_text in input_string: - input_string = input_string.replace(question_text, query_text) + # for i in range(1, 8): + # question_text = f"" + # query_text = "" + # if question_text in input_string: + # input_string = input_string.replace(question_text, query_text) return input_string @@ -51,7 +51,7 @@ def mmmu_doc_to_visual(doc): prompt = construct_prompt(doc) image_tokens = re.findall(r"", prompt) # Remove <> and swap space as _ - image_tokens = [image_token.strip("<>").replace(" ", "_") for image_token in image_tokens] + image_tokens = sorted(list(set([image_token.strip("<>").replace(" ", "_") for image_token in image_tokens]))) visual = [doc[image_token].convert("RGB") for image_token in image_tokens] return visual diff --git a/lmms_eval/tasks/mmvet/mmvet.yaml b/lmms_eval/tasks/mmvet/mmvet.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmvet/utils.py b/lmms_eval/tasks/mmvet/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/multidocvqa/multidocvqa.yaml b/lmms_eval/tasks/multidocvqa/multidocvqa.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/multidocvqa/multidocvqa_test.yaml b/lmms_eval/tasks/multidocvqa/multidocvqa_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/multidocvqa/multidocvqa_val.yaml b/lmms_eval/tasks/multidocvqa/multidocvqa_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/multidocvqa/utils.py b/lmms_eval/tasks/multidocvqa/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/nocaps/_default_template_nocaps_yaml b/lmms_eval/tasks/nocaps/_default_template_nocaps_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/nocaps/nocaps.yaml b/lmms_eval/tasks/nocaps/nocaps.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/nocaps/nocaps_test.yaml b/lmms_eval/tasks/nocaps/nocaps_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/nocaps/nocaps_val.yaml b/lmms_eval/tasks/nocaps/nocaps_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/nocaps/utils.py b/lmms_eval/tasks/nocaps/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/ok_vqa/_default_template_vqa_yaml b/lmms_eval/tasks/ok_vqa/_default_template_vqa_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/ok_vqa/_generate_config.py b/lmms_eval/tasks/ok_vqa/_generate_config.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/ok_vqa/_ok_vqa.yaml b/lmms_eval/tasks/ok_vqa/_ok_vqa.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/ok_vqa/ok_vqa_val2014.yaml b/lmms_eval/tasks/ok_vqa/ok_vqa_val2014.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/ok_vqa/utils.py b/lmms_eval/tasks/ok_vqa/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/olympiadbench/cn_utils.py b/lmms_eval/tasks/olympiadbench/cn_utils.py index 34e5ce4d4..628d51da1 100644 --- a/lmms_eval/tasks/olympiadbench/cn_utils.py +++ b/lmms_eval/tasks/olympiadbench/cn_utils.py @@ -5,14 +5,17 @@ from lmms_eval.tasks._task_utils.file_utils import generate_submission_file import logging + eval_logger = logging.getLogger("lmms-eval") dir_name = os.path.dirname(os.path.abspath(__file__)) olympiadbench_evaluator = OlympiadBenchEvaluator() + def olympiadbench_doc_to_visual(doc): return [image.convert("RGB") for image in doc["images"]] + def olympiadbench_doc_to_text(doc): question = doc["question"] subject = doc["subfield"] @@ -36,28 +39,26 @@ def olympiadbench_doc_to_text(doc): else: post_prompt += '"所以最终答案是\\boxed{用英⽂逗号连接的多个答案}。"\n' - final_question = pre_prompt + question + '\n' + post_prompt + final_question = pre_prompt + question + "\n" + post_prompt return final_question + def olympiadbench_process_results(doc, results): precision = doc["error"] - is_proving = "TP" in doc["source"] + is_proving = "TP" in doc["source"] if precision is None: precision = 0 prediction = results[0].strip() if is_proving: - return { - "submission": prediction - } + return {"submission": prediction} else: prediction = prediction.split("所以最终答案是")[-1] prediction = prediction.replace('"', "").replace("\n", "").replace(" ", "").strip(".").strip("。") accuracy = olympiadbench_evaluator.judge(prediction, doc["final_answer"][0], precision) accuracy = int(accuracy) - return { - "exact_match": accuracy - } + return {"exact_match": accuracy} + def olympiadbench_aggregate_results(results, args): now_date_time = datetime.datetime.now().strftime("%Y-%m%d-%H%M-%S") @@ -66,4 +67,3 @@ def olympiadbench_aggregate_results(results, args): with open(path, "w") as f: json.dump(results, f, ensure_ascii=False) print(f"Submission file saved to {path}") - \ No newline at end of file diff --git a/lmms_eval/tasks/olympiadbench/en_utils.py b/lmms_eval/tasks/olympiadbench/en_utils.py index a21ee159f..4b165e385 100644 --- a/lmms_eval/tasks/olympiadbench/en_utils.py +++ b/lmms_eval/tasks/olympiadbench/en_utils.py @@ -5,14 +5,17 @@ from lmms_eval.tasks._task_utils.file_utils import generate_submission_file import logging + eval_logger = logging.getLogger("lmms-eval") dir_name = os.path.dirname(os.path.abspath(__file__)) olympiadbench_evaluator = OlympiadBenchEvaluator() + def olympiadbench_doc_to_visual(doc): return [image.convert("RGB") for image in doc["images"]] + def olympiadbench_doc_to_text(doc): question = doc["question"] subject = doc["subfield"] @@ -30,34 +33,34 @@ def olympiadbench_doc_to_text(doc): post_prompt += f"The answer of the question should be {ans_type}.\n" else: post_prompt += f"The question has multiple answers, each of them should be {ans_type}.\n" - post_prompt += "Please calculate the answer according to the given requirements and the information provided. Please use LaTeX format to represent the variables and formulas used in the solution process and results. Please end your solution with " + post_prompt += ( + "Please calculate the answer according to the given requirements and the information provided. Please use LaTeX format to represent the variables and formulas used in the solution process and results. Please end your solution with " + ) if not mul_ans: post_prompt += '"So the final answer is \\boxed{answer}."\n' else: - post_prompt += 'So the final answer is \\boxed{multiple answers connected with commas}.\n' + post_prompt += "So the final answer is \\boxed{multiple answers connected with commas}.\n" - final_question = pre_prompt + question + '\n' + post_prompt + final_question = pre_prompt + question + "\n" + post_prompt return final_question + def olympiadbench_process_results(doc, results): precision = doc["error"] - is_proving = "TP" in doc["source"] + is_proving = "TP" in doc["source"] if precision is None: precision = 0 prediction = results[0].strip() if is_proving: - return { - "submission": prediction - } + return {"submission": prediction} else: prediction = prediction.split("final answer is")[-1] prediction = prediction.replace('"', "").replace("\n", "").replace(" ", "").strip(".").strip("。") accuracy = olympiadbench_evaluator.judge(prediction, doc["final_answer"][0], precision) accuracy = int(accuracy) - return { - "exact_match": accuracy - } + return {"exact_match": accuracy} + def olympiadbench_aggregate_results(results, args): now_date_time = datetime.datetime.now().strftime("%Y-%m%d-%H%M-%S") @@ -66,4 +69,3 @@ def olympiadbench_aggregate_results(results, args): with open(path, "w") as f: json.dump(results, f, ensure_ascii=False) print(f"Submission file saved to {path}") - \ No newline at end of file diff --git a/lmms_eval/tasks/olympiadbench/olympiadbench_evals.py b/lmms_eval/tasks/olympiadbench/olympiadbench_evals.py index dd40f6111..709ee9885 100644 --- a/lmms_eval/tasks/olympiadbench/olympiadbench_evals.py +++ b/lmms_eval/tasks/olympiadbench/olympiadbench_evals.py @@ -11,6 +11,7 @@ # precision = 1e-4 # res = scorer.judge(exp1, exp2, precision) + class OlympiadBenchEvaluator: def __init__(self): # Map of special symbols to their replacements @@ -46,8 +47,8 @@ def split_by_comma(self, expr: str): start_idx = i + 1 if start_idx < len(expr): - splitted_expr.append(expr[start_idx:].strip()) - + splitted_expr.append(expr[start_idx:].strip()) + return splitted_expr def trans_plus_minus_sign(self, expr_list: list): @@ -59,9 +60,9 @@ def trans_plus_minus_sign(self, expr_list: list): new_expr_list.append(expr.replace("\\pm", "-")) else: new_expr_list.append(expr) - + return new_expr_list - + def judge(self, expression1, expression2, precision=1e-8): # Judge if two expressions are equal (expression1 is considered as the Ground Truth) # Default precision is a list for supporting multiple expressions @@ -74,11 +75,11 @@ def judge(self, expression1, expression2, precision=1e-8): if expression1 == expression2: # print("Exactly equal") return True - + # Remove Chinese characters from the string, as answers like "yes" or "no" in Chinese have been considered - expression1 = re.sub(r'[\u4e00-\u9fff]+', '', expression1) - expression2 = re.sub(r'[\u4e00-\u9fff]+', '', expression2) - + expression1 = re.sub(r"[\u4e00-\u9fff]+", "", expression1) + expression2 = re.sub(r"[\u4e00-\u9fff]+", "", expression2) + expression1 = self.split_by_comma(expression1) expression2 = self.split_by_comma(expression2) @@ -88,7 +89,6 @@ def judge(self, expression1, expression2, precision=1e-8): # Set up a list for allowed errors if len(precision) <= 1: precision = precision * len(temp_list1) - if len(temp_list1) != len(temp_list2): return False @@ -112,7 +112,7 @@ def judge(self, expression1, expression2, precision=1e-8): # If all elements are matched, return True return True - + def is_interval(self, expr): # Checks if an expression is an interval return expr.startswith(("(", "[")) and expr.endswith((")", "]")) @@ -120,7 +120,7 @@ def is_interval(self, expr): def sympy_sub_pi(self, expression_sympy): # Replaces the symbol for pi in sympy expressions with its numerical value return expression_sympy.subs(self.pi, math.pi) - + def is_equal(self, expression1, expression2): # Default first expression is ground truth. Check if expressions are equal in different aspects if expression1 == expression2 and expression1 != "" and expression2 != "": @@ -143,7 +143,6 @@ def is_equal(self, expression1, expression2): return True except: pass - # Then check if expressions are mathematically equal try: if self.expression_equal(expression1, expression2) and not ("=" in expression1 and "=" in expression2): @@ -151,7 +150,6 @@ def is_equal(self, expression1, expression2): return True except: pass - # Lastly, check for equation equality try: if self.equation_equal(expression1, expression2): @@ -159,7 +157,6 @@ def is_equal(self, expression1, expression2): return True except: pass - return False def numerical_equal(self, expression1: str, expression2: str, include_percentage: bool = True): @@ -167,17 +164,14 @@ def numerical_equal(self, expression1: str, expression2: str, include_percentage # Includes possible percentage cases reference = float(expression1) prediction = float(expression2) - if include_percentage: gt_result = [reference / 100, reference, reference * 100] else: gt_result = [reference] - for item in gt_result: if abs(item - prediction) <= self.precision * 1.01: return True return False - def expression_equal(self, exp1, exp2): # Check if two expressions are mathematically equivalent @@ -186,7 +180,7 @@ def extract_expression(expression): if "=" in expression: expression = expression.split("=")[1] return expression.strip() - + exp1 = extract_expression(exp1) exp2 = extract_expression(exp2) @@ -204,7 +198,7 @@ def extract_expression(expression): elif not expr1_sym.has(sp.Symbol) and not expr2_sym.has(sp.Symbol): try: if not (self.can_compute_power(expr1_sym) and self.can_compute_power(expr2_sym)): - print(f"These two numbers cannot be calculated by the current computer for: \"{str(expr1_sym)}\" and \"{str(expr2_sym)}\"") + print(f'These two numbers cannot be calculated by the current computer for: "{str(expr1_sym)}" and "{str(expr2_sym)}"') return False if abs(expr1_sym.evalf() - expr2_sym.evalf()) <= self.precision * 1.01: @@ -218,7 +212,6 @@ def extract_expression(expression): simplified_expr = simplify(expr1_sym - expr2_sym) num_value = simplified_expr.evalf() - return abs(num_value) < 1e-3 except: return False @@ -227,7 +220,7 @@ def equation_equal(self, expression1, expression2): # Check if two equations are mathematically equivalent # Simplify equations and use sympy for equivalence checking def simplify_equation(latex_eq): - lhs, rhs = latex_eq.split('=') + lhs, rhs = latex_eq.split("=") lhs_expr = parse_latex(lhs) rhs_expr = parse_latex(rhs) @@ -254,18 +247,18 @@ def interval_equal(self, expression1, expression2): def compare_two_interval(inter1, inter2): if inter1[0] != inter2[0] or inter1[-1] != inter2[-1]: return False - - inter1 = inter1.strip('[]()') - inter2 = inter2.strip('[]()') - items_1 = inter1.split(',') - items_2 = inter2.split(',') + inter1 = inter1.strip("[]()") + inter2 = inter2.strip("[]()") + + items_1 = inter1.split(",") + items_2 = inter2.split(",") for item_1, item_2 in zip(items_1, items_2): if not self.expression_equal(item_1, item_2): return False return True - + interval1 = expression1 interval2 = expression2 @@ -274,7 +267,6 @@ def compare_two_interval(inter1, inter2): else: inter_list1 = interval1.split("\\cup") inter_list2 = interval2.split("\\cup") - if len(inter_list1) != len(inter_list2): return False else: @@ -286,7 +278,7 @@ def compare_two_interval(inter1, inter2): def preprocess(self, expression1, expression2): # Preprocess expressions to extract and replace special symbols def extract_boxed_content(latex_str): - boxed_matches = re.finditer(r'\\boxed{', latex_str) + boxed_matches = re.finditer(r"\\boxed{", latex_str) results = "" for match in boxed_matches: @@ -295,14 +287,14 @@ def extract_boxed_content(latex_str): stack = 1 while stack > 0 and end_index < len(latex_str): - if latex_str[end_index] == '{': + if latex_str[end_index] == "{": stack += 1 - elif latex_str[end_index] == '}': + elif latex_str[end_index] == "}": stack -= 1 end_index += 1 if stack == 0: - content = latex_str[start_index:end_index - 1] + content = latex_str[start_index : end_index - 1] results += content + "," else: raise ValueError("Mismatched braces in LaTeX string.") @@ -317,28 +309,28 @@ def extract_boxed_content(latex_str): results += ans + "," else: results = latex_str - + return results - + def sepcial_symbol_replace(expression): if "\\in " in expression: expression = expression.split("\\in ")[1] - + for signal in self.special_signal_map: expression = expression.replace(signal, self.special_signal_map[signal]) expression = expression.strip("\n$,.:;^_=+`!@#$%^&*~,。") - pattern = r'\\(?:mathrm|mathbf)\{~?([^}]*)\}' - expression = re.sub(pattern, r'\1', expression) + pattern = r"\\(?:mathrm|mathbf)\{~?([^}]*)\}" + expression = re.sub(pattern, r"\1", expression) return expression - + exp1, exp2 = extract_boxed_content(expression1), extract_boxed_content(expression2) exp1, exp2 = sepcial_symbol_replace(exp1), sepcial_symbol_replace(exp2) return exp1, exp2 - + def can_compute_power(self, expr): # Checks if a power expression can be computed if isinstance(expr, Pow): @@ -352,4 +344,4 @@ def can_compute_power(self, expr): else: return False else: - return True # Not a power expression, can compute \ No newline at end of file + return True # Not a power expression, can compute diff --git a/lmms_eval/tasks/pope/pope.yaml b/lmms_eval/tasks/pope/pope.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/pope/utils.py b/lmms_eval/tasks/pope/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/realworldqa/realworldqa.yaml b/lmms_eval/tasks/realworldqa/realworldqa.yaml new file mode 100644 index 000000000..9d7dfcb39 --- /dev/null +++ b/lmms_eval/tasks/realworldqa/realworldqa.yaml @@ -0,0 +1,42 @@ +dataset_path: lmms-lab/RealWorldQA +dataset_kwargs: + token: True +task: "realworldqa" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.realworldqa_doc_to_visual +doc_to_text: !function utils.realworldqa_doc_to_text +doc_to_target: "answer" + +generation_kwargs: + max_new_tokens: 16 + temperature: 0 + top_p: 0 + num_beams: 1 + do_sample: false + +filter_list: + - name: "flexible-extract" + filter: + - function: !function utils.MultiChoiceRegexFilter + group_select: 0 + ignore_case: true + ignore_punctuation: true + regex_pattern: "(\\([A-Z]\\))" + +metric_list: + - metric: exact_match + aggregation: mean + higher_is_better: true + ignore_case: true + ignore_punctuation: true + +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" + gpt4v: + pre_prompt: "" + post_prompt: "" +metadata: + - version: 0.0 diff --git a/lmms_eval/tasks/realworldqa/utils.py b/lmms_eval/tasks/realworldqa/utils.py new file mode 100644 index 000000000..9ed645ed1 --- /dev/null +++ b/lmms_eval/tasks/realworldqa/utils.py @@ -0,0 +1,117 @@ +from lmms_eval.filters.extraction import ExtendedRegexFilter +from lmms_eval.filters.transformation import MapFilter +import re + +REPLACE_PROMPT = "Please answer directly with only the letter of the correct option and nothing else." + + +def realworldqa_doc_to_visual(doc): + return [doc["image"].convert("RGB")] + + +def realworldqa_doc_to_text(doc, model_specific_prompt_kwargs=None): + if model_specific_prompt_kwargs is None: + model_specific_prompt_kwargs = {} + pre_prompt = "" + post_prompt = "" + question = doc["question"].strip() + if "pre_prompt" in model_specific_prompt_kwargs: + pre_prompt = model_specific_prompt_kwargs["pre_prompt"] + if "post_prompt" in model_specific_prompt_kwargs and model_specific_prompt_kwargs["post_prompt"]: + question = question.replace(REPLACE_PROMPT, "") + post_prompt = model_specific_prompt_kwargs["post_prompt"] + return f"{pre_prompt}{question}{post_prompt}" + + +# number_words_to_digits = { +# "zero": "0", "one": "1", "two": "2", "three": "3", "four": "4", +# "five": "5", "six": "6", "seven": "7", "eight": "8", "nine": "9", +# "ten": "10" +# } + + +def realworldqa_process_results(doc, results): + pred = results[0].lower().strip().rstrip(".") + gt_ans = doc["answer"].lower().strip() + + print(f"Prediction: {pred}, Ground Truth: {gt_ans}") + # assert gt_ans in ["a", "b", "c", "d"] + score = 1.0 if pred == gt_ans else 0.0 + return { + "exact_match": score, + } + + +class NumberWordsToDigitsFilter(MapFilter): + def __init__(self) -> None: + mapping_dict = {"zero": "0", "one": "1", "two": "2", "three": "3", "four": "4", "five": "5", "six": "6", "seven": "7", "eight": "8", "nine": "9", "ten": "10"} + super().__init__(mapping_dict, default_value=None) + + def apply(self, resps, docs): + def filter_set(inst): + return [self.mapping_dict.get(resp.lower(), resp) for resp in inst] + + return [filter_set(resp) for resp in resps] + + +class MultiChoiceRegexFilter(ExtendedRegexFilter): + def __init__(self, *args, **kwargs): + """ + regex_pattern: The basic regex pattern to use. If fails to match, we will use the customized match procedure + - step 1 : We parse the choices between ([A-Z])s then try to find these choices in the response. + - step 2 : We parse the choice with regex :[\s]*([A-?]), where ? varies by number of choices. + group_select: Selects the (group_select)th match from the findall result. + ignore_case: Ignores the case during step 1 matching + ignore_punctuation: Remove the punctuation during step 1 matching + regexes_to_ignore: Remove these regexes during step 1 matching + """ + super().__init__(*args, **kwargs) + + def apply(self, resps, docs): + # here, we assume we have a list, in which each element is + # a list of model responses for some particular input/target pair. + # so we process each of these (same input/target response sets) + # independently (and keep them a list.) + + filtered_resps = [] + + for r, doc in zip(resps, docs): + fallback_regexes = [] + choice_to_alpha = {} + next_alpha = "A" + + without_paren_fallback_regexes = [] + without_paren_to_target = {} + + # Regex to extract multiple choice options from the question + multiple_choices_regex = re.compile(r"\b([A-Z])\.\s+([^\n]*)") + matches = multiple_choices_regex.findall(doc["question"]) + + # Build regex patterns and mappings for each choice + for m in matches: + choice_text = m[1].strip() + fallback_regexes.append(f"{re.escape(choice_text)}") + choice_to_alpha[choice_text] = next_alpha + + next_alpha = chr(ord(next_alpha) + 1) + + # Compile regex to match any of the extracted choices + fallback_regex = re.compile("|".join(fallback_regexes)) + + # Process each response + filtered = [] + for resp in r: + # Remove any punctuation and extra spaces + cleaned_resp = re.sub(r"[^\w\s]", "", resp).strip() + # Try to match cleaned response with the choice text + match = fallback_regex.search(cleaned_resp) + if match and match.group() in choice_to_alpha: + # Map the matched choice text back to its corresponding letter + filtered.append(choice_to_alpha[match.group()]) + else: + # If no match, return the cleaned response + filtered.append(cleaned_resp) + + filtered_resps.append(filtered[0]) + + return filtered_resps diff --git a/lmms_eval/tasks/refcoco+/_default_template_bbox_yaml b/lmms_eval/tasks/refcoco+/_default_template_bbox_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco+/_default_template_seg_yaml b/lmms_eval/tasks/refcoco+/_default_template_seg_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco+/_generate_config.py b/lmms_eval/tasks/refcoco+/_generate_config.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco+/_refcoco.yaml b/lmms_eval/tasks/refcoco+/_refcoco.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco+/refcoco+_bbox_testA.yaml b/lmms_eval/tasks/refcoco+/refcoco+_bbox_testA.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco+/refcoco+_bbox_testB.yaml b/lmms_eval/tasks/refcoco+/refcoco+_bbox_testB.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco+/refcoco+_bbox_val.yaml b/lmms_eval/tasks/refcoco+/refcoco+_bbox_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco+/refcoco+_seg_testA.yaml b/lmms_eval/tasks/refcoco+/refcoco+_seg_testA.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco+/refcoco+_seg_testB.yaml b/lmms_eval/tasks/refcoco+/refcoco+_seg_testB.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco+/refcoco+_seg_val.yaml b/lmms_eval/tasks/refcoco+/refcoco+_seg_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco+/utils.py b/lmms_eval/tasks/refcoco+/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco/_default_template_bbox_yaml b/lmms_eval/tasks/refcoco/_default_template_bbox_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco/_default_template_seg_yaml b/lmms_eval/tasks/refcoco/_default_template_seg_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco/_generate_config.py b/lmms_eval/tasks/refcoco/_generate_config.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco/_refcoco.yaml b/lmms_eval/tasks/refcoco/_refcoco.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco/refcoco_bbox_test.yaml b/lmms_eval/tasks/refcoco/refcoco_bbox_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco/refcoco_bbox_testA.yaml b/lmms_eval/tasks/refcoco/refcoco_bbox_testA.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco/refcoco_bbox_testB.yaml b/lmms_eval/tasks/refcoco/refcoco_bbox_testB.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco/refcoco_bbox_val.yaml b/lmms_eval/tasks/refcoco/refcoco_bbox_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco/refcoco_seg_test.yaml b/lmms_eval/tasks/refcoco/refcoco_seg_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco/refcoco_seg_testA.yaml b/lmms_eval/tasks/refcoco/refcoco_seg_testA.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco/refcoco_seg_testB.yaml b/lmms_eval/tasks/refcoco/refcoco_seg_testB.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco/refcoco_seg_val.yaml b/lmms_eval/tasks/refcoco/refcoco_seg_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcoco/utils.py b/lmms_eval/tasks/refcoco/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcocog/_default_template_bbox_yaml b/lmms_eval/tasks/refcocog/_default_template_bbox_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcocog/_default_template_seg_yaml b/lmms_eval/tasks/refcocog/_default_template_seg_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcocog/_generate_config.py b/lmms_eval/tasks/refcocog/_generate_config.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcocog/_refcoco.yaml b/lmms_eval/tasks/refcocog/_refcoco.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcocog/refcocog_bbox_test.yaml b/lmms_eval/tasks/refcocog/refcocog_bbox_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcocog/refcocog_bbox_val.yaml b/lmms_eval/tasks/refcocog/refcocog_bbox_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcocog/refcocog_seg_test.yaml b/lmms_eval/tasks/refcocog/refcocog_seg_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcocog/refcocog_seg_val.yaml b/lmms_eval/tasks/refcocog/refcocog_seg_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/refcocog/utils.py b/lmms_eval/tasks/refcocog/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/scienceqa/scienceqa.yaml b/lmms_eval/tasks/scienceqa/scienceqa.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/scienceqa/scienceqa_full.yaml b/lmms_eval/tasks/scienceqa/scienceqa_full.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/scienceqa/scienceqa_img.yaml b/lmms_eval/tasks/scienceqa/scienceqa_img.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/scienceqa/utils.py b/lmms_eval/tasks/scienceqa/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/seedbench/seedbench.yaml b/lmms_eval/tasks/seedbench/seedbench.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/seedbench/seedbench_ppl.yaml b/lmms_eval/tasks/seedbench/seedbench_ppl.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/seedbench/utils.py b/lmms_eval/tasks/seedbench/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/seedbench_2/seedbench_2.yaml b/lmms_eval/tasks/seedbench_2/seedbench_2.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/seedbench_2/utils.py b/lmms_eval/tasks/seedbench_2/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/sft_eval/_default_sft_eval_ocr_rec_template_yaml b/lmms_eval/tasks/sft_eval/_default_sft_eval_ocr_rec_template_yaml new file mode 100644 index 000000000..b00317d63 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/_default_sft_eval_ocr_rec_template_yaml @@ -0,0 +1,23 @@ +dataset_path: lmms-lab/sft-eval +output_type: generate_until +doc_to_visual: !function utils.sft_eval_doc_to_visual +doc_to_text: !function utils.sft_eval_doc_to_text +doc_to_target: "answer" +generation_kwargs: + max_new_tokens: 128 + until: + - "ASSISTANT:" +process_results: !function utils.process_result_ocr_rec +metric_list: + - metric: edit_distance + aggregation : !function utils.sft_eval_edit_dist_agg + higher_is_better : true + - metric: edit_acc + aggregation : !function utils.sft_eval_edit_dist_acc_agg + higher_is_better : true +metadata: + version: '0.0' +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" \ No newline at end of file diff --git a/lmms_eval/tasks/sft_eval/_default_sft_eval_rest_template_yaml b/lmms_eval/tasks/sft_eval/_default_sft_eval_rest_template_yaml new file mode 100644 index 000000000..b658dfb40 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/_default_sft_eval_rest_template_yaml @@ -0,0 +1,20 @@ +dataset_path: lmms-lab/sft-eval +output_type: generate_until +doc_to_visual: !function utils.sft_eval_doc_to_visual +doc_to_text: !function utils.sft_eval_doc_to_text +doc_to_target: "answer" +generation_kwargs: + max_new_tokens: 128 + until: + - "ASSISTANT:" +process_results: !function utils.process_result_rest +metric_list: + - metric: fuzzy_match + aggregation : !function utils.sft_eval_acc_agg + higher_is_better : true +metadata: + version: '0.0' +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" \ No newline at end of file diff --git a/lmms_eval/tasks/sft_eval/_generate_config.py b/lmms_eval/tasks/sft_eval/_generate_config.py new file mode 100644 index 000000000..e1dbcb831 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/_generate_config.py @@ -0,0 +1,94 @@ +import os +import yaml + +splits = [ + "sft-activity", + "sft-arts", + "sft-body", + "sft-car", + "sft-color", + "sft-commodity", + "sft-count", + "sft-daily", + "sft-engineer", + "sft-entertainment", + "sft-exist", + "sft-face", + "sft-food", + "sft-healthcare", + "sft-landmark", + "sft-logo", + "sft-natural", + "sft-ocr_qa_adv", + "sft-ocr_qa_chart", + "sft-ocr_qa_form", + "sft-ocr_qa_scene", + "sft-ocr_qa_screen", + "sft-ocr_rec_adv", + "sft-ocr_rec_doc", + "sft-ocr_rec_handwrite", + "sft-ocr_rec_markdown", + "sft-ocr_rec_scene", + "sft-ocr_rec_screen", + "sft-place", + "sft-position", + "sft-sport", + "sft-status", +] +dir_path = os.path.dirname(os.path.realpath(__file__)) + +local_name2official_name = { + "sft-ocr_rec_scene": "sft_ocr_scene_cn_eval", + "sft-ocr_rec_screen": "sft_ocr_screen_cn_eval", + "sft-ocr_rec_handwrite": "sft_ocr_handwrite_cn_eval", + "sft-ocr_rec_adv": "sft_ocr_adv_cn_eval", + "sft-ocr_rec_doc": "sft_ocr_doc_cn_eval", + "sft-ocr_qa_scene": "sft_ocr_sceneQA_cn_eval", + "sft-ocr_qa_screen": "sft_ocr_screenQA_cn_eval", + "sft-ocr_qa_adv": "sft_ocr_ecommerceQA_cn_eval", + "sft-ocr_rec_markdown": "sft_ocr_markdown_cn_eval", + "sft-ocr_qa_form": "sft_ocr_formQA_cn_eval", + "sft-ocr_qa_chart": "sft_ocr_chartQA_cn_eval", + "sft-face": "sft_celeb_cn_eval", + "sft-body": "sft_body_cn_eval", + "sft-count": "sft_count_cn_eval", + "sft-position": "sft_position_cn_eval", + "#": "sft_visualprompt_cn_eval", + "!": "sft_grounding_cn_eval", + "sft-exist": "sft_exist_cn_eval", + "sft-color": "sft_color_cn_eval", + "sft-status": "sft_status_cn_eval", + "sft-activity": "sft_activity_cn_eval", + "sft-place": "sft_place_cn_eval", + "sft-daily": "sft_daily_cn_eval", + "sft-arts": "sft_arts_cn_eval", + "sft-natural": "sft_natural_cn_eval", + "sft-engineer": "sft_engineer_cn_eval", + "sft-healthcare": "sft_healthcare_cn_eval", + "sft-entertainment": "sft_entertainment_cn_eval", + "sft-sport": "sft_sport_cn_eval", + "sft-commodity": "sft_commodity_cn_eval", + "sft-food": "sft_food_cn_eval", + "sft-car": "sft_car_cn_eval", + "sft-landmark": "sft_landmark_cn_eval", +} + +task_name = [local_name2official_name[split] if split in local_name2official_name else split for split in splits] +splits = [split.replace("-", "_") for split in splits] + +if __name__ == "__main__": + for split, task in zip(splits, task_name): + yaml_dict = {"group": f"sft_eval", "task": task, "test_split": split, "dataset_name": split} + save_path = os.path.join(dir_path, f"{split}.yaml") + if "ocr" in split and "rec" in split: + yaml_dict["include"] = "_default_sft_eval_ocr_rec_template_yaml" + else: + yaml_dict["include"] = "_default_sft_eval_rest_template_yaml" + print(f"Saving to {save_path}") + with open(save_path, "w") as f: + yaml.dump(yaml_dict, f, default_flow_style=False, sort_keys=False) + + group_dict = {"group": "sft_eval", "task": splits} + + with open(os.path.join(dir_path, "_sft_eval.yaml"), "w") as f: + yaml.dump(group_dict, f, default_flow_style=False, indent=4) diff --git a/lmms_eval/tasks/sft_eval/_sft_eval.yaml b/lmms_eval/tasks/sft_eval/_sft_eval.yaml new file mode 100644 index 000000000..c336a4dd0 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/_sft_eval.yaml @@ -0,0 +1,34 @@ +group: sft_eval +task: +- sft_activity +- sft_arts +- sft_body +- sft_car +- sft_color +- sft_commodity +- sft_count +- sft_daily +- sft_engineer +- sft_entertainment +- sft_exist +- sft_face +- sft_food +- sft_healthcare +- sft_landmark +- sft_logo +- sft_natural +- sft_ocr_qa_adv +- sft_ocr_qa_chart +- sft_ocr_qa_form +- sft_ocr_qa_scene +- sft_ocr_qa_screen +- sft_ocr_rec_adv +- sft_ocr_rec_doc +- sft_ocr_rec_handwrite +- sft_ocr_rec_markdown +- sft_ocr_rec_scene +- sft_ocr_rec_screen +- sft_place +- sft_position +- sft_sport +- sft_status diff --git a/lmms_eval/tasks/sft_eval/sft_activity.yaml b/lmms_eval/tasks/sft_eval/sft_activity.yaml new file mode 100644 index 000000000..d8bc91b52 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_activity.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_activity_cn_eval +test_split: sft_activity +dataset_name: sft_activity +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_arts.yaml b/lmms_eval/tasks/sft_eval/sft_arts.yaml new file mode 100644 index 000000000..592b28923 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_arts.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_arts_cn_eval +test_split: sft_arts +dataset_name: sft_arts +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_body.yaml b/lmms_eval/tasks/sft_eval/sft_body.yaml new file mode 100644 index 000000000..6e0edb3fc --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_body.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_body_cn_eval +test_split: sft_body +dataset_name: sft_body +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_car.yaml b/lmms_eval/tasks/sft_eval/sft_car.yaml new file mode 100644 index 000000000..e82169343 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_car.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_car_cn_eval +test_split: sft_car +dataset_name: sft_car +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_color.yaml b/lmms_eval/tasks/sft_eval/sft_color.yaml new file mode 100644 index 000000000..85f912afb --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_color.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_color_cn_eval +test_split: sft_color +dataset_name: sft_color +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_commodity.yaml b/lmms_eval/tasks/sft_eval/sft_commodity.yaml new file mode 100644 index 000000000..3c37c5e00 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_commodity.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_commodity_cn_eval +test_split: sft_commodity +dataset_name: sft_commodity +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_count.yaml b/lmms_eval/tasks/sft_eval/sft_count.yaml new file mode 100644 index 000000000..b4184448b --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_count.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_count_cn_eval +test_split: sft_count +dataset_name: sft_count +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_daily.yaml b/lmms_eval/tasks/sft_eval/sft_daily.yaml new file mode 100644 index 000000000..540f657e6 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_daily.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_daily_cn_eval +test_split: sft_daily +dataset_name: sft_daily +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_engineer.yaml b/lmms_eval/tasks/sft_eval/sft_engineer.yaml new file mode 100644 index 000000000..bd2532b77 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_engineer.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_engineer_cn_eval +test_split: sft_engineer +dataset_name: sft_engineer +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_entertainment.yaml b/lmms_eval/tasks/sft_eval/sft_entertainment.yaml new file mode 100644 index 000000000..04f841278 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_entertainment.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_entertainment_cn_eval +test_split: sft_entertainment +dataset_name: sft_entertainment +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_exist.yaml b/lmms_eval/tasks/sft_eval/sft_exist.yaml new file mode 100644 index 000000000..b3ec83f74 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_exist.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_exist_cn_eval +test_split: sft_exist +dataset_name: sft_exist +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_face.yaml b/lmms_eval/tasks/sft_eval/sft_face.yaml new file mode 100644 index 000000000..5dd6962f2 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_face.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_celeb_cn_eval +test_split: sft_face +dataset_name: sft_face +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_food.yaml b/lmms_eval/tasks/sft_eval/sft_food.yaml new file mode 100644 index 000000000..a6a3dad41 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_food.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_food_cn_eval +test_split: sft_food +dataset_name: sft_food +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_healthcare.yaml b/lmms_eval/tasks/sft_eval/sft_healthcare.yaml new file mode 100644 index 000000000..c63d093a2 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_healthcare.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_healthcare_cn_eval +test_split: sft_healthcare +dataset_name: sft_healthcare +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_landmark.yaml b/lmms_eval/tasks/sft_eval/sft_landmark.yaml new file mode 100644 index 000000000..4c4c12096 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_landmark.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_landmark_cn_eval +test_split: sft_landmark +dataset_name: sft_landmark +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_logo.yaml b/lmms_eval/tasks/sft_eval/sft_logo.yaml new file mode 100644 index 000000000..35116a2d6 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_logo.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft-logo +test_split: sft_logo +dataset_name: sft_logo +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_natural.yaml b/lmms_eval/tasks/sft_eval/sft_natural.yaml new file mode 100644 index 000000000..78668e9f8 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_natural.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_natural_cn_eval +test_split: sft_natural +dataset_name: sft_natural +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_qa_adv.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_qa_adv.yaml new file mode 100644 index 000000000..0e7243ff5 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_ocr_qa_adv.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_ocr_ecommerceQA_cn_eval +test_split: sft_ocr_qa_adv +dataset_name: sft_ocr_qa_adv +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_qa_chart.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_qa_chart.yaml new file mode 100644 index 000000000..031eaa72c --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_ocr_qa_chart.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_ocr_chartQA_cn_eval +test_split: sft_ocr_qa_chart +dataset_name: sft_ocr_qa_chart +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_qa_form.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_qa_form.yaml new file mode 100644 index 000000000..18e059e8d --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_ocr_qa_form.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_ocr_formQA_cn_eval +test_split: sft_ocr_qa_form +dataset_name: sft_ocr_qa_form +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_qa_scene.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_qa_scene.yaml new file mode 100644 index 000000000..0af342d91 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_ocr_qa_scene.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_ocr_sceneQA_cn_eval +test_split: sft_ocr_qa_scene +dataset_name: sft_ocr_qa_scene +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_qa_screen.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_qa_screen.yaml new file mode 100644 index 000000000..586194a9b --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_ocr_qa_screen.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_ocr_screenQA_cn_eval +test_split: sft_ocr_qa_screen +dataset_name: sft_ocr_qa_screen +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_rec_adv.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_rec_adv.yaml new file mode 100644 index 000000000..69e116f8d --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_ocr_rec_adv.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_ocr_adv_cn_eval +test_split: sft_ocr_rec_adv +dataset_name: sft_ocr_rec_adv +include: _default_sft_eval_ocr_rec_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_rec_doc.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_rec_doc.yaml new file mode 100644 index 000000000..0d498c460 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_ocr_rec_doc.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_ocr_doc_cn_eval +test_split: sft_ocr_rec_doc +dataset_name: sft_ocr_rec_doc +include: _default_sft_eval_ocr_rec_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_rec_handwrite.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_rec_handwrite.yaml new file mode 100644 index 000000000..5eb392565 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_ocr_rec_handwrite.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_ocr_handwrite_cn_eval +test_split: sft_ocr_rec_handwrite +dataset_name: sft_ocr_rec_handwrite +include: _default_sft_eval_ocr_rec_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_rec_markdown.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_rec_markdown.yaml new file mode 100644 index 000000000..7fb340903 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_ocr_rec_markdown.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_ocr_markdown_cn_eval +test_split: sft_ocr_rec_markdown +dataset_name: sft_ocr_rec_markdown +include: _default_sft_eval_ocr_rec_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_rec_scene.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_rec_scene.yaml new file mode 100644 index 000000000..8ef843826 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_ocr_rec_scene.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_ocr_scene_cn_eval +test_split: sft_ocr_rec_scene +dataset_name: sft_ocr_rec_scene +include: _default_sft_eval_ocr_rec_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_rec_screen.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_rec_screen.yaml new file mode 100644 index 000000000..eba50bdb8 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_ocr_rec_screen.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_ocr_screen_cn_eval +test_split: sft_ocr_rec_screen +dataset_name: sft_ocr_rec_screen +include: _default_sft_eval_ocr_rec_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_place.yaml b/lmms_eval/tasks/sft_eval/sft_place.yaml new file mode 100644 index 000000000..1bc615b49 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_place.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_place_cn_eval +test_split: sft_place +dataset_name: sft_place +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_position.yaml b/lmms_eval/tasks/sft_eval/sft_position.yaml new file mode 100644 index 000000000..ef4898184 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_position.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_position_cn_eval +test_split: sft_position +dataset_name: sft_position +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_sport.yaml b/lmms_eval/tasks/sft_eval/sft_sport.yaml new file mode 100644 index 000000000..94a6140b8 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_sport.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_sport_cn_eval +test_split: sft_sport +dataset_name: sft_sport +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_status.yaml b/lmms_eval/tasks/sft_eval/sft_status.yaml new file mode 100644 index 000000000..9f28ba51b --- /dev/null +++ b/lmms_eval/tasks/sft_eval/sft_status.yaml @@ -0,0 +1,5 @@ +group: sft_eval +task: sft_status_cn_eval +test_split: sft_status +dataset_name: sft_status +include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/utils.py b/lmms_eval/tasks/sft_eval/utils.py new file mode 100644 index 000000000..8ed2ef0c5 --- /dev/null +++ b/lmms_eval/tasks/sft_eval/utils.py @@ -0,0 +1,109 @@ +from rapidfuzz.distance import Levenshtein + + +def _normalize_text(text): + import string + + text = "".join(filter(lambda x: x in (string.digits + string.ascii_letters), text)) + + +def process_result_ocr_rec(doc, result): + return {"edit_distance": {"gts": [gt.replace("\n", "") for gt in doc["answer"]], "predictions": result}, "edit_acc": {"gts": [gt.replace("\n", "") for gt in doc["answer"]], "predictions": result}} + + +def process_result_rest(doc, result): + return {"fuzzy_match": {"gts": [gt.replace("\n", "") for gt in doc["answer"]], "predictions": result, "question_id": doc["question_id"]}} + + +def run_editdistance(gts, predictions, ignore_space=True, is_filter=False): + eps = 1e-6 + correct_num = 0 + all_num = 0 + norm_edit_dis = 0.0 + edit_norm_score_list = list() + for idx in range(len(predictions)): + target, pred = gts[idx][0], predictions[idx] + if ignore_space: + pred = pred.replace(" ", "") + target = target.replace(" ", "") + if is_filter: + pred = _normalize_text(pred) + target = _normalize_text(target) + + ned = Levenshtein.normalized_distance(pred, target) + norm_edit_dis += ned + edit_norm_score_list.append(1 - ned) + if pred == target: + correct_num += 1 + all_num += 1 + # import pdb; pdb.set_trace() + metric = {"acc": correct_num / (all_num + eps), "norm_edit_dis": 1 - norm_edit_dis / (all_num + eps)} + return metric, edit_norm_score_list + + +def fuzzy_match_multi_answers(results, gt_dict): + acc = [] + for result in results: + question_id = result["question_id"] + try: + gt_ans = gt_dict[question_id] + except: + import pdb + + pdb.set_trace() + pred = result["text"] + for gt in gt_ans: + vqa_acc = 1 + if not ( + (gt == "是" and gt in pred and "不是" not in pred) + or (gt == "对" and gt in pred and "不对" not in pred) + or (gt == "相同" and gt in pred and "不相同" not in pred) + or (gt == "有" and gt in pred and "没有" not in pred) + or (gt == "在" and gt in pred and "不在" not in pred) + or (gt == "一样" and gt in pred and "不一样" not in pred) + or (gt not in ["是", "在", "对", "有", "一样", "相同"] and gt.lower() in pred.lower()) + ): + vqa_acc = 0 + if vqa_acc == 1: + break + acc.append(vqa_acc) + accuracy = sum(acc) / len(acc) * 100 + return {"Acc": accuracy} + + +def sft_eval_doc_to_visual(doc): + return [doc["image"].convert("RGB")] + + +def sft_eval_doc_to_text(doc): + return doc["question"] + + +def sft_eval_doc_to_text(doc, model_specific_prompt_kwargs=None): + if model_specific_prompt_kwargs is None: + model_specific_prompt_kwargs = {} + pre_prompt = model_specific_prompt_kwargs.get("pre_prompt", "") + post_prompt = model_specific_prompt_kwargs.get("post_prompt", "") + question = f"{pre_prompt}{doc['question']}{post_prompt}" + return question + + +def sft_eval_edit_dist_acc_agg(results): + predictions = [result["predictions"][0] for result in results] + gts = [result["gts"] for result in results] + acc, _ = run_editdistance(gts, predictions) + return acc["acc"] + + +def sft_eval_edit_dist_agg(results): + predictions = [result["predictions"][0] for result in results] + gts = [result["gts"] for result in results] + acc, _ = run_editdistance(gts, predictions) + return acc["norm_edit_dis"] + + +def sft_eval_acc_agg(results): + gts_dict = {result["question_id"]: result["gts"] for result in results} + predictions = [{"question_id": result["question_id"], "text": result["predictions"][0]} for result in results] + acc = fuzzy_match_multi_answers(predictions, gts_dict) + return acc["Acc"] diff --git a/lmms_eval/tasks/stvqa/stvqa.yaml b/lmms_eval/tasks/stvqa/stvqa.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/stvqa/utils.py b/lmms_eval/tasks/stvqa/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/textcaps/_default_template_textcaps_yaml b/lmms_eval/tasks/textcaps/_default_template_textcaps_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/textcaps/textcaps.yaml b/lmms_eval/tasks/textcaps/textcaps.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/textcaps/textcaps_test.yaml b/lmms_eval/tasks/textcaps/textcaps_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/textcaps/textcaps_train.yaml b/lmms_eval/tasks/textcaps/textcaps_train.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/textcaps/textcaps_val.yaml b/lmms_eval/tasks/textcaps/textcaps_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/textcaps/utils.py b/lmms_eval/tasks/textcaps/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/textvqa/_default_template_textvqa_yaml b/lmms_eval/tasks/textvqa/_default_template_textvqa_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/textvqa/_textvqa.yaml b/lmms_eval/tasks/textvqa/_textvqa.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/textvqa/textvqa_test.yaml b/lmms_eval/tasks/textvqa/textvqa_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/textvqa/textvqa_val.yaml b/lmms_eval/tasks/textvqa/textvqa_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/textvqa/utils.py b/lmms_eval/tasks/textvqa/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/vizwiz_vqa/_default_template_vqa_yaml b/lmms_eval/tasks/vizwiz_vqa/_default_template_vqa_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/vizwiz_vqa/_generate_config.py b/lmms_eval/tasks/vizwiz_vqa/_generate_config.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/vizwiz_vqa/_vizwiz_vqa.yaml b/lmms_eval/tasks/vizwiz_vqa/_vizwiz_vqa.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/vizwiz_vqa/utils.py b/lmms_eval/tasks/vizwiz_vqa/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/vizwiz_vqa/vizwiz_vqa_test.yaml b/lmms_eval/tasks/vizwiz_vqa/vizwiz_vqa_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/vizwiz_vqa/vizwiz_vqa_val.yaml b/lmms_eval/tasks/vizwiz_vqa/vizwiz_vqa_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/vqav2/_default_template_vqav2_yaml b/lmms_eval/tasks/vqav2/_default_template_vqav2_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/vqav2/_vqav2.yaml b/lmms_eval/tasks/vqav2/_vqav2.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/vqav2/utils.py b/lmms_eval/tasks/vqav2/utils.py old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/vqav2/vqav2_test.yaml b/lmms_eval/tasks/vqav2/vqav2_test.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/vqav2/vqav2_val.yaml b/lmms_eval/tasks/vqav2/vqav2_val.yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/worldqa/_default_template_yaml b/lmms_eval/tasks/worldqa/_default_template_yaml new file mode 100644 index 000000000..7ce14a25e --- /dev/null +++ b/lmms_eval/tasks/worldqa/_default_template_yaml @@ -0,0 +1,10 @@ +dataset_path: lmms-lab/worldqa +dataset_kwargs: + token: True + video: True + builder_script: multi-hop-reasoning.py + cache_dir: multi-hop-reasoning +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" \ No newline at end of file diff --git a/lmms_eval/tasks/worldqa/utils.py b/lmms_eval/tasks/worldqa/utils.py new file mode 100755 index 000000000..642dea1e4 --- /dev/null +++ b/lmms_eval/tasks/worldqa/utils.py @@ -0,0 +1,113 @@ +from decord import VideoReader, cpu +import numpy as np +import os +import sys +import datetime +import lmms_eval.tasks._task_utils.file_utils as file_utils +import json +import logging +import yaml +from pathlib import Path + +with open(Path(__file__).parent / "_default_template_yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + # remove function definition since yaml load cannot handle it + if "!function" not in line: + safe_data.append(line) + + config = yaml.safe_load("".join(safe_data)) + +# A bit ugly here +# But the idea is that we will unzip all the zip files +# To HF HOME cache dir +# And load it here +HF_HOME = os.environ["HF_HOME"] +cache_dir = config["dataset_kwargs"]["cache_dir"] +cache_dir = os.path.join(HF_HOME, cache_dir) +cache_dir = os.path.join(cache_dir, "videos") + + +eval_logger = logging.getLogger("lmms-eval") + + +# Pass in video path here +# Can only work correctly with video llm +def worldqa_doc_to_visual(doc): + video_path = doc["video_idx"] + ".mp4" + video_path = os.path.join(cache_dir, video_path) + if os.path.exists(video_path): + video_path = video_path + elif os.path.exists(video_path.replace("mp4", "MP4")): + video_path = video_path.replace("mp4", "MP4") + else: + sys.exit(f"video path:{video_path} does not exist, please check") + return [video_path] + + +# This is the place where you format your question +def worldqa_doc_to_text(doc, model_specific_prompt_kwargs=None): + if model_specific_prompt_kwargs is None: + model_specific_prompt_kwargs = {} + pre_prompt = "" + post_prompt = "" + if "pre_prompt" in model_specific_prompt_kwargs: + pre_prompt = model_specific_prompt_kwargs["pre_prompt"] + if "post_prompt" in model_specific_prompt_kwargs: + post_prompt = model_specific_prompt_kwargs["post_prompt"] + + question = doc["question"] + if "option" in doc: + for op in doc["option"]: + question += "\n" + op + post_prompt = "\nAnswer with the option's letter from the given choices directly." + + return f"{pre_prompt}{question}{post_prompt}" + + +def worldqa_doc_to_answer(doc): + return doc["answer"] + + +# If it is mc, keep the option for exact match +def worldqa_doc_to_answer_mc(doc): + return doc["answer"].split(".")[0].strip() + + +# If it is mc ppl, keep the option str for perplexity base matching +def worldqa_doc_to_answer_mc_ppl(doc): + return doc["answer"].split(".")[1].strip() + + +# An example of showing how to custom metric +# Your metric name should have the same key name in your return dict +def worldqa_process_results(doc, result): + pred = result[0] + return {"submission": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"]}} + + +def worldqa_aggregate_submissions(results, args, task): + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + submission_file_name = f"worldqa-{task}-{now_date_time}.json" + path = file_utils.generate_submission_file(submission_file_name, args) + with open(path, "w") as f: + json.dump(results, f) + eval_logger.info(f"Submission file saved to {path}") + + +# Factory into different aggregate +def worldqa_aggregate_gen(results, args): + worldqa_aggregate_submissions(results, args, "Generation") + + +def worldqa_aggregate_mc(results, args): + worldqa_aggregate_submissions(results, args, "MC") + + +def worldqa_aggregate_mc_ppl(results, args): + worldqa_aggregate_submissions(results, args, "MC_PPL") + + +def worldqa_doc_to_choice(doc): + return [op.split(".")[1].strip() for op in doc["option"]] diff --git a/lmms_eval/tasks/worldqa/worldqa_generation.yaml b/lmms_eval/tasks/worldqa/worldqa_generation.yaml new file mode 100755 index 000000000..68be5412e --- /dev/null +++ b/lmms_eval/tasks/worldqa/worldqa_generation.yaml @@ -0,0 +1,13 @@ +dataset_name: "Generation" +task: "worldqa_gen" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.worldqa_doc_to_visual +doc_to_text: !function utils.worldqa_doc_to_text +doc_to_target: !function utils.worldqa_doc_to_answer +process_results: !function utils.worldqa_process_results +metric_list: + - metric: submission + aggregation: !function utils.worldqa_aggregate_gen + higher_is_better: true +include: _default_template_yaml diff --git a/lmms_eval/tasks/worldqa/worldqa_mc.yaml b/lmms_eval/tasks/worldqa/worldqa_mc.yaml new file mode 100755 index 000000000..e9681ad13 --- /dev/null +++ b/lmms_eval/tasks/worldqa/worldqa_mc.yaml @@ -0,0 +1,11 @@ +dataset_name: "MC" +task: "worldqa_mc" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.worldqa_doc_to_visual +doc_to_text: !function utils.worldqa_doc_to_text +doc_to_target: !function utils.worldqa_doc_to_answer_mc +metric_list: + - metric: exact_match + higher_is_better: true +include: _default_template_yaml diff --git a/lmms_eval/tasks/worldqa/worldqa_mcppl.yaml b/lmms_eval/tasks/worldqa/worldqa_mcppl.yaml new file mode 100755 index 000000000..bf0f31f2f --- /dev/null +++ b/lmms_eval/tasks/worldqa/worldqa_mcppl.yaml @@ -0,0 +1,11 @@ +dataset_name: "MC_PPL" +task: "worldqa_mc_ppl" +test_split: test +output_type: multiple_choice +doc_to_visual: !function utils.worldqa_doc_to_visual +doc_to_text: "question" +doc_to_target: !function utils.worldqa_doc_to_answer_mc_ppl +doc_to_choice: !function utils.worldqa_doc_to_choice +metric_list: + - metric: acc +include: _default_template_yaml diff --git a/lmms_eval/utils.py b/lmms_eval/utils.py old mode 100644 new mode 100755 diff --git a/miscs/llava_result_check.md b/miscs/llava_result_check.md old mode 100644 new mode 100755 diff --git a/miscs/repr_scripts.sh b/miscs/repr_scripts.sh old mode 100644 new mode 100755 diff --git a/miscs/repr_torch_envs.txt b/miscs/repr_torch_envs.txt old mode 100644 new mode 100755 diff --git a/miscs/scienceqa_id.txt b/miscs/scienceqa_id.txt old mode 100644 new mode 100755 diff --git a/miscs/script.sh b/miscs/script.sh old mode 100644 new mode 100755 index b5d6cc6c1..f0e637161 --- a/miscs/script.sh +++ b/miscs/script.sh @@ -18,4 +18,4 @@ gpu = 4 bs 1 use_flash_attention_2=True: -accelerate launch --num_processes=8 -m lmms_eval --model llava --model_args pretrained="liuhaotian/llava-v1.5-13b" --tasks scienceqa --batch_size 1 --log_samples --log_samples_sufix debug --output_path ./logs/ +accelerate launch --num_processes=8 --main_process_port 12345 -m lmms_eval --model qwen_vl --model_args pretrained="Qwen/Qwen-VL" --tasks mme --batch_size 1 --log_samples --log_samples_suffix debug --output_path ./logs/ diff --git a/miscs/test_llava.py b/miscs/test_llava.py old mode 100644 new mode 100755 diff --git a/miscs/test_scienceqa.py b/miscs/test_scienceqa.py old mode 100644 new mode 100755 diff --git a/pyproject.toml b/pyproject.toml old mode 100644 new mode 100755 index c50c4e76d..29dac10f1 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,7 @@ classifiers = [ requires-python = ">=3.8" license = { text = "MIT" } dependencies = [ - "accelerate>=0.21.0", + "accelerate>=0.29.1", "black==24.1.0", "datasets==2.16.1", "evaluate>=0.4.0", @@ -34,11 +34,11 @@ dependencies = [ "sacrebleu>=1.5.0", "scikit-learn>=0.24.1", "sqlitedict", - "torch>=1.8", + "torch>=2.1.0", # to enable sdpa mode for running 34B model on one 80GB GPU "openai>=1.0.0", "pycocoevalcap", "tqdm-multiprocess", - "transformers", + "transformers>=4.37.2", "zstandard", "pillow", "pyyaml", @@ -64,7 +64,6 @@ lmms_eval = ["**/*.yaml", "tasks/**/*"] [project.scripts] lmms-eval = "lmms_eval.__main__:cli_evaluate" -lmms_eval = "lmms_eval.__main__:cli_evaluate" [project.urls] Homepage = "https://lmms-lab.github.io/lmms-eval-blog/" diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 diff --git a/tools/make_hf_dataset.ipynb b/tools/make_hf_dataset.ipynb old mode 100644 new mode 100755 From 67ea2bdb26af8c1150002eaa75397ece4c5a82da Mon Sep 17 00:00:00 2001 From: Kaichen Zhang - NTU Date: Thu, 18 Apr 2024 10:30:59 +0800 Subject: [PATCH 002/181] [Feat] Add Video-Llava, Llama-vid, X-composer-HD, llava-wilder (Cherry-picked) (#78) --- .gitignore | 2 + lmms_eval/api/task.py | 2 +- lmms_eval/evaluator.py | 2 +- lmms_eval/models/__init__.py | 14 +- lmms_eval/models/llama_vid.py | 275 ++++++++++++++++ lmms_eval/models/video_llava.py | 217 +++++++++++++ lmms_eval/models/xcomposer2_4KHD.py | 296 ++++++++++++++++++ lmms_eval/tasks/ai2d/ai2d.yaml | 4 + lmms_eval/tasks/ai2d/utils.py | 4 + .../_default_template_wilder_yaml | 22 ++ .../tasks/llava_wilder/llava_wilder_full.yaml | 11 + .../llava_wilder/llava_wilder_medium.yaml | 11 + .../llava_wilder/llava_wilder_small.yaml | 11 + lmms_eval/tasks/llava_wilder/utils.py | 226 +++++++++++++ lmms_eval/tasks/mme/mme.yaml | 3 + lmms_eval/tasks/mme/utils.py | 7 + .../tasks/worldqa/_default_template_yaml | 1 - lmms_eval/tasks/worldqa/utils.py | 3 +- 18 files changed, 1105 insertions(+), 6 deletions(-) create mode 100644 lmms_eval/models/llama_vid.py create mode 100644 lmms_eval/models/video_llava.py create mode 100644 lmms_eval/models/xcomposer2_4KHD.py create mode 100644 lmms_eval/tasks/llava_wilder/_default_template_wilder_yaml create mode 100755 lmms_eval/tasks/llava_wilder/llava_wilder_full.yaml create mode 100644 lmms_eval/tasks/llava_wilder/llava_wilder_medium.yaml create mode 100644 lmms_eval/tasks/llava_wilder/llava_wilder_small.yaml create mode 100644 lmms_eval/tasks/llava_wilder/utils.py diff --git a/.gitignore b/.gitignore index 9d8615d60..9441eafc0 100755 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,5 @@ submissions/ lmms_eval/tasks/hallusion_bench/hallusion_output_vs_model.json lmms_eval/tasks/hallusion_bench/hallusion_output_vd_model.json zk.log +cache_dir +ckpt diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index 0d5c08153..4465bb21a 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -684,7 +684,7 @@ def download(self, dataset_kwargs=None) -> None: # If the dataset is a video dataset, # Recursively search whether their is a zip and unzip it to the huggingface home if dataset_kwargs is not None and "video" in dataset_kwargs and dataset_kwargs["video"]: - hf_home = os.environ["HF_HOME"] + hf_home = os.getenv("HF_HOME", "~/.cache/huggingface/") cache_dir = dataset_kwargs["cache_dir"] cache_dir = os.path.join(hf_home, cache_dir) diff --git a/lmms_eval/evaluator.py b/lmms_eval/evaluator.py index a97edff03..bad5b139e 100755 --- a/lmms_eval/evaluator.py +++ b/lmms_eval/evaluator.py @@ -318,7 +318,7 @@ def evaluate( # hack: remove image columns to speed avoid loading images and speed up postprocessing # reason: doc_iterator will actually load image if it's in the doc. docs = task.test_docs() if task.has_test_docs() else task.validation_docs() - if "d170" not in task_name and "dc100" not in task_name and "dc200" not in task_name: + if "d170" not in task_name and "dc100" not in task_name and "dc200" not in task_name and "llava_wilder" not in task_name: remove_cols = [] features = docs.features # If it is an Image instance or a Sequence of Image instance. Remove it diff --git a/lmms_eval/models/__init__.py b/lmms_eval/models/__init__.py index 88c0d37ed..ffde7ae92 100755 --- a/lmms_eval/models/__init__.py +++ b/lmms_eval/models/__init__.py @@ -1,6 +1,18 @@ import os -AVAILABLE_MODELS = {"llava": "Llava", "llava_hf": "LlavaHf", "qwen_vl": "Qwen_VL", "fuyu": "Fuyu", "gpt4v": "GPT4V", "instructblip": "InstructBLIP", "minicpm_v": "MiniCPM_V", "llava_vid": "LlavaVid"} +AVAILABLE_MODELS = { + "llava": "Llava", + "qwen_vl": "Qwen_VL", + "fuyu": "Fuyu", + "gpt4v": "GPT4V", + "instructblip": "InstructBLIP", + "minicpm_v": "MiniCPM_V", + "llava_vid" : "LlavaVid", + "videoChatGPT" : "VideoChatGPT", + "llama_vid" : "LLaMAVid", + "video_llava": "VideoLLaVA", + "xcomposer2_4KHD": "XComposer2_4KHD", +} for model_name, model_class in AVAILABLE_MODELS.items(): try: diff --git a/lmms_eval/models/llama_vid.py b/lmms_eval/models/llama_vid.py new file mode 100644 index 000000000..1a92530b7 --- /dev/null +++ b/lmms_eval/models/llama_vid.py @@ -0,0 +1,275 @@ +import logging +import os +from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs +from accelerate.state import AcceleratorState +from typing import List, Optional, Union, Tuple +import torch +from tqdm import tqdm +from decord import VideoReader, cpu +import numpy as np +import math +from datetime import timedelta +from transformers import AutoConfig +from huggingface_hub import snapshot_download +import requests + +from lmms_eval import utils +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model +from lmms_eval.utils import stop_sequences_criteria + +import subprocess + +eval_logger = logging.getLogger("lmms-eval") + +try: + from llamavid.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN + from llamavid.conversation import conv_templates, SeparatorStyle + from llamavid.model.builder import load_pretrained_model + from llava.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria +except ImportError: + eval_logger.error("LLaMA-Video is not installed. Please install LLaMA-Video to use this model.") + + +@register_model("llama_vid") +class LLaMAVid(lmms): + def __init__( + self, + pretrained: str = "YanweiLi/llama-vid-7b-full-224-video-fps-1", + truncation: Optional[bool] = True, + device: Optional[str] = "cuda:0", + dtype: Optional[Union[str, torch.dtype]] = "auto", + batch_size: Optional[Union[int, str]] = 1, + trust_remote_code: Optional[bool] = False, + revision=None, + attn_implementation=( + "sdpa" if torch.__version__ > "2.1.2" else "eager" + ), # inference implementation for attention, can be "sdpa", "eager", "flash_attention_2". Seems FA2 is not effective during inference: https://discuss.huggingface.co/t/flash-attention-has-no-effect-on-inference/73453/5 + device_map="cuda:0", + conv_template="vicuna_v1", + use_cache=True, + truncate_context=False, + **kwargs, + ) -> None: + super().__init__() + + accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) + accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) + if accelerator.num_processes > 1: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + elif accelerator.num_processes == 1 and device_map == "auto": + self._device = torch.device(device) + self.device_map = device_map + else: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + + self.pretrained = pretrained + self.model_path = snapshot_download(self.pretrained) + self.model_name = get_model_name_from_path(pretrained) + if not os.path.exists("./model_zoo/LAVIS/eva_vit_g.pth") and accelerator.is_main_process: + eval_logger.info("\n\n Eva Encoder is not found for LLaMA-VID. Download automatically to the folder ./model_zoo/LAVIS") + cache_path = "model_zoo/LAVIS" + os.makedirs(cache_path, exist_ok=True) + subprocess.run(["wget https://storage.googleapis.com/sfr-vision-language-research/LAVIS/models/BLIP2/eva_vit_g.pth -O ./model_zoo/LAVIS/eva_vit_g.pth"], shell=True) + + + accelerator.wait_for_everyone() + self._tokenizer, self._model, self.image_processor, self._max_length = load_pretrained_model(self.model_path, None, self.model_name, device_map=self.device_map,) + + self._config = self._model.config + self.model.eval() + self.model.tie_weights() + self.truncation = truncation + self.batch_size_per_gpu = int(batch_size) + self.conv_template = conv_template + self.use_cache = use_cache + self.truncate_context = truncate_context + # assert self.batch_size_per_gpu == 1, "Llava currently does not support batched generation. See https://github.com/haotian-liu/LLaVA/issues/754. HF Llava also has this issue." + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + # If you want to use DistributedType.DEEPSPEED, you have to run accelerate config before using the model + # Also, you have to select zero stage 0 (equivalent to DDP) in order to make the prepare model works + # I tried to set different parameters in the kwargs to let default zero 2 stage works, but it didn't work. + if accelerator.distributed_type == DistributedType.DEEPSPEED: + kwargs = { + "train_micro_batch_size_per_gpu": self.batch_size_per_gpu, + "train_batch_size": self.batch_size_per_gpu * accelerator.num_processes, + } + AcceleratorState().deepspeed_plugin.deepspeed_config_process(must_match=True, **kwargs) + eval_logger.info("Detected that you are using DistributedType.DEEPSPEED. Make sure you run `accelerate config` and set zero stage to 0") + if accelerator.distributed_type == DistributedType.FSDP or accelerator.distributed_type == DistributedType.DEEPSPEED: + self._model = accelerator.prepare(self.model) + else: + self._model = accelerator.prepare_model(self.model, evaluation_mode=True) + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + elif accelerator.num_processes == 1 and device_map == "auto": + eval_logger.info(f"Using {accelerator.num_processes} devices with tensor parallelism") + self._rank = 0 + self._word_size = 1 + else: + eval_logger.info(f"Using single device: {self._device}") + self.model.to(self._device) + self._rank = 0 + self._world_size = 1 + + def download_file(self, url, folder_path): + # Create the folder if it doesn't exist + if not os.path.exists(folder_path): + os.makedirs(folder_path) + + # Extract filename from URL + filename = url.split('/')[-1] + + # Define path to save the file + file_path = os.path.join(folder_path, filename) + + # Send a GET request to the URL + response = requests.get(url) + + # Check if request was successful (status code 200) + if response.status_code == 200: + # Save the file to the specified folder + with open(file_path, 'wb') as f: + f.write(response.content) + print(f"File downloaded successfully to {file_path}") + else: + print(f"Failed to download file. Status code: {response.status_code}") + + def load_video(self, video_path): + vr = VideoReader(video_path, ctx=cpu(0)) + total_frame_num = len(vr) + fps = round(vr.get_avg_fps()) + frame_idx = [i for i in range(0, len(vr), fps)] + spare_frames = vr.get_batch(frame_idx).asnumpy() + return spare_frames + + @property + def config(self): + # return the associated transformers.AutoConfig for the given pretrained model. + return self._config + + @property + def tokenizer(self): + return self._tokenizer + + @property + def model(self): + # returns the model, unwrapping it if using Accelerate + if hasattr(self, "accelerator"): + return self.accelerator.unwrap_model(self._model) + else: + return self._model + + @property + def eot_token_id(self): + # we use EOT because end of *text* is more accurate for what we're doing than end of *sentence* + return self.tokenizer.eos_token_id + + @property + def max_length(self): + return self._max_length + + def tok_encode(self, string: str, left_truncate_len=None, add_special_tokens=None) -> List[int]: + """ """ + add_special_tokens = False if add_special_tokens is None else add_special_tokens + encoding = self.tokenizer.encode(string, add_special_tokens=add_special_tokens) + # left-truncate the encoded context to be at most `left_truncate_len` tokens long + if left_truncate_len: + encoding = encoding[-left_truncate_len:] + return encoding + + def tok_decode(self, tokens): + return self.tokenizer.decode(tokens) + + def flatten(self, input): + new_list = [] + for i in input: + for j in i: + new_list.append(j) + return new_list + + def generate_until(self, requests) -> List[str]: + res = [] + pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") + + for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + # encode, pad, and truncate contexts for this batch + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + videos = [] + for visual in visuals: + video = self.load_video(visual) + video = self.image_processor.preprocess(video, return_tensors='pt')['pixel_values'].half().cuda() + video = [video] + videos += video + qs = contexts + if self.model.config.mm_use_im_start_end: + qs = DEFAULT_IM_START_TOKEN + DEFAULT_IMAGE_TOKEN + DEFAULT_IM_END_TOKEN + '\n' + qs + else: + qs = DEFAULT_IMAGE_TOKEN + '\n' + qs + + conv = conv_templates[self.conv_template].copy() + conv.append_message(conv.roles[0], qs) + conv.append_message(conv.roles[1], None) + prompt = conv.get_prompt() + + input_ids = tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt').unsqueeze(0).cuda() + + stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2 + keywords = [stop_str] + stopping_criteria = KeywordsStoppingCriteria(keywords, self.tokenizer, input_ids) + + cur_prompt = contexts + with torch.inference_mode(): + self.model.update_prompt([[cur_prompt]]) + output_ids = self.model.generate( + input_ids, + images=video, + do_sample=True, + temperature=0.2, + max_new_tokens=1024, + use_cache=True, + stopping_criteria=[stopping_criteria]) + + input_token_len = input_ids.shape[1] + n_diff_input_output = (input_ids != output_ids[:, :input_token_len]).sum().item() + if n_diff_input_output > 0: + print(f'[Warning] {n_diff_input_output} output_ids are not the same as the input_ids') + outputs = self.tokenizer.batch_decode(output_ids[:, input_token_len:], skip_special_tokens=True)[0] + outputs = outputs.strip() + if outputs.endswith(stop_str): + outputs = outputs[:-len(stop_str)] + outputs = outputs.strip() + pbar.update(1) + res.append(outputs) + + return res + + + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + return super().loglikelihood(requests) + + + @property + def batch_size(self): + return self.batch_size_per_gpu + + @property + def device(self): + return self._device + + @property + def rank(self): + return self._rank + + @property + def world_size(self): + return self._world_size + diff --git a/lmms_eval/models/video_llava.py b/lmms_eval/models/video_llava.py new file mode 100644 index 000000000..8b890219d --- /dev/null +++ b/lmms_eval/models/video_llava.py @@ -0,0 +1,217 @@ +import logging +from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs +from accelerate.state import AcceleratorState +from typing import List, Optional, Union, Tuple +import torch +from tqdm import tqdm +import numpy as np +import math +from datetime import timedelta +from transformers import AutoConfig + +from lmms_eval import utils +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model +from lmms_eval.utils import stop_sequences_criteria + +eval_logger = logging.getLogger("lmms-eval") + +try: + import torch + from videollava.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN + from videollava.conversation import conv_templates, SeparatorStyle + from videollava.model.builder import load_pretrained_model + from videollava.utils import disable_torch_init + from videollava.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria +except ImportError: + eval_logger.error("Video-LLaVA is not installed. Please install Video-LLaVA to use this model.") + +@register_model("video_llava") +class VideoLLaVA(lmms): + def __init__( + self, + pretrained: str = 'LanguageBind/Video-LLaVA-7B', + truncation: Optional[bool] = True, + device: Optional[str] = "cuda:0", + dtype: Optional[Union[str, torch.dtype]] = "auto", + batch_size: Optional[Union[int, str]] = 1, + trust_remote_code: Optional[bool] = False, + revision=None, + attn_implementation=( + "sdpa" if torch.__version__ > "2.1.2" else "eager" + ), # inference implementation for attention, can be "sdpa", "eager", "flash_attention_2". Seems FA2 is not effective during inference: https://discuss.huggingface.co/t/flash-attention-has-no-effect-on-inference/73453/5 + device_map="cuda:0", + conv_template="llava_v1", + use_cache=True, + truncate_context=False, # whether to truncate the context in generation, set it False for LLaVA-1.6 + **kwargs, + ) -> None: + super().__init__() + accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) + accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) + if accelerator.num_processes > 1: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + elif accelerator.num_processes == 1 and device_map == "auto": + self._device = torch.device(device) + self.device_map = device_map + else: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + + self.pretrained = pretrained + self.model_name = get_model_name_from_path(pretrained) + self._tokenizer, self._model, self.processor, self._max_length = load_pretrained_model(pretrained, None, self.model_name, device_map=self.device_map) + self.video_processor = self.processor['video'] + self._config = self._model.config + self.model.eval() + self.model.tie_weights() + self.truncation = truncation + self.batch_size_per_gpu = int(batch_size) + self.conv_template = conv_template + self.use_cache = use_cache + self.truncate_context = truncate_context + # assert self.batch_size_per_gpu == 1, "Llava currently does not support batched generation. See https://github.com/haotian-liu/LLaVA/issues/754. HF Llava also has this issue." + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + # If you want to use DistributedType.DEEPSPEED, you have to run accelerate config before using the model + # Also, you have to select zero stage 0 (equivalent to DDP) in order to make the prepare model works + # I tried to set different parameters in the kwargs to let default zero 2 stage works, but it didn't work. + if accelerator.distributed_type == DistributedType.DEEPSPEED: + kwargs = { + "train_micro_batch_size_per_gpu": self.batch_size_per_gpu, + "train_batch_size": self.batch_size_per_gpu * accelerator.num_processes, + } + AcceleratorState().deepspeed_plugin.deepspeed_config_process(must_match=True, **kwargs) + eval_logger.info("Detected that you are using DistributedType.DEEPSPEED. Make sure you run `accelerate config` and set zero stage to 0") + if accelerator.distributed_type == DistributedType.FSDP or accelerator.distributed_type == DistributedType.DEEPSPEED: + self._model = accelerator.prepare(self.model) + else: + self._model = accelerator.prepare_model(self.model, evaluation_mode=True) + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + elif accelerator.num_processes == 1 and device_map == "auto": + eval_logger.info(f"Using {accelerator.num_processes} devices with tensor parallelism") + self._rank = 0 + self._word_size = 1 + else: + eval_logger.info(f"Using single device: {self._device}") + self.model.to(self._device) + self._rank = 0 + self._world_size = 1 + + @property + def config(self): + # return the associated transformers.AutoConfig for the given pretrained model. + return self._config + + @property + def tokenizer(self): + return self._tokenizer + + @property + def model(self): + # returns the model, unwrapping it if using Accelerate + if hasattr(self, "accelerator"): + return self.accelerator.unwrap_model(self._model) + else: + return self._model + + @property + def eot_token_id(self): + # we use EOT because end of *text* is more accurate for what we're doing than end of *sentence* + return self.tokenizer.eos_token_id + + @property + def max_length(self): + return self._max_length + + def pad_sequence(self, input_ids, batch_first, padding_value): + if self.tokenizer.padding_side == "left": + input_ids = [torch.flip(_input_ids, [0]) for _input_ids in input_ids] + input_ids = torch.nn.utils.rnn.pad_sequence(input_ids, batch_first=batch_first, padding_value=padding_value) + if self.tokenizer.padding_side == "left": + input_ids = torch.flip(input_ids, [1]) + return input_ids + + @property + def batch_size(self): + return self.batch_size_per_gpu + + @property + def device(self): + return self._device + + @property + def rank(self): + return self._rank + + @property + def world_size(self): + return self._world_size + + def tok_encode(self, string: str, left_truncate_len=None, add_special_tokens=None) -> List[int]: + """ """ + add_special_tokens = False if add_special_tokens is None else add_special_tokens + encoding = self.tokenizer.encode(string, add_special_tokens=add_special_tokens) + # left-truncate the encoded context to be at most `left_truncate_len` tokens long + if left_truncate_len: + encoding = encoding[-left_truncate_len:] + return encoding + + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + return super().loglikelihood(requests) + + def flatten(self, input): + new_list = [] + for i in input: + for j in i: + new_list.append(j) + return new_list + + def generate_until(self, requests) -> List[str]: + res = [] + pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") + + for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + # encode, pad, and truncate contexts for this batch + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + assert len(visuals) == 1 + video_tensors = self.video_processor(visuals[0], return_tensors='pt')['pixel_values'] + + if type(video_tensors) is list: + tensor = [video.to(self.model.device, dtype=torch.float16) for video in video_tensors] + else: + tensor = video_tensors.to(self.model.device, dtype=torch.float16) + + conv = conv_templates[self.conv_template].copy() + roles = conv.roles + inp = ' '.join([DEFAULT_IMAGE_TOKEN] * self.model.get_video_tower().config.num_frames) + '\n' + contexts + conv.append_message(conv.roles[0], inp) + conv.append_message(conv.roles[1], None) + prompt = conv.get_prompt() + + input_ids = tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt').unsqueeze(0).cuda() + stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2 + keywords = [stop_str] + stopping_criteria = KeywordsStoppingCriteria(keywords, self.tokenizer, input_ids) + + with torch.inference_mode(): + output_ids = self.model.generate( + input_ids, + images=tensor, + do_sample=True, + temperature=0.1, + max_new_tokens=1024, + use_cache=True, + stopping_criteria=[stopping_criteria]) + + outputs = self.tokenizer.decode(output_ids[0, input_ids.shape[1]:]).strip() + res.append(outputs) + pbar.update(1) + return res diff --git a/lmms_eval/models/xcomposer2_4KHD.py b/lmms_eval/models/xcomposer2_4KHD.py new file mode 100644 index 000000000..022bfd9b7 --- /dev/null +++ b/lmms_eval/models/xcomposer2_4KHD.py @@ -0,0 +1,296 @@ +from multiprocessing import context +import torch +from transformers import AutoModel, AutoTokenizer +from PIL import Image +import numpy as np +import torchvision.transforms as transforms +from datetime import timedelta +import logging + +from lmms_eval import utils +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model +from lmms_eval.utils import stop_sequences_criteria + +from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs +from accelerate.state import AcceleratorState + +from typing import Optional, Sequence, List, Tuple, Union +import re +from tqdm import tqdm + +pattern = re.compile(r'[A-Z]') + +eval_logger = logging.getLogger("lmms-eval") + +meta_instruction = """You are an AI assistant whose name is InternLM-XComposer (浦语·灵笔). +- InternLM-XComposer (浦语·灵笔) is a multi-modality conversational language model that is developed\ + by Shanghai AI Laboratory (上海人工智能实验室). It is designed to be helpful, honest, and harmless. +- InternLM-XComposer (浦语·灵笔) can understand and communicate fluently in the language chosen by\ + the user such as English and 中文. +- InternLM-XComposer (浦语·灵笔) is capable of comprehending and articulating responses\ + effectively based on the provided image.""" + +@register_model("xcomposer2_4khd") +class XComposer2_4KHD(lmms): + def __init__( + self, + pretrained: str = "liuhaotian/llava-v1.5-7b", + device: Optional[str] = "cuda:0", + batch_size: Optional[Union[int, str]] = 1, + device_map="cuda:0", + need_bos : bool = True, + padding : bool = False, + half : bool = False, + **kwargs + ) -> None: + super().__init__() + + accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) + accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) + if accelerator.num_processes > 1: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + elif accelerator.num_processes == 1 and device_map == "auto": + self._device = torch.device(device) + self.device_map = device_map + else: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + + self.pretrained = pretrained + self.need_bos = need_bos + self.padding = padding + self._model = AutoModel.from_pretrained(self.pretrained, device_map=self.device_map, trust_remote_code=True) + self._tokenizer = AutoTokenizer.from_pretrained(self.pretrained, trust_remote_code=True) + self.model.tokenizer = self.tokenizer + self.batch_size_per_gpu = batch_size + + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + # If you want to use DistributedType.DEEPSPEED, you have to run accelerate config before using the model + # Also, you have to select zero stage 0 (equivalent to DDP) in order to make the prepare model works + # I tried to set different parameters in the kwargs to let default zero 2 stage works, but it didn't work. + if accelerator.distributed_type == DistributedType.DEEPSPEED: + kwargs = { + "train_micro_batch_size_per_gpu": self.batch_size_per_gpu, + "train_batch_size": self.batch_size_per_gpu * accelerator.num_processes, + } + AcceleratorState().deepspeed_plugin.deepspeed_config_process(must_match=True, **kwargs) + eval_logger.info("Detected that you are using DistributedType.DEEPSPEED. Make sure you run `accelerate config` and set zero stage to 0") + if accelerator.distributed_type == DistributedType.FSDP or accelerator.distributed_type == DistributedType.DEEPSPEED: + self._model = accelerator.prepare(self.model) + else: + self._model = accelerator.prepare_model(self.model, evaluation_mode=True) + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + elif accelerator.num_processes == 1 and device_map == "auto": + eval_logger.info(f"Using {accelerator.num_processes} devices with tensor parallelism") + self._rank = 0 + self._word_size = 1 + else: + eval_logger.info(f"Using single device: {self._device}") + self.model.to(self._device) + self._rank = 0 + self._world_size = 1 + + + @property + def config(self): + # return the associated transformers.AutoConfig for the given pretrained model. + return self._config + + @property + def tokenizer(self): + return self._tokenizer + + @property + def model(self): + # returns the model, unwrapping it if using Accelerate + if hasattr(self, "accelerator"): + return self.accelerator.unwrap_model(self._model) + else: + return self._model + + @property + def batch_size(self): + return self.batch_size_per_gpu + + @property + def device(self): + return self._device + + @property + def rank(self): + return self._rank + + @property + def world_size(self): + return self._world_size + + def flatten(self, input): + new_list = [] + for i in input: + for j in i: + new_list.append(j) + return new_list + + def generate_until(self, requests) -> List[str]: + res = [] + pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") + + for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + # encode, pad, and truncate contexts for this batch + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + + if 'hd_num' not in gen_kwargs: + if listinstr(['docvqa_test', 'infovqa_test'], task.lower()): + self.model.hd_num = 65 + elif listinstr(['docvqa_val', 'infovqa_val', 'OCRBench'], task.lower()): + self.model.hd_num = 55 + elif listinstr(['mmmu', 'mmbench', 'mmvet'], task.lower()): + self.model.hd_num = 16 + else: + self.model.hd_num = 25 + else: + self.model.hd_num = gen_kwargs.pop('hd_num') + + pt1 = 0 + embeds = [] + im_mask = [] + images_loc = [0] + need_bos = self.need_bos + padding = self.padding + for i, pts in enumerate(images_loc + [len(contexts)]): + subtext = contexts[pt1:pts] + if need_bos or len(subtext) > 0: + text_embeds = self.model.encode_text(subtext, add_special_tokens=need_bos).to(self.device) + embeds.append(text_embeds) + im_mask.append(torch.zeros(text_embeds.shape[:2]).to(self.device)) + need_bos = False + if i < len(visuals): + image = visuals[i] + + image = HD_transform(image, im_num=self.model.hd_num) + image = self.model.vis_processor(image).unsqueeze(0).to(self.device) + image_embeds = self.model.encode_img(image) + embeds.append(image_embeds) + im_mask.append(torch.ones(image_embeds.shape[:2]).to(self.device)) + pt1 = pts + embeds = torch.cat(embeds, dim=1) + im_mask = torch.cat(im_mask, dim=1) + im_mask = im_mask.bool() + + if "max_new_tokens" not in gen_kwargs: + gen_kwargs["max_new_tokens"] = 1024 + if "temperature" not in gen_kwargs: + gen_kwargs["temperature"] = 0 + if "top_p" not in gen_kwargs: + gen_kwargs["top_p"] = None + if "num_beams" not in gen_kwargs: + gen_kwargs["num_beams"] = 1 + if "do_sample" not in gen_kwargs: + gen_kwargs["do_sample"] = False + if "repetition_penalty" not in gen_kwargs: + gen_kwargs["repetition_penalty"] = 1.0 + + outputs = self.model.generate( + inputs_embeds=embeds, + im_mask=im_mask, + temperature=gen_kwargs["temperature"], + max_new_tokens=gen_kwargs["max_new_tokens"], + num_beams=gen_kwargs["num_beams"], + do_sample=gen_kwargs["do_sample"], + repetition_penalty=gen_kwargs["repetition_penalty"]) + output_token = outputs[0] + if output_token[0] == 0 or output_token[0] == 1: + output_token = output_token[1:] + output_text = self.model.tokenizer.decode(output_token, add_special_tokens=False) + output_text = output_text.split('[UNUSED_TOKEN_145]')[0].strip() + if DATASET_TYPE(task) == "multi-choice": + output_text = pattern.findall(output_text) + if len(output_text) == 0: + print('Error:', output_text) + output_text = 'Z' + res.append(output_text[0]) + pbar.update(1) + pbar.close() + return res + + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + return super().loglikelihood(requests) + + + + + + + + + + + + + +def padding_336(b): + width, height = b.size + tar = int(np.ceil(height / 336) * 336) + top_padding = int((tar - height) / 2) + bottom_padding = tar - height - top_padding + left_padding = 0 + right_padding = 0 + b = transforms.functional.pad(b, [left_padding, top_padding, right_padding, bottom_padding], fill=[255, 255, 255]) + + return b + + +def HD_transform(img, im_num=16): + width, height = img.size + trans = False + if width < height: + img = img.transpose(Image.TRANSPOSE) + trans = True + width, height = img.size + ratio = (width / height) + scale = 1 + while scale * np.ceil(scale / ratio) <= im_num: + scale += 1 + scale -= 1 + new_w = int(scale * 336) + new_h = int(new_w / ratio) + + img = transforms.functional.resize(img, [new_h, new_w],) + img = padding_336(img) + width, height = img.size + assert width * height <= im_num * 336 * 336 + if trans: + img = img.transpose(Image.TRANSPOSE) + + return img + +def listinstr(lst, s): + assert isinstance(lst, list) + for item in lst: + if item in s: + return True + return False + +def DATASET_TYPE(dataset): + # Dealing with Custom Dataset + dataset = dataset.lower() + if listinstr(['mmbench', 'seedbench', 'ccbench', 'mmmu', 'scienceqa', 'ai2d', 'mmstar'], dataset): + return 'multi-choice' + elif listinstr(['mme', 'hallusion'], dataset): + return 'Y/N' + elif 'coco' in dataset: + return 'Caption' + elif listinstr(['ocrvqa', 'textvqa', 'chartqa', 'mathvista', 'docvqa', 'infovqa', 'llavabench', + 'mmvet', 'ocrbench'], dataset): + return 'VQA' + else: + return 'QA' \ No newline at end of file diff --git a/lmms_eval/tasks/ai2d/ai2d.yaml b/lmms_eval/tasks/ai2d/ai2d.yaml index e032a3c49..7848c6cba 100755 --- a/lmms_eval/tasks/ai2d/ai2d.yaml +++ b/lmms_eval/tasks/ai2d/ai2d.yaml @@ -30,6 +30,10 @@ model_specific_prompt_kwargs: prompt_format: qa pre_prompt: "" post_prompt: " Answer:" + xcomposer2_4khd: + prompt_format: mcq_xcomposer + pre_prompt: "[UNUSED_TOKEN_146]user\nQuestion: " + post_prompt: "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\nThe answer is" model_specific_target_kwargs: default: "mcq" diff --git a/lmms_eval/tasks/ai2d/utils.py b/lmms_eval/tasks/ai2d/utils.py index 0549fbab8..ace9a68e2 100755 --- a/lmms_eval/tasks/ai2d/utils.py +++ b/lmms_eval/tasks/ai2d/utils.py @@ -10,6 +10,10 @@ def ai2d_doc_to_text(doc, model_specific_prompt_kwargs=None): elif model_specific_prompt_kwargs["prompt_format"] == "qa": options = "\n".join(choices) return f"{pre_prompt}{question}{options}{post_prompt}" + elif model_specific_prompt_kwargs["prompt_format"] == "mcq_xcomposer": + options = [chr(ord("A") + i) for i in range(len_choices)] + choices_str = " ".join([f"{option}. {choice}" for option, choice in zip(options, choices)]) + return f"{pre_prompt}{question}\nContext: N/A\n{choices_str}{post_prompt}" else: raise ValueError(f"Unknown prompt format: {model_specific_prompt_kwargs['prompt_format']}") diff --git a/lmms_eval/tasks/llava_wilder/_default_template_wilder_yaml b/lmms_eval/tasks/llava_wilder/_default_template_wilder_yaml new file mode 100644 index 000000000..ba90cda86 --- /dev/null +++ b/lmms_eval/tasks/llava_wilder/_default_template_wilder_yaml @@ -0,0 +1,22 @@ +output_type: generate_until +doc_to_visual: !function utils.llava_doc_to_visual +doc_to_text: !function utils.llava_doc_to_text +doc_to_target: "gpt4v_answer" +generation_kwargs: + until: + - "ASSISTANT:" + image_aspect_ratio: original + max_new_tokens: 1024 + temperature: 0 + top_p: 0 + num_beams: 1 + do_sample: false +process_results: !function utils.llava_process_results +metric_list: + - metric: gpt_eval_llava_all + aggregation: !function utils.llava_all_aggregation + higher_is_better: true +metadata: + version: 0.0 + api_type : openai + gpt_eval_model_name: "gpt-4-vision-preview" \ No newline at end of file diff --git a/lmms_eval/tasks/llava_wilder/llava_wilder_full.yaml b/lmms_eval/tasks/llava_wilder/llava_wilder_full.yaml new file mode 100755 index 000000000..c5d1379a5 --- /dev/null +++ b/lmms_eval/tasks/llava_wilder/llava_wilder_full.yaml @@ -0,0 +1,11 @@ +dataset_path: lmms-lab/llava-wilder +dataset_name: Full +dataset_kwargs: + token: True +task: "llava_wilder_full" +test_split: test +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" +include: _default_template_wilder_yaml \ No newline at end of file diff --git a/lmms_eval/tasks/llava_wilder/llava_wilder_medium.yaml b/lmms_eval/tasks/llava_wilder/llava_wilder_medium.yaml new file mode 100644 index 000000000..7fadd66cd --- /dev/null +++ b/lmms_eval/tasks/llava_wilder/llava_wilder_medium.yaml @@ -0,0 +1,11 @@ +dataset_path: lmms-lab/llava-wilder +dataset_name: Medium +dataset_kwargs: + token: True +task: "llava_wilder_medium" +test_split: test +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" +include: _default_template_wilder_yaml \ No newline at end of file diff --git a/lmms_eval/tasks/llava_wilder/llava_wilder_small.yaml b/lmms_eval/tasks/llava_wilder/llava_wilder_small.yaml new file mode 100644 index 000000000..d6f726c2c --- /dev/null +++ b/lmms_eval/tasks/llava_wilder/llava_wilder_small.yaml @@ -0,0 +1,11 @@ +dataset_path: lmms-lab/llava-wilder +dataset_name: Small +dataset_kwargs: + token: True +task: "llava_wilder_small" +test_split: test +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" +include: _default_template_wilder_yaml \ No newline at end of file diff --git a/lmms_eval/tasks/llava_wilder/utils.py b/lmms_eval/tasks/llava_wilder/utils.py new file mode 100644 index 000000000..e3d0cedc8 --- /dev/null +++ b/lmms_eval/tasks/llava_wilder/utils.py @@ -0,0 +1,226 @@ +import base64 +import yaml +import os +from pathlib import Path +import requests +import logging +import time +from copy import deepcopy +import numpy as np +from http import HTTPStatus +from io import BytesIO + + +eval_logger = logging.getLogger("lmms-eval") + +try: + import dashscope +except: + eval_logger("Dashcope not found, make sure you install dashscope to use qwen vl") + +NUM_SECONDS_TO_SLEEP = 5 +dir_path = os.path.dirname(os.path.realpath(__file__)) + +judge_rules = "We would like to request your feedback on the performance of two AI assistants in response to the user question displayed above. The user asks the question on observing an image shown to you. \nPlease rate the helpfulness, relevance, accuracy, level of details of their responses. Each assistant receives an overall score on a scale of 1 to 10, where a higher score indicates better overall performance.\nPlease first output a single line containing only two values indicating the scores for Assistant 1 and 2, respectively. The two scores are separated by a space.\nIn the subsequent line, please provide a comprehensive explanation of your evaluation, avoiding any potential bias and ensuring that the order in which the responses were presented does not affect your judgment." + +with open(Path(__file__).parent / "_default_template_wilder_yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + # remove function definition since yaml load cannot handle it + if "!function" not in line: + safe_data.append(line) + + config = yaml.safe_load("".join(safe_data)) + +GPT_EVAL_MODEL_NAME = config["metadata"]["gpt_eval_model_name"] +API_TYPE = config["metadata"]["api_type"] + +if API_TYPE == "openai": + API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") + API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } + +elif API_TYPE == "azure": + API_URL = os.getenv("AZURE_ENDPOINT", "https://api.cognitive.microsoft.com/sts/v1.0/issueToken") + API_KEY = os.getenv("AZURE_API_KEY", "YOUR_API_KEY") + headers = { + "api-key": API_KEY, + "Content-Type": "application/json", + } + +elif API_TYPE == "qwen_vl": + API_URL = os.getenv("QWEN_ENDPOINT", "https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation") + API_KEY = os.getenv("DASHSCOPE_API_KEY", "YOUR_API_KEY") + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } + +def get_chat_response(base64_image, prompt, max_retries=5, wait_time=10): + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } + + payload = { + "model": GPT_EVAL_MODEL_NAME, + "messages": [ + { + "role": "user", + "content": [ + {"type": "text", "text": prompt}, + { + "type": "image_url", + "image_url": f"data:image/jpeg;base64,{base64_image}", + }, + ], + } + ], + "max_tokens": 1024, + "temperature": 0.0, + } + + for attempt in range(max_retries): + try: + response = requests.post(API_URL, headers=headers, json=payload, timeout=60) + response.raise_for_status() + response_data = response.json() + return response_data["choices"][0]["message"]["content"], GPT_EVAL_MODEL_NAME + except requests.exceptions.RequestException as e: + eval_logger.warning(f"Request failed on attempt {attempt+1}: {e}") + time.sleep(wait_time) + if attempt == max_retries - 1: + eval_logger.error(f"Failed to get response after {max_retries} attempts") + return "" , GPT_EVAL_MODEL_NAME + except Exception as e: + eval_logger.error(f"Error on attempt {attempt+1}: {e}") + return "" , GPT_EVAL_MODEL_NAME + + +def image_to_base64(pil_image): + buffered = BytesIO() + pil_image.save(buffered, format="PNG") + return base64.b64encode(buffered.getvalue()).decode("utf-8") + +def qwen_multimodal_conversation_call(text_content, image_content, retries=5): + """Simple single round multimodal conversation call. + """ + messages = [ + { + "role": "user", + "content": [ + {"image": image_content}, + {"text": text_content} + ] + } + ] + for attempt in range(retries): + try: + response_data = dashscope.MultiModalConversation.call(model=GPT_EVAL_MODEL_NAME, + messages=messages) + # The response status_code is HTTPStatus.OK indicate success, + # otherwise indicate request is failed, you can get error code + # and message from code and message. + content = response_data["output"]["choices"][0]["message"]["content"][0]["text"].strip() + if content != "": + return content, GPT_EVAL_MODEL_NAME + break # If successful, break out of the loop + except Exception as e: + eval_logger.info(f"Attempt {attempt + 1} failed with error: {e}") + if attempt < retries: # If we have retries left, sleep and then continue to next attempt + time.sleep(NUM_SECONDS_TO_SLEEP) + else: # If this was the last attempt, log and return empty + eval_logger.error(f"All {retries} attempts failed. Last error message: {e}") + return "", "" + return "", "" + +def parse_score(review): + try: + score_pair = review.split("\n")[0] + score_pair = score_pair.replace(",", " ") + sp = score_pair.split(" ") + if len(sp) == 2: + return [float(sp[0]), float(sp[1])] + else: + eval_logger.debug(f"Can not split: {review}. Returning [-1, -1]") + return [-1, -1] + except Exception as e: + eval_logger.debug(f"Error: {e}. Returning [-1, -1]") + return [-1, -1] + +def llava_process_results(doc, result): + """ + Args: + doc: a instance of the eval dataset + results: [pred] + Returns: + a dictionary with key: metric name (in this case coco_bleu), value: metric value + """ + try: + question = doc.get("question", "") + ans1 = doc.get("gpt4v_answer", "") + ans2 = result[0] if result else "" + content = f"[Question]\n{question}\n\n" + f"[Assistant 1]\n{ans1}\n\n[End of Assistant 1]\n\n" + f"[Assistant 2]\n{ans2}\n\n[End of Assistant 2]\n\n" f"[System]\n{judge_rules}\n\n" + visuals = llava_doc_to_visual(doc) + if API_TYPE == "qwen_vl": + file_path = os.path.join(dir_path, f"tmp_{doc['question_id']}.jpg") + visuals[0].save(file_path) + image_content = "file://" + file_path + review, model_name = qwen_multimodal_conversation_call(content, image_content=image_content) + os.remove(file_path) + elif API_TYPE == "openai": + image_path = doc["image"] + base64_image = image_to_base64(image_path) + review, model_name = get_chat_response(base64_image, content) + scores = parse_score(review) + except Exception as e: + eval_logger.error(f"Error for Question ID: {doc.get('question_id', 'Unknown')}: {e}") + review = "Failed to Get a Proper Review." + model_name = "Failed Request" + scores = [-1, -1] + + data_dict = {"question": question, "ans1": ans1, "ans2": ans2, "review": review, "scores": scores, "eval_model": model_name, "content": content} + # return {"gpt_eval_llava_all": review_dict} + return {"gpt_eval_llava_all" : data_dict} + +def llava_doc_to_visual(doc): + return [doc["image"].convert("RGB")] + + +def llava_doc_to_text(doc, model_specific_prompt_kwargs=None): + if model_specific_prompt_kwargs is None: + model_specific_prompt_kwargs = {} + pre_prompt = model_specific_prompt_kwargs.get("pre_prompt", "") + post_prompt = model_specific_prompt_kwargs.get("post_prompt", "") + return f"{pre_prompt}{doc['question']}{post_prompt}" + + +def llava_all_aggregation(results): + return llava_aggregation(results, "all") + + +def llava_aggregation(results, category): + try: + scores = [] + for result in results: + if -999 in result["scores"]: + continue + scores.append(result["scores"]) + + stats = np.asarray(scores).mean(0).tolist() + stats = [round(x, 3) for x in stats] + # gpt4_score_percentage = stats[0] * 10 + # model_score_percentage = stats[1] * 10 + # eval_logger.info(f"Category: {category}") + # eval_logger.info(f"GPT4 Score: {gpt4_score_percentage:.1f}%") + # eval_logger.info(f"Model Score: {model_score_percentage:.1f}%") + # eval_logger.info("=========================") + return round(stats[1] / stats[0] * 100, 1) + except Exception as e: + eval_logger.info(f"Error in llava_aggregation: {e}, and in category: {category}") + return None + diff --git a/lmms_eval/tasks/mme/mme.yaml b/lmms_eval/tasks/mme/mme.yaml index 504e6dd02..f7a5d229e 100755 --- a/lmms_eval/tasks/mme/mme.yaml +++ b/lmms_eval/tasks/mme/mme.yaml @@ -33,5 +33,8 @@ model_specific_prompt_kwargs: otterhd: pre_prompt: "" post_prompt: " Answer:" + xcomposer2_4khd: + pre_prompt: "[UNUSED_TOKEN_146]user\n" + post_prompt: " Answer this question briefly[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n" metadata: - version: 0.0 diff --git a/lmms_eval/tasks/mme/utils.py b/lmms_eval/tasks/mme/utils.py index b001b2c03..993136cd3 100755 --- a/lmms_eval/tasks/mme/utils.py +++ b/lmms_eval/tasks/mme/utils.py @@ -56,6 +56,13 @@ def parse_pred_ans(pred_ans): pred_label = None if pred_ans in ["yes", "no"]: pred_label = pred_ans + elif len(pred_ans) == 1: + if pred_ans == "y": + pred_label = "yes" + elif pred_ans == "n": + pred_label = "no" + else: + pred_label = "other" else: prefix_pred_ans = pred_ans[:4] if "yes" in prefix_pred_ans: diff --git a/lmms_eval/tasks/worldqa/_default_template_yaml b/lmms_eval/tasks/worldqa/_default_template_yaml index 7ce14a25e..f3202b828 100644 --- a/lmms_eval/tasks/worldqa/_default_template_yaml +++ b/lmms_eval/tasks/worldqa/_default_template_yaml @@ -2,7 +2,6 @@ dataset_path: lmms-lab/worldqa dataset_kwargs: token: True video: True - builder_script: multi-hop-reasoning.py cache_dir: multi-hop-reasoning model_specific_prompt_kwargs: default: diff --git a/lmms_eval/tasks/worldqa/utils.py b/lmms_eval/tasks/worldqa/utils.py index 642dea1e4..421508eb8 100755 --- a/lmms_eval/tasks/worldqa/utils.py +++ b/lmms_eval/tasks/worldqa/utils.py @@ -1,4 +1,3 @@ -from decord import VideoReader, cpu import numpy as np import os import sys @@ -23,7 +22,7 @@ # But the idea is that we will unzip all the zip files # To HF HOME cache dir # And load it here -HF_HOME = os.environ["HF_HOME"] +HF_HOME = os.getenv("HF_HOME", "~/.cache/huggingface/") cache_dir = config["dataset_kwargs"]["cache_dir"] cache_dir = os.path.join(HF_HOME, cache_dir) cache_dir = os.path.join(cache_dir, "videos") From 50959b4ba178e572d55dcb5ab88c2aebaabbef64 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Thu, 18 Apr 2024 02:49:05 +0000 Subject: [PATCH 003/181] Refactor code to handle customized configuration and attention implementation --- lmms_eval/models/llava.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lmms_eval/models/llava.py b/lmms_eval/models/llava.py index 0fa3636ca..af30d1fc8 100755 --- a/lmms_eval/models/llava.py +++ b/lmms_eval/models/llava.py @@ -92,9 +92,12 @@ def __init__( self.device_map = f"cuda:{accelerator.local_process_index}" llava_model_args = {} - llava_model_args["attn_implementation"] = attn_implementation - llava_model_args["customized_config"] = customized_config - llava_model_args["use_flash_attention_2"] = False + if customized_config is not None: + llava_model_args["customized_config"] = customized_config + if attn_implementation is not None: + llava_model_args["attn_implementation"] = attn_implementation + if "use_flash_attention_2" in kwargs: + llava_model_args["use_flash_attention_2"] = kwargs["use_flash_attention_2"] self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, get_model_name_from_path(pretrained), device_map=self.device_map, **llava_model_args) self._config = self._model.config self.model.eval() From 38f180674428dd8cb57979273b7959bd66e54fda Mon Sep 17 00:00:00 2001 From: Bo Li Date: Thu, 18 Apr 2024 10:46:57 +0000 Subject: [PATCH 004/181] Fix debug log message in utils.py --- lmms_eval/tasks/llava_wilder/utils.py | 33 +++++++++++---------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/lmms_eval/tasks/llava_wilder/utils.py b/lmms_eval/tasks/llava_wilder/utils.py index e3d0cedc8..a4450f061 100644 --- a/lmms_eval/tasks/llava_wilder/utils.py +++ b/lmms_eval/tasks/llava_wilder/utils.py @@ -10,13 +10,12 @@ from http import HTTPStatus from io import BytesIO - eval_logger = logging.getLogger("lmms-eval") try: import dashscope except: - eval_logger("Dashcope not found, make sure you install dashscope to use qwen vl") + eval_logger.debug("Dashcope not found, make sure you install dashscope to use qwen vl") NUM_SECONDS_TO_SLEEP = 5 dir_path = os.path.dirname(os.path.realpath(__file__)) @@ -43,7 +42,7 @@ "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json", } - + elif API_TYPE == "azure": API_URL = os.getenv("AZURE_ENDPOINT", "https://api.cognitive.microsoft.com/sts/v1.0/issueToken") API_KEY = os.getenv("AZURE_API_KEY", "YOUR_API_KEY") @@ -60,6 +59,7 @@ "Content-Type": "application/json", } + def get_chat_response(base64_image, prompt, max_retries=5, wait_time=10): headers = { "Authorization": f"Bearer {API_KEY}", @@ -95,10 +95,10 @@ def get_chat_response(base64_image, prompt, max_retries=5, wait_time=10): time.sleep(wait_time) if attempt == max_retries - 1: eval_logger.error(f"Failed to get response after {max_retries} attempts") - return "" , GPT_EVAL_MODEL_NAME + return "", GPT_EVAL_MODEL_NAME except Exception as e: eval_logger.error(f"Error on attempt {attempt+1}: {e}") - return "" , GPT_EVAL_MODEL_NAME + return "", GPT_EVAL_MODEL_NAME def image_to_base64(pil_image): @@ -106,22 +106,13 @@ def image_to_base64(pil_image): pil_image.save(buffered, format="PNG") return base64.b64encode(buffered.getvalue()).decode("utf-8") + def qwen_multimodal_conversation_call(text_content, image_content, retries=5): - """Simple single round multimodal conversation call. - """ - messages = [ - { - "role": "user", - "content": [ - {"image": image_content}, - {"text": text_content} - ] - } - ] + """Simple single round multimodal conversation call.""" + messages = [{"role": "user", "content": [{"image": image_content}, {"text": text_content}]}] for attempt in range(retries): try: - response_data = dashscope.MultiModalConversation.call(model=GPT_EVAL_MODEL_NAME, - messages=messages) + response_data = dashscope.MultiModalConversation.call(model=GPT_EVAL_MODEL_NAME, messages=messages) # The response status_code is HTTPStatus.OK indicate success, # otherwise indicate request is failed, you can get error code # and message from code and message. @@ -138,6 +129,7 @@ def qwen_multimodal_conversation_call(text_content, image_content, retries=5): return "", "" return "", "" + def parse_score(review): try: score_pair = review.split("\n")[0] @@ -152,6 +144,7 @@ def parse_score(review): eval_logger.debug(f"Error: {e}. Returning [-1, -1]") return [-1, -1] + def llava_process_results(doc, result): """ Args: @@ -185,7 +178,8 @@ def llava_process_results(doc, result): data_dict = {"question": question, "ans1": ans1, "ans2": ans2, "review": review, "scores": scores, "eval_model": model_name, "content": content} # return {"gpt_eval_llava_all": review_dict} - return {"gpt_eval_llava_all" : data_dict} + return {"gpt_eval_llava_all": data_dict} + def llava_doc_to_visual(doc): return [doc["image"].convert("RGB")] @@ -223,4 +217,3 @@ def llava_aggregation(results, category): except Exception as e: eval_logger.info(f"Error in llava_aggregation: {e}, and in category: {category}") return None - From d2d66b2c9f86aab8d5cc086f3767497ebca9db78 Mon Sep 17 00:00:00 2001 From: Kaichen Zhang - NTU Date: Sat, 20 Apr 2024 20:42:14 +0800 Subject: [PATCH 005/181] [Feat & Fix] Add Claude, Qwen_VL_api; Fix xcomposer_4khd generation truncation, llava_wilder (#79) * Revise xcomposer default pretrained args * Add xcomposer2_4khd specific prompt * Fix xcomposer generation truncation * Leave more tokens since this is a much more complex mission * Add xcomposer specific prompt for realworldqa * Split the end token for generation in xcomposer * Get back to internal_eval * Add claude * Fix claude image oversize bug * Set timeout for gpt4V * Add Qwen_VL_API * Try and catch for llava_vid load video * Use deepcopy instead of copy for llava_llama_3 because we need the tokenizer --- lmms_eval/models/__init__.py | 2 + lmms_eval/models/claude.py | 183 ++++++++++++++++++ lmms_eval/models/gpt4v.py | 4 +- lmms_eval/models/llava.py | 12 +- lmms_eval/models/llava_vid.py | 17 +- lmms_eval/models/qwen_vl_api.py | 136 +++++++++++++ lmms_eval/models/xcomposer2_4KHD.py | 7 +- .../_default_template_internal_eval_yaml | 4 + lmms_eval/tasks/internal_eval/d170_cn.yaml | 32 +++ .../tasks/internal_eval/d170_cn_utils.py | 140 ++++++++++++++ lmms_eval/tasks/internal_eval/d170_en.yaml | 32 +++ .../tasks/internal_eval/d170_en_utils.py | 140 ++++++++++++++ lmms_eval/tasks/internal_eval/dc100_en.yaml | 29 +++ .../tasks/internal_eval/dc100_en_utils.py | 125 ++++++++++++ lmms_eval/tasks/internal_eval/dc200_cn.yaml | 29 +++ .../tasks/internal_eval/dc200_cn_utils.py | 130 +++++++++++++ .../tasks/internal_eval/internal_eval.yaml | 6 + lmms_eval/tasks/internal_eval/utils.py | 7 + .../_default_template_wilder_yaml | 2 +- .../tasks/llava_wilder/llava_wilder_full.yaml | 3 + .../llava_wilder/llava_wilder_medium.yaml | 3 + .../llava_wilder/llava_wilder_small.yaml | 3 + lmms_eval/tasks/realworldqa/realworldqa.yaml | 3 + 23 files changed, 1038 insertions(+), 11 deletions(-) create mode 100644 lmms_eval/models/claude.py create mode 100644 lmms_eval/models/qwen_vl_api.py create mode 100755 lmms_eval/tasks/internal_eval/_default_template_internal_eval_yaml create mode 100755 lmms_eval/tasks/internal_eval/d170_cn.yaml create mode 100755 lmms_eval/tasks/internal_eval/d170_cn_utils.py create mode 100755 lmms_eval/tasks/internal_eval/d170_en.yaml create mode 100755 lmms_eval/tasks/internal_eval/d170_en_utils.py create mode 100755 lmms_eval/tasks/internal_eval/dc100_en.yaml create mode 100755 lmms_eval/tasks/internal_eval/dc100_en_utils.py create mode 100755 lmms_eval/tasks/internal_eval/dc200_cn.yaml create mode 100755 lmms_eval/tasks/internal_eval/dc200_cn_utils.py create mode 100755 lmms_eval/tasks/internal_eval/internal_eval.yaml create mode 100755 lmms_eval/tasks/internal_eval/utils.py diff --git a/lmms_eval/models/__init__.py b/lmms_eval/models/__init__.py index ffde7ae92..011d232ff 100755 --- a/lmms_eval/models/__init__.py +++ b/lmms_eval/models/__init__.py @@ -12,6 +12,8 @@ "llama_vid" : "LLaMAVid", "video_llava": "VideoLLaVA", "xcomposer2_4KHD": "XComposer2_4KHD", + "claude" : "Claude", + "qwen_vl_api" : "Qwen_VL_API" } for model_name, model_class in AVAILABLE_MODELS.items(): diff --git a/lmms_eval/models/claude.py b/lmms_eval/models/claude.py new file mode 100644 index 000000000..1f112a167 --- /dev/null +++ b/lmms_eval/models/claude.py @@ -0,0 +1,183 @@ +from io import BytesIO +from copy import deepcopy +import os +import base64 +from typing import List, Tuple, Union +from tqdm import tqdm +import requests as url_requests +import time +import logging + +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model +from lmms_eval import utils + +from PIL import Image + +NUM_SECONDS_TO_SLEEP = 5 +eval_logger = logging.getLogger("lmms-eval") + +try: + import anthropic +except: + eval_logger.debug("Can not import anthropic") + +API_URL = os.getenv("ANTHROPIC_API_URL", "https://api.anthropic.com/v1/complete") +API_KEY = os.getenv("ANTHROPIC_API_KEY", "YOUR_API_KEY") + + +@register_model("claude") +class Claude(lmms): + def __init__( + self, + model_version: str = "claude-3-opus-20240229", + image_token: str = "", # Use to separate interleaved image and text + system_prompt: str = "", # Whether you want some special system prompt here + **kwargs, + ) -> None: + super().__init__() + self.model_version = model_version + self.image_token = image_token + self.system_prompt = system_prompt + + def encode_image(self, image): + output_buffer = BytesIO() + image.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + return base64_str + + def flatten(self, input): + new_list = [] + for i in input: + for j in i: + new_list.append(j) + return new_list + + def get_image_size(self, image): + # Create a BytesIO object to store the image bytes + img_byte_array = BytesIO() + + # Save the image to the BytesIO object + image.save(img_byte_array, format="PNG") + + # Get the size of the BytesIO object + img_size = img_byte_array.tell() + + return img_size + + # The max file size is 5MB for claude + def shrink_image_to_file_size(self, img : Image, max_file_size=5242880) -> Image: + + # Get the current size of the image + original_size = self.get_image_size(img) + + # If the image size is already smaller than the desired size, return + if original_size <= max_file_size: + return img + + # Calculate the ratio to shrink the image + # Somehow I found out sqrt ratio is not enough to shrink the image + # below threshold, so I guess we do more + shrink_ratio = (max_file_size / original_size) + + # Resize the image with the calculated ratio + new_width = int(img.width * shrink_ratio) + new_height = int(img.height * shrink_ratio) + img = img.resize((new_width, new_height), Image.LANCZOS) + + return img + + def generate_until(self, requests) -> List[str]: + client = anthropic.Anthropic() + + res = [] + pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") + + + empty_image_block = {"type" : "image", "source" : {"type": "base64", "media_type": "image/png",}} + empty_text_block = {"type" : "text"} + empty_messages = [ + { + "role" : "user", + "content" : [], + } + ] + + for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + # encode, pad, and truncate contexts for this batch + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + imgs = [] + for visual in visuals: + visual = self.shrink_image_to_file_size(visual) + img = self.encode_image(visual) + imgs.append(img) + + messages = deepcopy(empty_messages) + + if self.image_token not in contexts: + for img in imgs: + image_block = deepcopy(empty_image_block) + image_block["source"]["data"] = img + messages[0]["content"].append(image_block) + text_block = deepcopy(empty_text_block) + text_block["text"] = contexts + messages[0]["content"].append(text_block) + else: + contexts = contexts.split(self.image_token) + for idx, img in enumerate(imgs): + text_block = deepcopy(empty_text_block) + image_block = deepcopy(empty_image_block) + text_block["text"] = contexts + messages[0]["content"].append(text_block) + image_block["source"]["data"] = img + messages[0]["content"].append(image_block) + + # If n image tokens are in the contexts + # contexts will be splitted into n+1 chunks + # Manually add it into the messages + text_block = deepcopy(empty_text_block) + text_block["text"] = contexts + messages["content"].append(text_block) + + + if "max_new_tokens" not in gen_kwargs: + gen_kwargs["max_new_tokens"] = 1024 + if "temperature" not in gen_kwargs: + gen_kwargs["temperature"] = 0 + if "top_p" not in gen_kwargs: + gen_kwargs["top_p"] = None + if "num_beams" not in gen_kwargs: + gen_kwargs["num_beams"] = 1 + + for attempt in range(5): + try: + message = client.messages.create( + model=self.model_version, + max_tokens= gen_kwargs["max_new_tokens"], + system=self.system_prompt, + temperature=gen_kwargs["temperature"], + top_p=gen_kwargs["top_p"], + messages=messages + ) + except Exception as e: + eval_logger.info(f"Attempt {attempt + 1} failed with error: {str(e)}") + if attempt < 5 - 1: # If we have retries left, sleep and then continue to next attempt + time.sleep(NUM_SECONDS_TO_SLEEP) + else: # If this was the last attempt, log and return empty + eval_logger.error(f"All 5 attempts failed. Last error message: {str(e)}") + res.append("") + pbar.update(1) + continue + + res.append(message.content[0].text) + pbar.update(1) + + pbar.close() + + return res + + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + assert False, "Not supported for claude" \ No newline at end of file diff --git a/lmms_eval/models/gpt4v.py b/lmms_eval/models/gpt4v.py index 33c632a36..1e2fa5b03 100755 --- a/lmms_eval/models/gpt4v.py +++ b/lmms_eval/models/gpt4v.py @@ -40,6 +40,7 @@ class GPT4V(lmms): def __init__( self, model_version: str = "gpt-4-vision-preview", + timeout: int = 120, **kwargs, ) -> None: super().__init__() @@ -48,6 +49,7 @@ def __init__( # Here we just use the same token as llava for convenient self.model_version = model_version self.image_token = "" + self.timeout = timeout # Function to encode the image def encode_image(self, image: Image): @@ -112,7 +114,7 @@ def generate_until(self, requests) -> List[str]: for attempt in range(5): try: - response = url_requests.post(API_URL, headers=headers, json=payload, timeout=20) + response = url_requests.post(API_URL, headers=headers, json=payload, timeout=self.timeout) response_data = response.json() content = response_data["choices"][0]["message"]["content"].strip() diff --git a/lmms_eval/models/llava.py b/lmms_eval/models/llava.py index af30d1fc8..6c93af3af 100755 --- a/lmms_eval/models/llava.py +++ b/lmms_eval/models/llava.py @@ -241,7 +241,11 @@ def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: image_tokens = " ".join(image_tokens) prompts_input = image_tokens + "\n" + (contexts[0] if isinstance(contexts, list) else contexts) - conv = conv_templates[self.conv_template].copy() + # This is much safer for llama3, as we now have some object type in it + if "llama_3" in self.conv_template: + conv = copy.deepcopy(conv_templates[self.conv_template]) + else: + conv = conv_templates[self.conv_template].copy() conv.append_message(conv.roles[0], prompts_input) conv.append_message(conv.roles[1], None) prompt = conv.get_prompt() @@ -348,7 +352,11 @@ def _collate(x): question = image_tokens + "\n" + context else: question = context - conv = conv_templates[self.conv_template].copy() + # This is much safer for llama3, as we now have some object type in it + if "llama_3" in self.conv_template: + conv = copy.deepcopy(conv_templates[self.conv_template]) + else: + conv = conv_templates[self.conv_template].copy() conv.append_message(conv.roles[0], question) conv.append_message(conv.roles[1], None) prompt_question = conv.get_prompt() diff --git a/lmms_eval/models/llava_vid.py b/lmms_eval/models/llava_vid.py index 0913dc118..143ba8358 100755 --- a/lmms_eval/models/llava_vid.py +++ b/lmms_eval/models/llava_vid.py @@ -1,5 +1,4 @@ import logging -from multiprocessing import context from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs from accelerate.state import AcceleratorState from typing import List, Optional, Union, Tuple @@ -299,10 +298,18 @@ def generate_until(self, requests) -> List[str]: visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] visuals = self.flatten(visuals) videos = [] - for visual in visuals: - video = self.load_video(visual, self.for_get_frames_num) - video = self._image_processor.preprocess(video, return_tensors="pt")["pixel_values"].half().cuda() - videos.append(video) + try: + for visual in visuals: + video = self.load_video(visual, self.for_get_frames_num) + video = self._image_processor.preprocess(video, return_tensors="pt")["pixel_values"].half().cuda() + videos.append(video) + except Exception as e: + eval_logger.info(f"{e}") + eval_logger.info(f"Video {visuals} can not load, check the source") + video_path = "\n".join(visuals) + res.append(f"Video {video_path} can not load, check the source") + pbar.update(1) + continue qs = contexts if self.model.config.mm_use_im_start_end: diff --git a/lmms_eval/models/qwen_vl_api.py b/lmms_eval/models/qwen_vl_api.py new file mode 100644 index 000000000..b47c37793 --- /dev/null +++ b/lmms_eval/models/qwen_vl_api.py @@ -0,0 +1,136 @@ +from io import BytesIO +from copy import deepcopy +import os +import base64 +from typing import List, Tuple, Union +from tqdm import tqdm +import requests as url_requests +import time +import logging + +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model +from lmms_eval import utils + +from PIL import Image + +NUM_SECONDS_TO_SLEEP = 5 +eval_logger = logging.getLogger("lmms-eval") + +try: + import dashscope +except: + eval_logger.debug("Can not import Dashscope") + +API_KEY = os.getenv("DASHSCOPE_API_KEY", "YOUR_API_KEY") + + +@register_model("qwen-vl-api") +class Qwen_VL_API(lmms): + def __init__( + self, + model_version: str = "qwen-vl-max", + image_token: str = "", # Use to separate interleaved image and text + system_prompt: str = "", # Whether you want some special system prompt here + tmp_folder: str = "./tmp", # Due to qwen's api restriction, + **kwargs, + ) -> None: + super().__init__() + + self.model_version = model_version + self.image_token = image_token + self.system_prompt = system_prompt + self.tmp_folder = tmp_folder + + @property + def rank(self): + return self._rank + + @property + def world_size(self): + return self._world_size + + def generate_until(self, requests) -> List[str]: + res = [] + pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") + os.makedirs(self.tmp_folder, exist_ok=True) + + for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + # encode, pad, and truncate contexts for this batch + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + imgs = [] + + for idx, visual in enumerate(visuals): + visual.save(os.path.join(self.tmp_folder, f"tmp_{idx}_{self.rank}_{self.world_size}.jpg")) + imgs.append(os.path.join(self.tmp_folder, f"tmp_{idx}_{self.rank}_{self.world_size}.jpg")) + + messages = [ + { + "role": "user", + "content": [] + } + ] + + if self.image_token not in contexts: + for img in imgs: + messages[0]["content"].append({"image": img}) + messages[0]["content"].append({"text": contexts}) + else: + contexts = contexts.split(self.image_token) + + for idx, img in enumerate(imgs): + messages[0]["content"].append({"text": contexts[idx]}) + messages[0]["content"].append({"image": img}) + messages[0]["content"].append({"text" : contexts[-1]}) + + + if "max_new_tokens" not in gen_kwargs or gen_kwargs["max_new_tokens"] > 1500: + gen_kwargs["max_new_tokens"] = 1024 + if "temperature" not in gen_kwargs: + gen_kwargs["temperature"] = 0 + if "top_p" not in gen_kwargs: + gen_kwargs["top_p"] = None + if "num_beams" not in gen_kwargs: + gen_kwargs["num_beams"] = 1 + + for attempt in range(5): + try: + response_data = dashscope.MultiModalConversation.call( + model=self.model_version, + messages=messages, + api_key=API_KEY, + max_length = gen_kwargs["max_new_tokens"] + ) + except Exception as e: + eval_logger.info(f"Attempt {attempt + 1} failed with error: {str(e)}") + if attempt < 5 - 1: # If we have retries left, sleep and then continue to next attempt + time.sleep(NUM_SECONDS_TO_SLEEP) + else: # If this was the last attempt, log and return empty + eval_logger.error(f"All 5 attempts failed. Last error message: {str(e)}") + res.append("") + pbar.update(1) + continue + try: + res.append(response_data["output"]["choices"][0]["message"]["content"][0]["text"].strip()) + except Exception as e: + eval_logger.error(f"Error {e} happens when parsing input.") + eval_logger.error(f"{response_data}") + res.append("") + pbar.update(1) + + pbar.close() + + return res + + + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + assert False, "Not supported for claude" + + def flatten(self, input): + new_list = [] + for i in input: + for j in i: + new_list.append(j) + return new_list \ No newline at end of file diff --git a/lmms_eval/models/xcomposer2_4KHD.py b/lmms_eval/models/xcomposer2_4KHD.py index 022bfd9b7..cc361d779 100644 --- a/lmms_eval/models/xcomposer2_4KHD.py +++ b/lmms_eval/models/xcomposer2_4KHD.py @@ -36,7 +36,7 @@ class XComposer2_4KHD(lmms): def __init__( self, - pretrained: str = "liuhaotian/llava-v1.5-7b", + pretrained: str = "internlm/internlm-xcomposer2-4khd-7b", device: Optional[str] = "cuda:0", batch_size: Optional[Union[int, str]] = 1, device_map="cuda:0", @@ -212,12 +212,15 @@ def generate_until(self, requests) -> List[str]: output_token = output_token[1:] output_text = self.model.tokenizer.decode(output_token, add_special_tokens=False) output_text = output_text.split('[UNUSED_TOKEN_145]')[0].strip() + output_text = output_text.split("<|im_end|>")[0].strip() if DATASET_TYPE(task) == "multi-choice": output_text = pattern.findall(output_text) if len(output_text) == 0: print('Error:', output_text) output_text = 'Z' - res.append(output_text[0]) + if type(output_text) == list: + output_text = output_text[0] + res.append(output_text) pbar.update(1) pbar.close() return res diff --git a/lmms_eval/tasks/internal_eval/_default_template_internal_eval_yaml b/lmms_eval/tasks/internal_eval/_default_template_internal_eval_yaml new file mode 100755 index 000000000..cd692a1d8 --- /dev/null +++ b/lmms_eval/tasks/internal_eval/_default_template_internal_eval_yaml @@ -0,0 +1,4 @@ +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" \ No newline at end of file diff --git a/lmms_eval/tasks/internal_eval/d170_cn.yaml b/lmms_eval/tasks/internal_eval/d170_cn.yaml new file mode 100755 index 000000000..ebb956e51 --- /dev/null +++ b/lmms_eval/tasks/internal_eval/d170_cn.yaml @@ -0,0 +1,32 @@ +dataset_path: lmms-lab/D170_v4.1_CN +dataset_kwargs: + token: True +task: "d170_cn" +test_split: test +output_type: generate_until +doc_to_text: !function utils.doc_to_text # Such that {{prompt}} will be replaced by doc["question"] +doc_to_visual: !function d170_cn_utils.doc_to_visual +doc_to_target: "{{annotation}}" +generation_kwargs: + until: + - "ASSISTANT:" + max_new_tokens: 1024 + temperature: 0 + top_p: 0 + num_beams: 1 + do_sample: false +process_results: !function d170_cn_utils.process_results # apply gpt eval here +metric_list: + - metric: gpt_eval_info + aggregation: !function d170_cn_utils.d170_cn_aggregate_info + higher_is_better: false + - metric: gpt_eval_avg_score + aggregation: !function d170_cn_utils.d170_cn_aggregate_avg_score + higher_is_better: true + - metric: gpt_eval_score2_rate + aggregation: !function d170_cn_utils.d170_cn_aggregate_score2_rate + higher_is_better: true +metadata: + version: 0.0 + gpt_eval_model_name: "gpt-4-1106-preview" +include: _default_template_internal_eval_yaml \ No newline at end of file diff --git a/lmms_eval/tasks/internal_eval/d170_cn_utils.py b/lmms_eval/tasks/internal_eval/d170_cn_utils.py new file mode 100755 index 000000000..060229d75 --- /dev/null +++ b/lmms_eval/tasks/internal_eval/d170_cn_utils.py @@ -0,0 +1,140 @@ +import os +import requests +import time +import logging +import yaml +from pathlib import Path +import re +import json + +from lmms_eval.tasks._task_utils.file_utils import generate_submission_file + +eval_logger = logging.getLogger("lmms-eval") + +with open(Path(__file__).parent / "d170_cn.yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + # remove function definition since yaml load cannot handle it + if "!function" not in line: + safe_data.append(line) + + config = yaml.safe_load("".join(safe_data)) + +API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") +API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") +GPT_EVAL_MODEL_NAME = config["metadata"]["gpt_eval_model_name"] + +# The EVALUATION_PROMPT_TEMPLATE_SIMPLE_V2 constant should be defined here +EVALUATION_PROMPT_TEMPLATE_SIMPLE_V2 = """You are an expert in judging the quality of a model response compared with given ground truth. The model response is in English while the ground truth can be in English or Chinese, or both. You should only judge the relevance of the model response to the ground truth based on meanings, not the language. +If the model response and ground truth are about grounding object coordinates, you may pay attention that the model responses are in format of [x_min, y_min, x_max, y_max]. You could judge the grounding quality by the IoU of the model response and the ground truth, or the distance between the center of the model response and the ground truth. If IoU is above 0.5 or the distance is below 0.3, you could give a score of 2. If IoU is below 0.2 or the distance is above 0.5, you could give a score of 0. If IoU is between 0.2 and 0.5 or the distance is between 0.2 and 0.5, you could give a score of 1. +Your response should be an integer score in [0, 1, 2], where 0 means the model response is completely irrelevant to the ground truth, and 2 means the model response completely matches the ground truth. You would have specific score criteria in the ground truth. You also need to explain your score in English. +Text: {prompt} +Ground Truth: {ground_truth} +You should response by following format: +Score: +Explanation:""" + + +def get_chat_response(prompt, model=GPT_EVAL_MODEL_NAME, max_tokens=512, patience=3, sleep_time=15): + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } + + messages = [ + {"role": "user", "content": prompt}, + ] + + payload = { + "model": model, + "messages": messages, + "max_tokens": max_tokens, + "temperature": 0.0, + } + + while patience > 0: + patience -= 1 + try: + response = requests.post( + API_URL, + headers=headers, + json=payload, + timeout=60, + ) + response.raise_for_status() + response_data = response.json() + + content = response_data["choices"][0]["message"]["content"].strip() + if content != "": + return content, response_data["model"] + + except Exception as e: + eval_logger.info(f"Error in response: {response.json()['error']['message']}") + if "Rate limit" in str(e): + eval_logger.info("Sleeping due to rate limit...") + time.sleep(sleep_time) + eval_logger.info(f"Retrying...Patience left: {patience}") + + return "", "" + + +def doc_to_visual(doc): + if doc["image"] is None: + return [] + return [doc["image"].convert("RGB")] + + +def process_results(doc, results): + # get pred and ground truth here + pred = results[0] + question = doc["question"] + answer = doc["annotation"] + gpt_query_prompt = EVALUATION_PROMPT_TEMPLATE_SIMPLE_V2.format(prompt=pred, ground_truth=answer) + grade_sample_run_complete = False + while not grade_sample_run_complete: + try: + response, model_name = get_chat_response(gpt_query_prompt) + grade_sample_run_complete = True + except Exception as e: + eval_logger.info(f"Error in response: {e}") + eval_logger.info(f"Retrying...") + + try: + score = int(re.findall(r"Score:\s*(\d)", response)[0]) + except IndexError: + score = 0 # Assign score 0 if the score wasn't parsed correctly + + return { + "gpt_eval_info": {"question_id": doc["question_id"], "prediction": pred, "ground_truth": answer, "eval_model": model_name, "prompt": gpt_query_prompt, "response": response}, + "gpt_eval_avg_score": { + "score": score, + }, + "gpt_eval_score2_rate": { + "score": score, + }, + } + + +def d170_cn_aggregate_info(results, args): + path = generate_submission_file("dc170_cn_eval_info.json", args) + with open(path, "w") as f: + json.dump(results, f) + eval_logger.info(f"Results saved to {path}.") + + +def d170_cn_aggregate_avg_score(results): + total_score = 0 + for result in results: + total_score += result["score"] + avg_score = total_score / len(results) + return avg_score + + +def d170_cn_aggregate_score2_rate(results): + score2_count = 0 + for result in results: + if result["score"] == 2: + score2_count += 1 + score2_rate = score2_count / len(results) + return score2_rate diff --git a/lmms_eval/tasks/internal_eval/d170_en.yaml b/lmms_eval/tasks/internal_eval/d170_en.yaml new file mode 100755 index 000000000..ffae9a6c8 --- /dev/null +++ b/lmms_eval/tasks/internal_eval/d170_en.yaml @@ -0,0 +1,32 @@ +dataset_path: lmms-lab/D170_v4.1_EN +dataset_kwargs: + token: True +task: "d170_en" +test_split: test +output_type: generate_until +doc_to_visual: !function d170_en_utils.doc_to_visual +doc_to_text: !function utils.doc_to_text # Such that {{prompt}} will be replaced by doc["question"] +doc_to_target: "{{annotation}}" +generation_kwargs: + until: + - "ASSISTANT:" + max_new_tokens: 1024 + temperature: 0 + top_p: 0 + num_beams: 1 + do_sample: false +process_results: !function d170_en_utils.process_results # apply gpt eval here +metric_list: + - metric: gpt_eval_info + aggregation: !function d170_en_utils.d170_en_aggregate_info + higher_is_better: false + - metric: gpt_eval_avg_score + aggregation: !function d170_en_utils.d170_en_aggregate_avg_score + higher_is_better: true + - metric: gpt_eval_score2_rate + aggregation: !function d170_en_utils.d170_en_aggregate_score2_rate + higher_is_better: true +metadata: + version: 0.0 + gpt_eval_model_name: "gpt-4-1106-preview" +include: _default_template_internal_eval_yaml \ No newline at end of file diff --git a/lmms_eval/tasks/internal_eval/d170_en_utils.py b/lmms_eval/tasks/internal_eval/d170_en_utils.py new file mode 100755 index 000000000..b96017b4c --- /dev/null +++ b/lmms_eval/tasks/internal_eval/d170_en_utils.py @@ -0,0 +1,140 @@ +import os +import requests +import time +import logging +import yaml +from pathlib import Path +import re +import json + +from lmms_eval.tasks._task_utils.file_utils import generate_submission_file + +eval_logger = logging.getLogger("lmms-eval") + +with open(Path(__file__).parent / "d170_en.yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + # remove function definition since yaml load cannot handle it + if "!function" not in line: + safe_data.append(line) + + config = yaml.safe_load("".join(safe_data)) + +API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") +API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") +GPT_EVAL_MODEL_NAME = config["metadata"]["gpt_eval_model_name"] + +# The EVALUATION_PROMPT_TEMPLATE_SIMPLE_V2 constant should be defined here +EVALUATION_PROMPT_TEMPLATE_SIMPLE_V2 = """You are an expert in judging the quality of a model response compared with given ground truth. The model response is in English while the ground truth can be in English or Chinese, or both. You should only judge the relevance of the model response to the ground truth based on meanings, not the language. +If the model response and ground truth are about grounding object coordinates, you may pay attention that the model responses are in format of [x_min, y_min, x_max, y_max]. You could judge the grounding quality by the IoU of the model response and the ground truth, or the distance between the center of the model response and the ground truth. If IoU is above 0.5 or the distance is below 0.3, you could give a score of 2. If IoU is below 0.2 or the distance is above 0.5, you could give a score of 0. If IoU is between 0.2 and 0.5 or the distance is between 0.2 and 0.5, you could give a score of 1. +Your response should be an integer score in [0, 1, 2], where 0 means the model response is completely irrelevant to the ground truth, and 2 means the model response completely matches the ground truth. You would have specific score criteria in the ground truth. You also need to explain your score in English. +Text: {prompt} +Ground Truth: {ground_truth} +You should response by following format: +Score: +Explanation:""" + + +def get_chat_response(prompt, model=GPT_EVAL_MODEL_NAME, max_tokens=512, patience=3, sleep_time=15): + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } + + messages = [ + {"role": "user", "content": prompt}, + ] + + payload = { + "model": model, + "messages": messages, + "max_tokens": max_tokens, + "temperature": 0.0, + } + + while patience > 0: + patience -= 1 + try: + response = requests.post( + API_URL, + headers=headers, + json=payload, + timeout=60, + ) + response.raise_for_status() + response_data = response.json() + + content = response_data["choices"][0]["message"]["content"].strip() + if content != "": + return content, response_data["model"] + + except Exception as e: + eval_logger.info(f"Error in response: {response.json()['error']['message']}") + if "Rate limit" in str(e): + eval_logger.info("Sleeping due to rate limit...") + time.sleep(sleep_time) + eval_logger.info(f"Retrying...Patience left: {patience}") + + return "", "" + + +def doc_to_visual(doc): + if doc["image"] is None: + return [] + return [doc["image"].convert("RGB")] + + +def process_results(doc, results): + # get pred and ground truth here + pred = results[0] + question = doc["question"] + answer = doc["annotation"] + gpt_query_prompt = EVALUATION_PROMPT_TEMPLATE_SIMPLE_V2.format(prompt=pred, ground_truth=answer) + grade_sample_run_complete = False + while not grade_sample_run_complete: + try: + response, model_name = get_chat_response(gpt_query_prompt) + grade_sample_run_complete = True + except Exception as e: + eval_logger.info(f"Error in response: {e}") + eval_logger.info(f"Retrying...") + + try: + score = int(re.findall(r"Score:\s*(\d)", response)[0]) + except IndexError: + score = 0 # Assign score 0 if the score wasn't parsed correctly + + return { + "gpt_eval_info": {"question_id": doc["question_id"], "prediction": pred, "ground_truth": answer, "eval_model": model_name, "prompt": gpt_query_prompt, "response": response}, + "gpt_eval_avg_score": { + "score": score, + }, + "gpt_eval_score2_rate": { + "score": score, + }, + } + + +def d170_en_aggregate_info(results, args): + path = generate_submission_file("dc170_en_eval_info.json", args) + with open(path, "w") as f: + json.dump(results, f) + eval_logger.info(f"Results saved to {path}.") + + +def d170_en_aggregate_avg_score(results): + total_score = 0 + for result in results: + total_score += result["score"] + avg_score = total_score / len(results) + return avg_score + + +def d170_en_aggregate_score2_rate(results): + score2_count = 0 + for result in results: + if result["score"] == 2: + score2_count += 1 + score2_rate = score2_count / len(results) + return score2_rate diff --git a/lmms_eval/tasks/internal_eval/dc100_en.yaml b/lmms_eval/tasks/internal_eval/dc100_en.yaml new file mode 100755 index 000000000..729f323dd --- /dev/null +++ b/lmms_eval/tasks/internal_eval/dc100_en.yaml @@ -0,0 +1,29 @@ +dataset_path: lmms-lab/DC100_EN +dataset_kwargs: + token: True +task: "dc100_en" +test_split: test +output_type: generate_until +doc_to_visual: !function dc100_en_utils.doc_to_visual +doc_to_text: !function utils.doc_to_text # Such that {{prompt}} will be replaced by doc["question"] +doc_to_target: "answer" +generation_kwargs: + until: + - "ASSISTANT:" + max_new_tokens: 1024 + temperature: 0 + top_p: 0 + num_beams: 1 + do_sample: false +process_results: !function dc100_en_utils.process_results # apply gpt eval here +metric_list: + - metric: gpt_eval_info + aggregation: !function dc100_en_utils.dc100_en_aggregate_info + higher_is_better: false + - metric: gpt_eval_avg_score + aggregation: !function dc100_en_utils.dc100_en_aggregate_avg_score + higher_is_better: true +metadata: + version: 0.0 + gpt_eval_model_name: "gpt-4-vision-preview" +include: _default_template_internal_eval_yaml \ No newline at end of file diff --git a/lmms_eval/tasks/internal_eval/dc100_en_utils.py b/lmms_eval/tasks/internal_eval/dc100_en_utils.py new file mode 100755 index 000000000..5e2b2a33a --- /dev/null +++ b/lmms_eval/tasks/internal_eval/dc100_en_utils.py @@ -0,0 +1,125 @@ +import base64 +import requests +import re +import logging +import time +import os +import yaml +import json +from pathlib import Path +from io import BytesIO + +from lmms_eval.tasks._task_utils.file_utils import generate_submission_file + + +def doc_to_visual(doc): + if doc["image"] is None: + return [] + return [doc["image"].convert("RGB")] + + +eval_logger = logging.getLogger("lmms-eval") + +# Assuming the config is loaded similarly as in d170_en/utils.py +with open(Path(__file__).parent / "dc100_en.yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + if "!function" not in line: + safe_data.append(line) + config = yaml.safe_load("".join(safe_data)) + +API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") +API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") +GPT_EVAL_MODEL_NAME = config["metadata"]["gpt_eval_model_name"] + +EVALUATION_PROMPT_TEMPLATE_SIMPLE_V1 = """Text Caption: {caption} +From 0 to 100, how much do you rate for this Text Caption in terms of the correct and comprehensive description of the image? +Do not dominant the rating by a single attribute such as recognition correctness, but a overall rating on the object/scene appearance, position, pose, action, shape, etc., and contents in the background. +Do not consider the appropriateness or sensitive descriptors, such as "middle-aged western man", judge based on if it has correct specifications of the object and scenes in image. +Provide a few lines for explanation and the rate number at last after "Final Score:".""" + + +def get_chat_response(base64_image, prompt, max_retries=5, wait_time=10): + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } + + payload = { + "model": GPT_EVAL_MODEL_NAME, + "messages": [ + { + "role": "user", + "content": [ + {"type": "text", "text": prompt}, + { + "type": "image_url", + "image_url": f"data:image/jpeg;base64,{base64_image}", + }, + ], + } + ], + "max_tokens": 1024, + "temperature": 0.0, + } + + for attempt in range(max_retries): + try: + response = requests.post(API_URL, headers=headers, json=payload, timeout=60) + response.raise_for_status() + response_data = response.json() + return response_data["choices"][0]["message"]["content"] + except requests.exceptions.RequestException as e: + eval_logger.warning(f"Request failed on attempt {attempt+1}: {e}") + time.sleep(wait_time) + if attempt == max_retries - 1: + eval_logger.error(f"Failed to get response after {max_retries} attempts") + return "" + except Exception as e: + eval_logger.error(f"Error on attempt {attempt+1}: {e}") + return "" + + +def image_to_base64(pil_image): + buffered = BytesIO() + pil_image.save(buffered, format="PNG") + return base64.b64encode(buffered.getvalue()).decode("utf-8") + + +def process_results(doc, results): + prediction = results[0] + question_id = doc["question_id"] + image_path = doc["image"] + base64_image = image_to_base64(image_path) + prompt = EVALUATION_PROMPT_TEMPLATE_SIMPLE_V1.format(caption=prediction) + try: + response = get_chat_response(base64_image, prompt) + score_value = re.search(r"Final Score: (\d+)", response) + score = int(score_value.group(1)) if score_value else 0 + except Exception as e: + eval_logger.error(f"Error for Question ID: {question_id}: {e}") + response = "" + score = 0 + + return { + "gpt_eval_info": {"question_id": question_id, "question": doc["question"], "model_caption": prediction, "explanation": response, "eval_model": GPT_EVAL_MODEL_NAME, "score": score, "prompt": prompt}, + "gpt_eval_avg_score": { + "score": score, + }, + } + + +def dc100_en_aggregate_info(results, args): + path = generate_submission_file("dc100_en_eval_info.json", args) + with open(path, "w") as f: + json.dump(results, f) + eval_logger.info(f"Results saved to {path}.") + + +def dc100_en_aggregate_avg_score(results): + total_score = 0 + for result in results: + total_score += result["score"] + avg_score = total_score / len(results) + return avg_score diff --git a/lmms_eval/tasks/internal_eval/dc200_cn.yaml b/lmms_eval/tasks/internal_eval/dc200_cn.yaml new file mode 100755 index 000000000..37a888c8d --- /dev/null +++ b/lmms_eval/tasks/internal_eval/dc200_cn.yaml @@ -0,0 +1,29 @@ +dataset_path: lmms-lab/DC200_CN +dataset_kwargs: + token: True +task: "dc200_cn" +test_split: test +output_type: generate_until +doc_to_visual: !function dc200_cn_utils.doc_to_visual +doc_to_text: !function utils.doc_to_text # Such that {{prompt}} will be replaced by doc["question"] +doc_to_target: "answer" +generation_kwargs: + until: + - "ASSISTANT:" + max_new_tokens: 1024 + temperature: 0 + top_p: 0 + num_beams: 1 + do_sample: false +process_results: !function dc200_cn_utils.process_results # apply gpt eval here +metric_list: + - metric: gpt_eval_info + aggregation: !function dc200_cn_utils.dc200_cn_aggregate_info + higher_is_better: false + - metric: gpt_eval_avg_score + aggregation: !function dc200_cn_utils.dc200_cn_aggregate_avg_score + higher_is_better: true +metadata: + version: 0.0 + gpt_eval_model_name: "gpt-4-vision-preview" +include: _default_template_internal_eval_yaml \ No newline at end of file diff --git a/lmms_eval/tasks/internal_eval/dc200_cn_utils.py b/lmms_eval/tasks/internal_eval/dc200_cn_utils.py new file mode 100755 index 000000000..f5d7e87de --- /dev/null +++ b/lmms_eval/tasks/internal_eval/dc200_cn_utils.py @@ -0,0 +1,130 @@ +import base64 +import requests +import re +import logging +import os +import yaml +import json +from pathlib import Path +from io import BytesIO +import time + +from lmms_eval.tasks._task_utils.file_utils import generate_submission_file + + +def doc_to_visual(doc): + if doc["image"] is None: + return [] + return [doc["image"].convert("RGB")] + + +eval_logger = logging.getLogger("lmms-eval") + +# Assuming the config is loaded similarly as in d170_en/utils.py +with open(Path(__file__).parent / "dc200_cn.yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + if "!function" not in line: + safe_data.append(line) + config = yaml.safe_load("".join(safe_data)) + +API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") +API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") +GPT_EVAL_MODEL_NAME = config["metadata"]["gpt_eval_model_name"] + +EVALUATION_PROMPT_TEMPLATE_SIMPLE_V1 = """Text Caption: {caption} +From 0 to 100, how much do you rate for this Text Caption in terms of the correct and comprehensive description of the image? +Do not dominant the rating by a single attribute such as recognition correctness, but a overall rating on the object/scene appearance, position, pose, action, shape, etc., and contents in the background. +Do not consider the appropriateness or sensitive descriptors, such as "middle-aged western man", judge based on if it has correct specifications of the object and scenes in image. +Provide a few lines for explanation and the rate number at last after "Final Score:".""" + + +def get_chat_response(base64_image, prompt, max_retries=5, wait_time=10): + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } + + payload = { + "model": GPT_EVAL_MODEL_NAME, + "messages": [ + { + "role": "user", + "content": [ + {"type": "text", "text": prompt}, + { + "type": "image_url", + "image_url": f"data:image/jpeg;base64,{base64_image}", + }, + ], + } + ], + "max_tokens": 1024, + "temperature": 0.0, + } + + for attempt in range(max_retries): + try: + response = requests.post( + API_URL, + headers=headers, + json=payload, + timeout=60, + ) + response.raise_for_status() + response_data = response.json() + return response_data["choices"][0]["message"]["content"] + except requests.exceptions.RequestException as e: + eval_logger.warning(f"Request failed on attempt {attempt+1}: {e}") + time.sleep(wait_time) + if attempt == max_retries - 1: + eval_logger.error(f"Failed to get response after {max_retries} attempts") + return "" + except Exception as e: + eval_logger.error(f"Error on attempt {attempt+1}: {e}") + return "" + + +def image_to_base64(pil_image): + buffered = BytesIO() + pil_image.save(buffered, format="PNG") + return base64.b64encode(buffered.getvalue()).decode("utf-8") + + +def process_results(doc, results): + prediction = results[0] + question_id = doc["question_id"] + image_path = doc["image"] + base64_image = image_to_base64(image_path) + prompt = EVALUATION_PROMPT_TEMPLATE_SIMPLE_V1.format(caption=prediction) + try: + response = get_chat_response(base64_image, prompt) + score_value = re.search(r"Final Score: (\d+)", response) + score = int(score_value.group(1)) if score_value else 0 + except Exception as e: + eval_logger.error(f"After retrying, still error for Question ID: {question_id}: {e}") + score = 0 + response = "Failed to get GPT4 eval response." + + return { + "gpt_eval_info": {"question_id": question_id, "question": doc["question"], "model_caption": prediction, "explanation": response, "eval_model": GPT_EVAL_MODEL_NAME, "score": score, "prompt": prompt}, + "gpt_eval_avg_score": { + "score": score, + }, + } + + +def dc200_cn_aggregate_info(results, args): + path = generate_submission_file("dc200_cn_eval_info.json", args) + with open(path, "w") as f: + json.dump(results, f) + eval_logger.info(f"Results saved to {path}.") + + +def dc200_cn_aggregate_avg_score(results): + total_score = 0 + for result in results: + total_score += result["score"] + avg_score = total_score / len(results) + return avg_score diff --git a/lmms_eval/tasks/internal_eval/internal_eval.yaml b/lmms_eval/tasks/internal_eval/internal_eval.yaml new file mode 100755 index 000000000..d642e05bc --- /dev/null +++ b/lmms_eval/tasks/internal_eval/internal_eval.yaml @@ -0,0 +1,6 @@ +group: internal_eval +task: +- d170_cn +- d170_en +- dc100_en +- dc200_cn diff --git a/lmms_eval/tasks/internal_eval/utils.py b/lmms_eval/tasks/internal_eval/utils.py new file mode 100755 index 000000000..aab8ab3c4 --- /dev/null +++ b/lmms_eval/tasks/internal_eval/utils.py @@ -0,0 +1,7 @@ +def doc_to_text(doc, model_specific_prompt_kwargs=None): + if model_specific_prompt_kwargs is None: + return doc["question"] + question = doc["question"] + pre_prompt = model_specific_prompt_kwargs.get("pre_prompt", "") + post_prompt = model_specific_prompt_kwargs.get("post_prompt", "") + return f"{pre_prompt}{question}{post_prompt}" diff --git a/lmms_eval/tasks/llava_wilder/_default_template_wilder_yaml b/lmms_eval/tasks/llava_wilder/_default_template_wilder_yaml index ba90cda86..00409be0b 100644 --- a/lmms_eval/tasks/llava_wilder/_default_template_wilder_yaml +++ b/lmms_eval/tasks/llava_wilder/_default_template_wilder_yaml @@ -6,7 +6,7 @@ generation_kwargs: until: - "ASSISTANT:" image_aspect_ratio: original - max_new_tokens: 1024 + max_new_tokens: 4096 temperature: 0 top_p: 0 num_beams: 1 diff --git a/lmms_eval/tasks/llava_wilder/llava_wilder_full.yaml b/lmms_eval/tasks/llava_wilder/llava_wilder_full.yaml index c5d1379a5..65627d039 100755 --- a/lmms_eval/tasks/llava_wilder/llava_wilder_full.yaml +++ b/lmms_eval/tasks/llava_wilder/llava_wilder_full.yaml @@ -8,4 +8,7 @@ model_specific_prompt_kwargs: default: pre_prompt: "" post_prompt: "" + xcomposer2_4khd: + pre_prompt: "[UNUSED_TOKEN_146]user\nQuestion: " + post_prompt: "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n" include: _default_template_wilder_yaml \ No newline at end of file diff --git a/lmms_eval/tasks/llava_wilder/llava_wilder_medium.yaml b/lmms_eval/tasks/llava_wilder/llava_wilder_medium.yaml index 7fadd66cd..90f7bcc22 100644 --- a/lmms_eval/tasks/llava_wilder/llava_wilder_medium.yaml +++ b/lmms_eval/tasks/llava_wilder/llava_wilder_medium.yaml @@ -8,4 +8,7 @@ model_specific_prompt_kwargs: default: pre_prompt: "" post_prompt: "" + xcomposer2_4khd: + pre_prompt: "[UNUSED_TOKEN_146]user\nQuestion: " + post_prompt: "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n" include: _default_template_wilder_yaml \ No newline at end of file diff --git a/lmms_eval/tasks/llava_wilder/llava_wilder_small.yaml b/lmms_eval/tasks/llava_wilder/llava_wilder_small.yaml index d6f726c2c..aa947903c 100644 --- a/lmms_eval/tasks/llava_wilder/llava_wilder_small.yaml +++ b/lmms_eval/tasks/llava_wilder/llava_wilder_small.yaml @@ -8,4 +8,7 @@ model_specific_prompt_kwargs: default: pre_prompt: "" post_prompt: "" + xcomposer2_4khd: + pre_prompt: "[UNUSED_TOKEN_146]user\nQuestion: " + post_prompt: "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n" include: _default_template_wilder_yaml \ No newline at end of file diff --git a/lmms_eval/tasks/realworldqa/realworldqa.yaml b/lmms_eval/tasks/realworldqa/realworldqa.yaml index 9d7dfcb39..830840e5f 100644 --- a/lmms_eval/tasks/realworldqa/realworldqa.yaml +++ b/lmms_eval/tasks/realworldqa/realworldqa.yaml @@ -38,5 +38,8 @@ model_specific_prompt_kwargs: gpt4v: pre_prompt: "" post_prompt: "" + xcomposer2_4khd: + pre_prompt: "[UNUSED_TOKEN_146]user\nQuestion: " + post_prompt: "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\nThe answer is" metadata: - version: 0.0 From 910015e5b2f7813927d74f4f1e62e5b6c9d7e7d8 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Sat, 20 Apr 2024 13:48:38 +0000 Subject: [PATCH 006/181] Import sympy package and handle ImportError in OlympiadBenchEvaluator --- lmms_eval/tasks/olympiadbench/olympiadbench_evals.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lmms_eval/tasks/olympiadbench/olympiadbench_evals.py b/lmms_eval/tasks/olympiadbench/olympiadbench_evals.py index 709ee9885..9296e5bd0 100644 --- a/lmms_eval/tasks/olympiadbench/olympiadbench_evals.py +++ b/lmms_eval/tasks/olympiadbench/olympiadbench_evals.py @@ -1,7 +1,11 @@ import re import sympy as sp -from sympy import simplify, Eq, sympify, Pow -from sympy.parsing.latex import parse_latex + +try: + from sympy import simplify, Eq, sympify, Pow + from sympy.parsing.latex import parse_latex +except ImportError as e: + print("Please install sympy package by running 'pip install sympy' if you want to use OlympiadBenchEvaluator.") import math # how to use From 3cea658170c87660337630da890c569b5871a194 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Sun, 21 Apr 2024 09:09:33 +0000 Subject: [PATCH 007/181] Add shot examples and update create_one_query function --- lmms_eval/tasks/mathvista/mathvista_evals.py | 102 +++++++++++++++++- .../tasks/mathvista/mathvista_testmini.yaml | 5 +- lmms_eval/tasks/mathvista/utils.py | 13 ++- 3 files changed, 117 insertions(+), 3 deletions(-) diff --git a/lmms_eval/tasks/mathvista/mathvista_evals.py b/lmms_eval/tasks/mathvista/mathvista_evals.py index 8fcf120ee..90d367ec2 100755 --- a/lmms_eval/tasks/mathvista/mathvista_evals.py +++ b/lmms_eval/tasks/mathvista/mathvista_evals.py @@ -5,6 +5,106 @@ import logging eval_logger = logging.getLogger("lmms-eval") + +# pids: 799, 681, 615 +shot_examples = [ + { + "question": "How much money does Ruth need to buy a baking dish, a casserole dish, and an ice cream scoop? (Unit: $)", + "caption": "The image shows a table with a variety of items on it, including a baking dish, ice cream scoop, casserole dish, and rolling pin. The text in the image says:\n\n```\nbaking dish\n$4.00\nice cream scoop\n$6.00\ncasserole dish\n$3.00\nrolling pin\n$4.00\n```", + "ocr": "[([5, 3], 'baking dish'), ([177, 5], '$4.00'), ([7, 41], 'ice cream scoop'), ([177, 37], '$6.00'), ([9, 69], 'casserole dish'), ([177, 69], '$3.00'), ([5, 98], 'rolling pin'), ([177, 101], '$4.00')]", + "solution": """ +Find the total cost of a baking dish, a casserole dish, and an ice cream scoop.\n\n$4.00 + $3.00 + $6.00 = $13.00\n\nRuth needs $13.00. +""", + "code": """ +baking_dish_price = 4.00 +casserole_dish_price = 3.00 +ice_cream_scoop_price = 6.00 + +ans = baking_dish_price + casserole_dish_price + ice_cream_scoop_price +print(ans) +""", + }, + { + "question": "What is the largest city in the nation where this plane is headquartered?", + "choices": ["hong kong", "osaka", "shanghai", "tokyo"], + "caption": 'The image shows a large passenger jet parked on a tarmac at an airport. The jet is white with red trim and has a red tail. It is sitting on top of a tarmac next to a building. The jet is being loaded with passengers and cargo. The text on the image says "Japan. Endless Discovery".', + "solution": """ +The caption mentions that the text on the image says "Japan. Endless Discovery". This indicates that the plane is headquartered in Japan. + +Among the Japanese cities, Tokyo is the largest city. + +Thus, the answer is D (tokyo). +""", + "code": """ +def largest_city(caption, choices): + countries_largest_cities = { + 'Japan': 'tokyo', + 'China': 'shanghai' + } + + if "Japan" in caption: + country = 'Japan' + elif "China" in caption: + country = 'China' + + for choice in choices: + if choice == countries_largest_cities[country]: + return choice + return "" + +choices = ['hong kong', 'osaka', 'shanghai', 'tokyo'] +caption = "The image shows a large passenger jet parked on a tarmac at an airport. The jet is white with red trim and has a red tail. It is sitting on top of a tarmac next to a building. The jet is being loaded with passengers and cargo. The text on the image says 'Japan. Endless Discovery'." + +print(largest_city(caption, choices)) +""", + }, + { + "question": "If two sides of a triangle measure 12 and 7, which of the following cannot be the perimeter of the triangle?", + "choices": ["29", "34", "37", "38"], + "caption": "The image shows a triangle with two sides labeled 7 and 12. The triangle is drawn on a white background. There is no text other than the labels.", + "ocr": "[([70, 74], '7'), ([324, 74], '12')]", + "solution": """ +To determine which of the given perimeters cannot be possible for the triangle, we apply the triangle inequality theorem. The sum of any two sides of a triangle must be greater than the third side. + +For the maximum possible value of the third side: +12 + 7 = 19 + +The minimum possible value for the third side: +12 - 7 = 5 + +The third side for each option: +(A) 29 - 12 - 7 = 10 (valid) +(B) 34 - 12 - 7 = 15 (valid) +(C) 37 - 12 - 7 = 18 (valid) +(D) 38 - 12 - 7 = 19 (invalid because it should be less than 19) + +Thus, the answer is D. +""", + "code": """ +def is_valid_triangle(a, b, perimeter): + # Given a and b, find the third side + third_side = perimeter - a - b + + # Check triangle inequality + if (a + b > third_side) and (a + third_side > b) and (b + third_side > a): + return True + return False + +# Given sides +a = 12 +b = 7 + +# Given perimeters +perimeters = [29, 34, 37, 38] + +# Check which perimeter is not valid +for p in perimeters: + if not is_valid_triangle(a, b, p): + print(p) +""", + }, +] + DEMO_PROMPT = """ Please read the following example. Then extract the answer from the model response and type it at the end of the prompt. @@ -243,7 +343,7 @@ def get_acc_with_contion(self, res_pd, key, value): acc = "{:.2f}".format(len(correct_pd) / len(total_pd) * 100) if len(total_pd) > 0 else "0.00" return len(correct_pd), len(total_pd), acc - def create_one_query(self, problem, shot_type, examples=None, shot_num=0, use_caption=False, use_ocr=False): + def create_one_query(self, problem, shot_type, examples=shot_examples, shot_num=0, use_caption=False, use_ocr=False): ### [1] Demo prompt if shot_num == 0: demo_prompt = "" diff --git a/lmms_eval/tasks/mathvista/mathvista_testmini.yaml b/lmms_eval/tasks/mathvista/mathvista_testmini.yaml index cb4b7a8b3..e90929b40 100755 --- a/lmms_eval/tasks/mathvista/mathvista_testmini.yaml +++ b/lmms_eval/tasks/mathvista/mathvista_testmini.yaml @@ -23,7 +23,10 @@ metric_list: model_specific_prompt_kwargs: default: - shot_type: "format-prompt" # can be "reason-first", "solution", "step-by-step" + shot_type: "solution" # can be "reason-first", "solution", "step-by-step" + shot: 2 + use_caption: True + use_ocr: False model_specific_generation_kwargs: llava: image_aspect_ratio: original \ No newline at end of file diff --git a/lmms_eval/tasks/mathvista/utils.py b/lmms_eval/tasks/mathvista/utils.py index 620e3f281..201be701d 100755 --- a/lmms_eval/tasks/mathvista/utils.py +++ b/lmms_eval/tasks/mathvista/utils.py @@ -38,7 +38,18 @@ def mathvista_doc_to_text(doc, model_specific_prompt_kwargs=None): "answer": doc["answer"] if "answer" in doc else None, "precision": doc["precision"] if "precision" in doc else 0, } - query_prompt = mathvista_evaluator.create_one_query(problem, examples=None, shot_num=0, shot_type=model_specific_prompt_kwargs["shot_type"]) + query_prompt = mathvista_evaluator.create_one_query( + problem, + shot_num=model_specific_prompt_kwargs["shot"], + shot_type=model_specific_prompt_kwargs["shot_type"], + use_caption=model_specific_prompt_kwargs["use_caption"], + use_ocr=model_specific_prompt_kwargs["use_ocr"], + use_choices=model_specific_prompt_kwargs["use_choices"], + use_unit=model_specific_prompt_kwargs["use_unit"], + use_question=model_specific_prompt_kwargs["use_question"], + use_answer=model_specific_prompt_kwargs["use_answer"], + use_ocr=model_specific_prompt_kwargs["use_ocr"], + ) return query_prompt From ba2fd6d76f9177b44cb5ac9bb7168774d28b7bb2 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Sun, 21 Apr 2024 09:16:55 +0000 Subject: [PATCH 008/181] Remove redundant code in mathvista_doc_to_text function --- lmms_eval/tasks/mathvista/utils.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lmms_eval/tasks/mathvista/utils.py b/lmms_eval/tasks/mathvista/utils.py index 201be701d..3bbe96a9f 100755 --- a/lmms_eval/tasks/mathvista/utils.py +++ b/lmms_eval/tasks/mathvista/utils.py @@ -44,11 +44,6 @@ def mathvista_doc_to_text(doc, model_specific_prompt_kwargs=None): shot_type=model_specific_prompt_kwargs["shot_type"], use_caption=model_specific_prompt_kwargs["use_caption"], use_ocr=model_specific_prompt_kwargs["use_ocr"], - use_choices=model_specific_prompt_kwargs["use_choices"], - use_unit=model_specific_prompt_kwargs["use_unit"], - use_question=model_specific_prompt_kwargs["use_question"], - use_answer=model_specific_prompt_kwargs["use_answer"], - use_ocr=model_specific_prompt_kwargs["use_ocr"], ) return query_prompt From 21fe64aa8de0322053ae0319ba9df194bc6b098b Mon Sep 17 00:00:00 2001 From: Bo Li Date: Sun, 21 Apr 2024 09:18:57 +0000 Subject: [PATCH 009/181] Fix error loading OlympiadBenchEvaluator from cn_utils and en_utils --- lmms_eval/tasks/olympiadbench/cn_utils.py | 6 +++++- lmms_eval/tasks/olympiadbench/en_utils.py | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lmms_eval/tasks/olympiadbench/cn_utils.py b/lmms_eval/tasks/olympiadbench/cn_utils.py index 628d51da1..6f4b01576 100644 --- a/lmms_eval/tasks/olympiadbench/cn_utils.py +++ b/lmms_eval/tasks/olympiadbench/cn_utils.py @@ -9,7 +9,11 @@ eval_logger = logging.getLogger("lmms-eval") dir_name = os.path.dirname(os.path.abspath(__file__)) -olympiadbench_evaluator = OlympiadBenchEvaluator() +try: + olympiadbench_evaluator = OlympiadBenchEvaluator() +except: + print(f"Error loading OlympiadBenchEvaluator from {dir_name}") + pass def olympiadbench_doc_to_visual(doc): diff --git a/lmms_eval/tasks/olympiadbench/en_utils.py b/lmms_eval/tasks/olympiadbench/en_utils.py index 4b165e385..1778c541e 100644 --- a/lmms_eval/tasks/olympiadbench/en_utils.py +++ b/lmms_eval/tasks/olympiadbench/en_utils.py @@ -9,7 +9,11 @@ eval_logger = logging.getLogger("lmms-eval") dir_name = os.path.dirname(os.path.abspath(__file__)) -olympiadbench_evaluator = OlympiadBenchEvaluator() +try: + olympiadbench_evaluator = OlympiadBenchEvaluator() +except: + print(f"Error loading OlympiadBenchEvaluator from {dir_name}") + pass def olympiadbench_doc_to_visual(doc): From 415370320fe7a9ff92a942020bf6f9c67dec4d45 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Sun, 21 Apr 2024 09:36:11 +0000 Subject: [PATCH 010/181] Update mathvista_testmini.yaml configuration --- lmms_eval/tasks/mathvista/mathvista_testmini.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lmms_eval/tasks/mathvista/mathvista_testmini.yaml b/lmms_eval/tasks/mathvista/mathvista_testmini.yaml index e90929b40..946e7778c 100755 --- a/lmms_eval/tasks/mathvista/mathvista_testmini.yaml +++ b/lmms_eval/tasks/mathvista/mathvista_testmini.yaml @@ -24,8 +24,8 @@ metric_list: model_specific_prompt_kwargs: default: shot_type: "solution" # can be "reason-first", "solution", "step-by-step" - shot: 2 - use_caption: True + shot: 0 + use_caption: False use_ocr: False model_specific_generation_kwargs: llava: From 1f7e419433fdae339b9bffdc1cf44035d88f575f Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 22 Apr 2024 11:19:25 +0000 Subject: [PATCH 011/181] Add auto strip for all task --- lmms_eval/api/task.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index 4465bb21a..8a506048d 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -996,8 +996,8 @@ def construct_requests(self, doc_id: int, ctx: str, **kwargs) -> Union[List[Inst return Instance(request_type=self.OUTPUT_TYPE, arguments=arguments, idx=0, **kwargs) def process_results(self, doc, results): - # if self.OUTPUT_TYPE == "generate_until": - # results[0] = results[0].strip() + if self.OUTPUT_TYPE == "generate_until": + results[0] = results[0].strip() if callable(self.config.process_results): return self.config.process_results(doc, results) From d3febcf9291ef09949ffbac92a93b5edef912f11 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Tue, 23 Apr 2024 02:29:21 +0000 Subject: [PATCH 012/181] Fix whitespace issue in process_results method --- lmms_eval/api/task.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index 4465bb21a..942bd36b1 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -996,8 +996,9 @@ def construct_requests(self, doc_id: int, ctx: str, **kwargs) -> Union[List[Inst return Instance(request_type=self.OUTPUT_TYPE, arguments=arguments, idx=0, **kwargs) def process_results(self, doc, results): - # if self.OUTPUT_TYPE == "generate_until": - # results[0] = results[0].strip() + if self.OUTPUT_TYPE == "generate_until": + results[0] = results[0].strip() + if callable(self.config.process_results): return self.config.process_results(doc, results) From ea063fcf8c9de83633e7e0ab6962137f3c7444db Mon Sep 17 00:00:00 2001 From: Bo Li Date: Wed, 24 Apr 2024 08:28:41 +0000 Subject: [PATCH 013/181] Add SimpleMultiChoiceRegexFilter class for AI2D/RealworldQA dataset --- lmms_eval/filters/extraction.py | 64 +++++++++++++++++++ lmms_eval/tasks/ai2d/ai2d.yaml | 12 +++- lmms_eval/tasks/ai2d/utils.py | 3 + .../tasks/mathvista/mathvista_testmini.yaml | 2 +- lmms_eval/tasks/mmvet/mmvet.yaml | 4 +- lmms_eval/tasks/olympiadbench/cn_utils.py | 1 - lmms_eval/tasks/olympiadbench/en_utils.py | 1 - lmms_eval/tasks/realworldqa/realworldqa.yaml | 1 + 8 files changed, 82 insertions(+), 6 deletions(-) diff --git a/lmms_eval/filters/extraction.py b/lmms_eval/filters/extraction.py index 329d75409..f3045673b 100755 --- a/lmms_eval/filters/extraction.py +++ b/lmms_eval/filters/extraction.py @@ -212,3 +212,67 @@ def find_match(self, regex, resp, convert_dict={}): if match and match in convert_dict: match = convert_dict[match] return match + + +# Designed for the AI2D/RealworldQA dataset +class SimpleMultiChoiceRegexFilter(ExtendedRegexFilter): + def __init__(self, *args, **kwargs): + """ + regex_pattern: The basic regex pattern to use. If fails to match, we will use the customized match procedure + - step 1 : We parse the choices between ([A-Z])s then try to find these choices in the response. + - step 2 : We parse the choice with regex :[\s]*([A-?]), where ? varies by number of choices. + group_select: Selects the (group_select)th match from the findall result. + ignore_case: Ignores the case during step 1 matching + ignore_punctuation: Remove the punctuation during step 1 matching + regexes_to_ignore: Remove these regexes during step 1 matching + """ + super().__init__(*args, **kwargs) + + def apply(self, resps, docs): + # here, we assume we have a list, in which each element is + # a list of model responses for some particular input/target pair. + # so we process each of these (same input/target response sets) + # independently (and keep them a list.) + + filtered_resps = [] + + for r, doc in zip(resps, docs): + fallback_regexes = [] + choice_to_alpha = {} + next_alpha = "A" + + without_paren_fallback_regexes = [] + without_paren_to_target = {} + + # Regex to extract multiple choice options from the question + multiple_choices_regex = re.compile(r"\b([A-Z])\.\s+([^\n]*)") + matches = multiple_choices_regex.findall(doc["question"]) + + # Build regex patterns and mappings for each choice + for m in matches: + choice_text = m[1].strip() + fallback_regexes.append(f"{re.escape(choice_text)}") + choice_to_alpha[choice_text] = next_alpha + + next_alpha = chr(ord(next_alpha) + 1) + + # Compile regex to match any of the extracted choices + fallback_regex = re.compile("|".join(fallback_regexes)) + + # Process each response + filtered = [] + for resp in r: + # Remove any punctuation and extra spaces + cleaned_resp = re.sub(r"[^\w\s]", "", resp).strip() + # Try to match cleaned response with the choice text + match = fallback_regex.search(cleaned_resp) + if match and match.group() in choice_to_alpha: + # Map the matched choice text back to its corresponding letter + filtered.append(choice_to_alpha[match.group()]) + else: + # If no match, return the cleaned response + filtered.append(cleaned_resp) + + filtered_resps.append(filtered[0]) + + return filtered_resps diff --git a/lmms_eval/tasks/ai2d/ai2d.yaml b/lmms_eval/tasks/ai2d/ai2d.yaml index 7848c6cba..58ae6c796 100755 --- a/lmms_eval/tasks/ai2d/ai2d.yaml +++ b/lmms_eval/tasks/ai2d/ai2d.yaml @@ -7,19 +7,29 @@ output_type: generate_until doc_to_visual: !function utils.ai2d_doc_to_visual doc_to_text: !function utils.ai2d_doc_to_text doc_to_target: !function utils.ai2d_doc_to_target + generation_kwargs: max_new_tokens: 16 temperature: 0 do_sample: False + metric_list: - metric: exact_match aggregation: mean higher_is_better: true ignore_case: true ignore_punctuation: true + +# filter_list: +# - name: flexible-extract +# filter: +# - function: !function utils.SimpleMultiChoiceRegexFilter +# group_select: 0 +# regex_pattern: "(\\([A-Z]\\))" + metadata: - version: 0.0 - + model_specific_prompt_kwargs: default: prompt_format: mcq diff --git a/lmms_eval/tasks/ai2d/utils.py b/lmms_eval/tasks/ai2d/utils.py index ace9a68e2..04a2cd93a 100755 --- a/lmms_eval/tasks/ai2d/utils.py +++ b/lmms_eval/tasks/ai2d/utils.py @@ -1,3 +1,6 @@ +from lmms_eval.filters.extraction import SimpleMultiChoiceRegexFilter + + def ai2d_doc_to_text(doc, model_specific_prompt_kwargs=None): question, choices = doc["question"], doc["options"] len_choices = len(choices) diff --git a/lmms_eval/tasks/mathvista/mathvista_testmini.yaml b/lmms_eval/tasks/mathvista/mathvista_testmini.yaml index 946e7778c..5efd86cef 100755 --- a/lmms_eval/tasks/mathvista/mathvista_testmini.yaml +++ b/lmms_eval/tasks/mathvista/mathvista_testmini.yaml @@ -23,7 +23,7 @@ metric_list: model_specific_prompt_kwargs: default: - shot_type: "solution" # can be "reason-first", "solution", "step-by-step" + shot_type: "format-prompt" # can be "reason-first", "solution", "step-by-step" shot: 0 use_caption: False use_ocr: False diff --git a/lmms_eval/tasks/mmvet/mmvet.yaml b/lmms_eval/tasks/mmvet/mmvet.yaml index c29c873cd..0e01afb34 100755 --- a/lmms_eval/tasks/mmvet/mmvet.yaml +++ b/lmms_eval/tasks/mmvet/mmvet.yaml @@ -22,8 +22,8 @@ metric_list: higher_is_better: true metadata: version: 0.0 - gpt_eval_model_name: "gpt-4" + gpt_eval_model_name: "gpt-4-0613" model_specific_prompt_kwargs: default: - pre_prompt: "" + pre_prompt: "Please think step by step and try to provide best answer to the following question: \n\n" post_prompt: "" diff --git a/lmms_eval/tasks/olympiadbench/cn_utils.py b/lmms_eval/tasks/olympiadbench/cn_utils.py index 6f4b01576..794113857 100644 --- a/lmms_eval/tasks/olympiadbench/cn_utils.py +++ b/lmms_eval/tasks/olympiadbench/cn_utils.py @@ -12,7 +12,6 @@ try: olympiadbench_evaluator = OlympiadBenchEvaluator() except: - print(f"Error loading OlympiadBenchEvaluator from {dir_name}") pass diff --git a/lmms_eval/tasks/olympiadbench/en_utils.py b/lmms_eval/tasks/olympiadbench/en_utils.py index 1778c541e..c4191cdd6 100644 --- a/lmms_eval/tasks/olympiadbench/en_utils.py +++ b/lmms_eval/tasks/olympiadbench/en_utils.py @@ -12,7 +12,6 @@ try: olympiadbench_evaluator = OlympiadBenchEvaluator() except: - print(f"Error loading OlympiadBenchEvaluator from {dir_name}") pass diff --git a/lmms_eval/tasks/realworldqa/realworldqa.yaml b/lmms_eval/tasks/realworldqa/realworldqa.yaml index 830840e5f..adb89be0e 100644 --- a/lmms_eval/tasks/realworldqa/realworldqa.yaml +++ b/lmms_eval/tasks/realworldqa/realworldqa.yaml @@ -18,6 +18,7 @@ generation_kwargs: filter_list: - name: "flexible-extract" filter: + - function: !function utils.NumberWordsToDigitsFilter - function: !function utils.MultiChoiceRegexFilter group_select: 0 ignore_case: true From 8159d569e3a02c41694b8b7bb24e4b9284e336b5 Mon Sep 17 00:00:00 2001 From: Kaichen Zhang - NTU Date: Fri, 26 Apr 2024 14:47:28 +0800 Subject: [PATCH 014/181] [Merge] git checkout --patch sglang form public (#80) * Merge llava sglang from external * Merge public main sglang * Keep image in rolling --- lmms_eval/evaluator.py | 2 +- lmms_eval/models/__init__.py | 3 +- lmms_eval/models/llava_sglang.py | 164 +++++++++++++++++++++++++++++++ 3 files changed, 167 insertions(+), 2 deletions(-) create mode 100644 lmms_eval/models/llava_sglang.py diff --git a/lmms_eval/evaluator.py b/lmms_eval/evaluator.py index bad5b139e..d4e6370db 100755 --- a/lmms_eval/evaluator.py +++ b/lmms_eval/evaluator.py @@ -318,7 +318,7 @@ def evaluate( # hack: remove image columns to speed avoid loading images and speed up postprocessing # reason: doc_iterator will actually load image if it's in the doc. docs = task.test_docs() if task.has_test_docs() else task.validation_docs() - if "d170" not in task_name and "dc100" not in task_name and "dc200" not in task_name and "llava_wilder" not in task_name: + if "d170" not in task_name and "dc100" not in task_name and "dc200" not in task_name and "llava_wilder" not in task_name and "rolling" not in task_name: remove_cols = [] features = docs.features # If it is an Image instance or a Sequence of Image instance. Remove it diff --git a/lmms_eval/models/__init__.py b/lmms_eval/models/__init__.py index 011d232ff..a9f3e97ad 100755 --- a/lmms_eval/models/__init__.py +++ b/lmms_eval/models/__init__.py @@ -13,7 +13,8 @@ "video_llava": "VideoLLaVA", "xcomposer2_4KHD": "XComposer2_4KHD", "claude" : "Claude", - "qwen_vl_api" : "Qwen_VL_API" + "qwen_vl_api" : "Qwen_VL_API", + "llava_sglang" : "LlavaSglang", } for model_name, model_class in AVAILABLE_MODELS.items(): diff --git a/lmms_eval/models/llava_sglang.py b/lmms_eval/models/llava_sglang.py new file mode 100644 index 000000000..01f23535d --- /dev/null +++ b/lmms_eval/models/llava_sglang.py @@ -0,0 +1,164 @@ +import torch + +torch.backends.cuda.matmul.allow_tf32 = True + +import logging +from tqdm import tqdm +from datetime import timedelta + +from lmms_eval import utils +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model + +from accelerate import Accelerator, InitProcessGroupKwargs +from typing import List, Optional, Union, Tuple +import warnings + +warnings.filterwarnings("ignore") +from concurrent.futures import ThreadPoolExecutor, as_completed +import tempfile + +eval_logger = logging.getLogger("lmms-eval") + +try: + import sglang as sgl + from sglang.lang.chat_template import get_chat_template +except ImportError: + eval_logger.error("SGLang is not installed. If you want to use llava_sglang, please install it using pip install 'sglang[all]' ") + +if torch.__version__ > "2.1.2": + best_fit_attn_implementation = "sdpa" +else: + best_fit_attn_implementation = "eager" + + +@register_model("llava_sglang") +class LlavaSglang(lmms): + """ + Llava Sglang Model + """ + + def __init__( + self, + pretrained: str = "liuhaotian/llava-v1.5-7b", + tokenizer: str = "llava-hf/llava-1.5-7b-hf", + tp_size: int = 1, + parallel: Optional[Union[int, str]] = 64, + conv_template="vicuna_v1.1", + **kwargs, + ) -> None: + super().__init__() + self.pretrained = pretrained + self.tokenizer = tokenizer + self.tp_size = tp_size + self.conv_template = conv_template + torch.multiprocessing.set_start_method("spawn") + + accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) + accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) + assert accelerator.num_processes == 1, "Llava-sglang does not support multi-processes yet (it does support tensor parallelism)." + self._rank = 0 + self._world_size = 1 + self.parallel = parallel + + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + raise NotImplementedError("Llava-sglang does not support loglikelihood evaluation yet") + + def generate_until(self, requests: List[Instance]) -> List[str]: + + runtime = sgl.Runtime(model_path=self.pretrained, tokenizer_path=self.tokenizer, tp_size=self.tp_size) + runtime.endpoint.chat_template = get_chat_template(self.conv_template) + sgl.set_default_backend(runtime) + + @sgl.function + def image_qa(s, image_file, question): + s += sgl.user(sgl.image(image_file) + question) + s += sgl.assistant(sgl.gen("answer")) + + res = [] + + def _collate(x): + # the negative sign on len(toks) sorts descending - this has a few advantages: + # - time estimates will always be over not underestimates, which is more useful for planning + # - to know the size of a batch when going through the list, you know the first one is always the batch + # padded context length. this is useful to simplify the batching logic and more importantly to make + # automatic adaptive batches much much easier to implement + # - any OOMs will happen right away rather than near the end + toks = x[0].split(" ") + return -len(toks), x[0] + + # we group requests by their generation_kwargs, + # so that we don't try to execute e.g. greedy sampling and temp=0.8 sampling + # in the same batch. + re_ords = utils.Collator([reg.args for reg in requests], _collate, grouping=True) + chunks = re_ords.get_batched(n=self.parallel, batch_fn=None) + num_iters = len(requests) // self.parallel if len(requests) % self.parallel == 0 else len(requests) // self.parallel + 1 + pbar = tqdm(total=num_iters, disable=(self.rank != 0), desc="Model Responding") + for chunk in chunks: + contexts, all_gen_kwargs, doc_to_visuals, doc_id, tasks, splits = zip(*chunk) + batched_visuals = [doc_to_visual(self.task_dict[task][split][ids]) for ids, task, split, doc_to_visual in zip(doc_id, tasks, splits, doc_to_visuals)] # [B, N] + # we assume all gen kwargs in the batch are the same + # this is safe to assume because the `grouper` object ensures it. + gen_kwargs = all_gen_kwargs[0] + if "max_new_tokens" not in gen_kwargs: + gen_kwargs["max_new_tokens"] = 1024 + if "temperature" not in gen_kwargs: + gen_kwargs["temperature"] = 0 + if "top_p" not in gen_kwargs: + gen_kwargs["top_p"] = 1.0 + if "num_beams" not in gen_kwargs: + gen_kwargs["num_beams"] = 1 + if gen_kwargs["top_p"] == 0.0: + gen_kwargs["top_p"] = 1.0 + gen_kwargs["temperature"] = 0.0 + assert gen_kwargs["num_beams"] == 1 + + def save_image_to_temp_file(image): + temp_file = tempfile.NamedTemporaryFile(suffix=".jpeg", delete=True) + image.save(temp_file.name) + return temp_file + + def prepare_arguments_parallel(contexts, batched_visuals, max_workers=64): + arguments = [None] * len(contexts) # Initialize with placeholders + tmp_files = [None] * len(contexts) # Initialize with placeholders + + with ThreadPoolExecutor(max_workers=max_workers) as executor: + # Associate each future with its index and content + future_to_info = {executor.submit(save_image_to_temp_file, pil_list[0]): (index, context, pil_list) for index, (context, pil_list) in enumerate(zip(contexts, batched_visuals))} + + for future in as_completed(future_to_info): + index, context, pil_list = future_to_info[future] + if len(pil_list) > 1: + eval_logger.warning("Llava-sglang only supports one visual input per question. Using the first visual input.") + try: + temp_file = future.result() + arguments[index] = { + "image_file": temp_file.name, + "question": context, + } + tmp_files[index] = temp_file + except Exception as exc: + print(f"Generated an exception: {exc}") + + # Filter out any None values in case of exceptions + arguments = [arg for arg in arguments if arg is not None] + tmp_files = [tmp_file for tmp_file in tmp_files if tmp_file is not None] + + return arguments, tmp_files + + arguments, tmp_files = prepare_arguments_parallel(contexts, batched_visuals, self.parallel) + states = image_qa.run_batch(arguments, temperature=gen_kwargs["temperature"], max_new_tokens=gen_kwargs["max_new_tokens"], top_p=gen_kwargs["top_p"], num_threads=self.parallel, progress_bar=False) + + text_outputs = [state["answer"].strip() for state in states] + # clean up the temporary files + for tmp_file in tmp_files: + tmp_file.close() + res.extend(text_outputs) + pbar.update(1) + # reorder this group of results back to original unsorted form + res = re_ords.get_original(res) + + pbar.close() + runtime.shutdown() + return res From a6012765b4e0a62913fb51a8c98cf72dca226b08 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Fri, 26 Apr 2024 09:59:30 +0000 Subject: [PATCH 015/181] Update lmms_eval/models/__init__.py and lmms_eval/api/samplers.py --- lmms_eval/models/__init__.py | 12 ++-- lmms_eval/models/claude.py | 62 ++++++++++---------- lmms_eval/models/llama_vid.py | 50 +++++++--------- lmms_eval/models/qwen_vl_api.py | 46 ++++++--------- lmms_eval/models/video_llava.py | 36 +++++------- lmms_eval/models/xcomposer2_4KHD.py | 90 ++++++++++++++--------------- 6 files changed, 131 insertions(+), 165 deletions(-) diff --git a/lmms_eval/models/__init__.py b/lmms_eval/models/__init__.py index a9f3e97ad..5c45d61e6 100755 --- a/lmms_eval/models/__init__.py +++ b/lmms_eval/models/__init__.py @@ -7,14 +7,14 @@ "gpt4v": "GPT4V", "instructblip": "InstructBLIP", "minicpm_v": "MiniCPM_V", - "llava_vid" : "LlavaVid", - "videoChatGPT" : "VideoChatGPT", - "llama_vid" : "LLaMAVid", + "llava_vid": "LlavaVid", + "videoChatGPT": "VideoChatGPT", + "llama_vid": "LLaMAVid", "video_llava": "VideoLLaVA", "xcomposer2_4KHD": "XComposer2_4KHD", - "claude" : "Claude", - "qwen_vl_api" : "Qwen_VL_API", - "llava_sglang" : "LlavaSglang", + "claude": "Claude", + "qwen_vl_api": "Qwen_VL_API", + "llava_sglang": "LlavaSglang", } for model_name, model_class in AVAILABLE_MODELS.items(): diff --git a/lmms_eval/models/claude.py b/lmms_eval/models/claude.py index 1f112a167..657082272 100644 --- a/lmms_eval/models/claude.py +++ b/lmms_eval/models/claude.py @@ -32,44 +32,43 @@ class Claude(lmms): def __init__( self, model_version: str = "claude-3-opus-20240229", - image_token: str = "", # Use to separate interleaved image and text - system_prompt: str = "", # Whether you want some special system prompt here + image_token: str = "", # Use to separate interleaved image and text + system_prompt: str = "", # Whether you want some special system prompt here **kwargs, ) -> None: super().__init__() self.model_version = model_version self.image_token = image_token self.system_prompt = system_prompt - + def encode_image(self, image): output_buffer = BytesIO() image.save(output_buffer, format="PNG") byte_data = output_buffer.getvalue() base64_str = base64.b64encode(byte_data).decode("utf-8") return base64_str - + def flatten(self, input): new_list = [] for i in input: for j in i: new_list.append(j) return new_list - + def get_image_size(self, image): - # Create a BytesIO object to store the image bytes + # Create a BytesIO object to store the image bytes img_byte_array = BytesIO() - + # Save the image to the BytesIO object image.save(img_byte_array, format="PNG") - + # Get the size of the BytesIO object img_size = img_byte_array.tell() - + return img_size # The max file size is 5MB for claude - def shrink_image_to_file_size(self, img : Image, max_file_size=5242880) -> Image: - + def shrink_image_to_file_size(self, img: Image, max_file_size=5242880) -> Image: # Get the current size of the image original_size = self.get_image_size(img) @@ -80,7 +79,7 @@ def shrink_image_to_file_size(self, img : Image, max_file_size=5242880) -> Image # Calculate the ratio to shrink the image # Somehow I found out sqrt ratio is not enough to shrink the image # below threshold, so I guess we do more - shrink_ratio = (max_file_size / original_size) + shrink_ratio = max_file_size / original_size # Resize the image with the calculated ratio new_width = int(img.width * shrink_ratio) @@ -95,13 +94,18 @@ def generate_until(self, requests) -> List[str]: res = [] pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") - - empty_image_block = {"type" : "image", "source" : {"type": "base64", "media_type": "image/png",}} - empty_text_block = {"type" : "text"} + empty_image_block = { + "type": "image", + "source": { + "type": "base64", + "media_type": "image/png", + }, + } + empty_text_block = {"type": "text"} empty_messages = [ { - "role" : "user", - "content" : [], + "role": "user", + "content": [], } ] @@ -116,7 +120,7 @@ def generate_until(self, requests) -> List[str]: imgs.append(img) messages = deepcopy(empty_messages) - + if self.image_token not in contexts: for img in imgs: image_block = deepcopy(empty_image_block) @@ -134,15 +138,14 @@ def generate_until(self, requests) -> List[str]: messages[0]["content"].append(text_block) image_block["source"]["data"] = img messages[0]["content"].append(image_block) - + # If n image tokens are in the contexts # contexts will be splitted into n+1 chunks # Manually add it into the messages - text_block = deepcopy(empty_text_block) + text_block = deepcopy(empty_text_block) text_block["text"] = contexts messages["content"].append(text_block) - if "max_new_tokens" not in gen_kwargs: gen_kwargs["max_new_tokens"] = 1024 if "temperature" not in gen_kwargs: @@ -151,17 +154,10 @@ def generate_until(self, requests) -> List[str]: gen_kwargs["top_p"] = None if "num_beams" not in gen_kwargs: gen_kwargs["num_beams"] = 1 - + for attempt in range(5): try: - message = client.messages.create( - model=self.model_version, - max_tokens= gen_kwargs["max_new_tokens"], - system=self.system_prompt, - temperature=gen_kwargs["temperature"], - top_p=gen_kwargs["top_p"], - messages=messages - ) + message = client.messages.create(model=self.model_version, max_tokens=gen_kwargs["max_new_tokens"], system=self.system_prompt, temperature=gen_kwargs["temperature"], top_p=gen_kwargs["top_p"], messages=messages) except Exception as e: eval_logger.info(f"Attempt {attempt + 1} failed with error: {str(e)}") if attempt < 5 - 1: # If we have retries left, sleep and then continue to next attempt @@ -174,10 +170,10 @@ def generate_until(self, requests) -> List[str]: res.append(message.content[0].text) pbar.update(1) - + pbar.close() - return res + return res def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: - assert False, "Not supported for claude" \ No newline at end of file + assert False, "Not supported for claude" diff --git a/lmms_eval/models/llama_vid.py b/lmms_eval/models/llama_vid.py index 1a92530b7..d9545a382 100644 --- a/lmms_eval/models/llama_vid.py +++ b/lmms_eval/models/llama_vid.py @@ -51,7 +51,7 @@ def __init__( use_cache=True, truncate_context=False, **kwargs, - ) -> None: + ) -> None: super().__init__() accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) @@ -75,9 +75,13 @@ def __init__( os.makedirs(cache_path, exist_ok=True) subprocess.run(["wget https://storage.googleapis.com/sfr-vision-language-research/LAVIS/models/BLIP2/eva_vit_g.pth -O ./model_zoo/LAVIS/eva_vit_g.pth"], shell=True) - accelerator.wait_for_everyone() - self._tokenizer, self._model, self.image_processor, self._max_length = load_pretrained_model(self.model_path, None, self.model_name, device_map=self.device_map,) + self._tokenizer, self._model, self.image_processor, self._max_length = load_pretrained_model( + self.model_path, + None, + self.model_name, + device_map=self.device_map, + ) self._config = self._model.config self.model.eval() @@ -118,14 +122,14 @@ def __init__( self.model.to(self._device) self._rank = 0 self._world_size = 1 - + def download_file(self, url, folder_path): # Create the folder if it doesn't exist if not os.path.exists(folder_path): os.makedirs(folder_path) - + # Extract filename from URL - filename = url.split('/')[-1] + filename = url.split("/")[-1] # Define path to save the file file_path = os.path.join(folder_path, filename) @@ -136,12 +140,12 @@ def download_file(self, url, folder_path): # Check if request was successful (status code 200) if response.status_code == 200: # Save the file to the specified folder - with open(file_path, 'wb') as f: + with open(file_path, "wb") as f: f.write(response.content) print(f"File downloaded successfully to {file_path}") else: print(f"Failed to download file. Status code: {response.status_code}") - + def load_video(self, video_path): vr = VideoReader(video_path, ctx=cpu(0)) total_frame_num = len(vr) @@ -184,17 +188,17 @@ def tok_encode(self, string: str, left_truncate_len=None, add_special_tokens=Non if left_truncate_len: encoding = encoding[-left_truncate_len:] return encoding - + def tok_decode(self, tokens): return self.tokenizer.decode(tokens) - + def flatten(self, input): new_list = [] for i in input: for j in i: new_list.append(j) return new_list - + def generate_until(self, requests) -> List[str]: res = [] pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") @@ -206,21 +210,21 @@ def generate_until(self, requests) -> List[str]: videos = [] for visual in visuals: video = self.load_video(visual) - video = self.image_processor.preprocess(video, return_tensors='pt')['pixel_values'].half().cuda() + video = self.image_processor.preprocess(video, return_tensors="pt")["pixel_values"].half().cuda() video = [video] videos += video qs = contexts if self.model.config.mm_use_im_start_end: - qs = DEFAULT_IM_START_TOKEN + DEFAULT_IMAGE_TOKEN + DEFAULT_IM_END_TOKEN + '\n' + qs + qs = DEFAULT_IM_START_TOKEN + DEFAULT_IMAGE_TOKEN + DEFAULT_IM_END_TOKEN + "\n" + qs else: - qs = DEFAULT_IMAGE_TOKEN + '\n' + qs + qs = DEFAULT_IMAGE_TOKEN + "\n" + qs conv = conv_templates[self.conv_template].copy() conv.append_message(conv.roles[0], qs) conv.append_message(conv.roles[1], None) prompt = conv.get_prompt() - input_ids = tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt').unsqueeze(0).cuda() + input_ids = tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).cuda() stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2 keywords = [stop_str] @@ -229,33 +233,24 @@ def generate_until(self, requests) -> List[str]: cur_prompt = contexts with torch.inference_mode(): self.model.update_prompt([[cur_prompt]]) - output_ids = self.model.generate( - input_ids, - images=video, - do_sample=True, - temperature=0.2, - max_new_tokens=1024, - use_cache=True, - stopping_criteria=[stopping_criteria]) + output_ids = self.model.generate(input_ids, images=video, do_sample=True, temperature=0.2, max_new_tokens=1024, use_cache=True, stopping_criteria=[stopping_criteria]) input_token_len = input_ids.shape[1] n_diff_input_output = (input_ids != output_ids[:, :input_token_len]).sum().item() if n_diff_input_output > 0: - print(f'[Warning] {n_diff_input_output} output_ids are not the same as the input_ids') + print(f"[Warning] {n_diff_input_output} output_ids are not the same as the input_ids") outputs = self.tokenizer.batch_decode(output_ids[:, input_token_len:], skip_special_tokens=True)[0] outputs = outputs.strip() if outputs.endswith(stop_str): - outputs = outputs[:-len(stop_str)] + outputs = outputs[: -len(stop_str)] outputs = outputs.strip() pbar.update(1) res.append(outputs) return res - def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: return super().loglikelihood(requests) - @property def batch_size(self): @@ -272,4 +267,3 @@ def rank(self): @property def world_size(self): return self._world_size - diff --git a/lmms_eval/models/qwen_vl_api.py b/lmms_eval/models/qwen_vl_api.py index b47c37793..af7f27138 100644 --- a/lmms_eval/models/qwen_vl_api.py +++ b/lmms_eval/models/qwen_vl_api.py @@ -6,7 +6,7 @@ from tqdm import tqdm import requests as url_requests import time -import logging +import logging from lmms_eval.api.instance import Instance from lmms_eval.api.model import lmms @@ -31,18 +31,18 @@ class Qwen_VL_API(lmms): def __init__( self, model_version: str = "qwen-vl-max", - image_token: str = "", # Use to separate interleaved image and text - system_prompt: str = "", # Whether you want some special system prompt here - tmp_folder: str = "./tmp", # Due to qwen's api restriction, + image_token: str = "", # Use to separate interleaved image and text + system_prompt: str = "", # Whether you want some special system prompt here + tmp_folder: str = "./tmp", # Due to qwen's api restriction, **kwargs, ) -> None: super().__init__() - + self.model_version = model_version self.image_token = image_token self.system_prompt = system_prompt self.tmp_folder = tmp_folder - + @property def rank(self): return self._rank @@ -66,12 +66,7 @@ def generate_until(self, requests) -> List[str]: visual.save(os.path.join(self.tmp_folder, f"tmp_{idx}_{self.rank}_{self.world_size}.jpg")) imgs.append(os.path.join(self.tmp_folder, f"tmp_{idx}_{self.rank}_{self.world_size}.jpg")) - messages = [ - { - "role": "user", - "content": [] - } - ] + messages = [{"role": "user", "content": []}] if self.image_token not in contexts: for img in imgs: @@ -82,9 +77,8 @@ def generate_until(self, requests) -> List[str]: for idx, img in enumerate(imgs): messages[0]["content"].append({"text": contexts[idx]}) - messages[0]["content"].append({"image": img}) - messages[0]["content"].append({"text" : contexts[-1]}) - + messages[0]["content"].append({"image": img}) + messages[0]["content"].append({"text": contexts[-1]}) if "max_new_tokens" not in gen_kwargs or gen_kwargs["max_new_tokens"] > 1500: gen_kwargs["max_new_tokens"] = 1024 @@ -94,15 +88,10 @@ def generate_until(self, requests) -> List[str]: gen_kwargs["top_p"] = None if "num_beams" not in gen_kwargs: gen_kwargs["num_beams"] = 1 - + for attempt in range(5): try: - response_data = dashscope.MultiModalConversation.call( - model=self.model_version, - messages=messages, - api_key=API_KEY, - max_length = gen_kwargs["max_new_tokens"] - ) + response_data = dashscope.MultiModalConversation.call(model=self.model_version, messages=messages, api_key=API_KEY, max_length=gen_kwargs["max_new_tokens"]) except Exception as e: eval_logger.info(f"Attempt {attempt + 1} failed with error: {str(e)}") if attempt < 5 - 1: # If we have retries left, sleep and then continue to next attempt @@ -112,25 +101,24 @@ def generate_until(self, requests) -> List[str]: res.append("") pbar.update(1) continue - try: + try: res.append(response_data["output"]["choices"][0]["message"]["content"][0]["text"].strip()) except Exception as e: eval_logger.error(f"Error {e} happens when parsing input.") eval_logger.error(f"{response_data}") res.append("") pbar.update(1) - + pbar.close() - return res - - + return res + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: assert False, "Not supported for claude" - + def flatten(self, input): new_list = [] for i in input: for j in i: new_list.append(j) - return new_list \ No newline at end of file + return new_list diff --git a/lmms_eval/models/video_llava.py b/lmms_eval/models/video_llava.py index 8b890219d..bc25b7a5b 100644 --- a/lmms_eval/models/video_llava.py +++ b/lmms_eval/models/video_llava.py @@ -27,11 +27,12 @@ except ImportError: eval_logger.error("Video-LLaVA is not installed. Please install Video-LLaVA to use this model.") + @register_model("video_llava") class VideoLLaVA(lmms): def __init__( self, - pretrained: str = 'LanguageBind/Video-LLaVA-7B', + pretrained: str = "LanguageBind/Video-LLaVA-7B", truncation: Optional[bool] = True, device: Optional[str] = "cuda:0", dtype: Optional[Union[str, torch.dtype]] = "auto", @@ -46,7 +47,7 @@ def __init__( use_cache=True, truncate_context=False, # whether to truncate the context in generation, set it False for LLaVA-1.6 **kwargs, - ) -> None: + ) -> None: super().__init__() accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) @@ -63,7 +64,7 @@ def __init__( self.pretrained = pretrained self.model_name = get_model_name_from_path(pretrained) self._tokenizer, self._model, self.processor, self._max_length = load_pretrained_model(pretrained, None, self.model_name, device_map=self.device_map) - self.video_processor = self.processor['video'] + self.video_processor = self.processor["video"] self._config = self._model.config self.model.eval() self.model.tie_weights() @@ -162,10 +163,10 @@ def tok_encode(self, string: str, left_truncate_len=None, add_special_tokens=Non if left_truncate_len: encoding = encoding[-left_truncate_len:] return encoding - + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: return super().loglikelihood(requests) - + def flatten(self, input): new_list = [] for i in input: @@ -182,36 +183,29 @@ def generate_until(self, requests) -> List[str]: visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] visuals = self.flatten(visuals) assert len(visuals) == 1 - video_tensors = self.video_processor(visuals[0], return_tensors='pt')['pixel_values'] - + video_tensors = self.video_processor(visuals[0], return_tensors="pt")["pixel_values"] + if type(video_tensors) is list: tensor = [video.to(self.model.device, dtype=torch.float16) for video in video_tensors] else: tensor = video_tensors.to(self.model.device, dtype=torch.float16) - + conv = conv_templates[self.conv_template].copy() roles = conv.roles - inp = ' '.join([DEFAULT_IMAGE_TOKEN] * self.model.get_video_tower().config.num_frames) + '\n' + contexts + inp = " ".join([DEFAULT_IMAGE_TOKEN] * self.model.get_video_tower().config.num_frames) + "\n" + contexts conv.append_message(conv.roles[0], inp) conv.append_message(conv.roles[1], None) prompt = conv.get_prompt() - input_ids = tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt').unsqueeze(0).cuda() + input_ids = tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).cuda() stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2 keywords = [stop_str] stopping_criteria = KeywordsStoppingCriteria(keywords, self.tokenizer, input_ids) with torch.inference_mode(): - output_ids = self.model.generate( - input_ids, - images=tensor, - do_sample=True, - temperature=0.1, - max_new_tokens=1024, - use_cache=True, - stopping_criteria=[stopping_criteria]) - - outputs = self.tokenizer.decode(output_ids[0, input_ids.shape[1]:]).strip() + output_ids = self.model.generate(input_ids, images=tensor, do_sample=True, temperature=0.1, max_new_tokens=1024, use_cache=True, stopping_criteria=[stopping_criteria]) + + outputs = self.tokenizer.decode(output_ids[0, input_ids.shape[1] :]).strip() res.append(outputs) pbar.update(1) - return res + return res diff --git a/lmms_eval/models/xcomposer2_4KHD.py b/lmms_eval/models/xcomposer2_4KHD.py index cc361d779..408fec038 100644 --- a/lmms_eval/models/xcomposer2_4KHD.py +++ b/lmms_eval/models/xcomposer2_4KHD.py @@ -20,7 +20,7 @@ import re from tqdm import tqdm -pattern = re.compile(r'[A-Z]') +pattern = re.compile(r"[A-Z]") eval_logger = logging.getLogger("lmms-eval") @@ -32,6 +32,7 @@ - InternLM-XComposer (浦语·灵笔) is capable of comprehending and articulating responses\ effectively based on the provided image.""" + @register_model("xcomposer2_4khd") class XComposer2_4KHD(lmms): def __init__( @@ -40,11 +41,11 @@ def __init__( device: Optional[str] = "cuda:0", batch_size: Optional[Union[int, str]] = 1, device_map="cuda:0", - need_bos : bool = True, - padding : bool = False, - half : bool = False, - **kwargs - ) -> None: + need_bos: bool = True, + padding: bool = False, + half: bool = False, + **kwargs, + ) -> None: super().__init__() accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) @@ -97,7 +98,6 @@ def __init__( self.model.to(self._device) self._rank = 0 self._world_size = 1 - @property def config(self): @@ -115,7 +115,7 @@ def model(self): return self.accelerator.unwrap_model(self._model) else: return self._model - + @property def batch_size(self): return self.batch_size_per_gpu @@ -131,14 +131,14 @@ def rank(self): @property def world_size(self): return self._world_size - + def flatten(self, input): new_list = [] for i in input: for j in i: new_list.append(j) return new_list - + def generate_until(self, requests) -> List[str]: res = [] pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") @@ -148,17 +148,17 @@ def generate_until(self, requests) -> List[str]: visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] visuals = self.flatten(visuals) - if 'hd_num' not in gen_kwargs: - if listinstr(['docvqa_test', 'infovqa_test'], task.lower()): + if "hd_num" not in gen_kwargs: + if listinstr(["docvqa_test", "infovqa_test"], task.lower()): self.model.hd_num = 65 - elif listinstr(['docvqa_val', 'infovqa_val', 'OCRBench'], task.lower()): + elif listinstr(["docvqa_val", "infovqa_val", "OCRBench"], task.lower()): self.model.hd_num = 55 - elif listinstr(['mmmu', 'mmbench', 'mmvet'], task.lower()): + elif listinstr(["mmmu", "mmbench", "mmvet"], task.lower()): self.model.hd_num = 16 else: self.model.hd_num = 25 else: - self.model.hd_num = gen_kwargs.pop('hd_num') + self.model.hd_num = gen_kwargs.pop("hd_num") pt1 = 0 embeds = [] @@ -200,44 +200,34 @@ def generate_until(self, requests) -> List[str]: gen_kwargs["repetition_penalty"] = 1.0 outputs = self.model.generate( - inputs_embeds=embeds, + inputs_embeds=embeds, im_mask=im_mask, - temperature=gen_kwargs["temperature"], - max_new_tokens=gen_kwargs["max_new_tokens"], + temperature=gen_kwargs["temperature"], + max_new_tokens=gen_kwargs["max_new_tokens"], num_beams=gen_kwargs["num_beams"], - do_sample=gen_kwargs["do_sample"], - repetition_penalty=gen_kwargs["repetition_penalty"]) + do_sample=gen_kwargs["do_sample"], + repetition_penalty=gen_kwargs["repetition_penalty"], + ) output_token = outputs[0] if output_token[0] == 0 or output_token[0] == 1: output_token = output_token[1:] output_text = self.model.tokenizer.decode(output_token, add_special_tokens=False) - output_text = output_text.split('[UNUSED_TOKEN_145]')[0].strip() + output_text = output_text.split("[UNUSED_TOKEN_145]")[0].strip() output_text = output_text.split("<|im_end|>")[0].strip() if DATASET_TYPE(task) == "multi-choice": output_text = pattern.findall(output_text) if len(output_text) == 0: - print('Error:', output_text) - output_text = 'Z' + print("Error:", output_text) + output_text = "Z" if type(output_text) == list: output_text = output_text[0] res.append(output_text) pbar.update(1) - pbar.close() + pbar.close() return res - + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: return super().loglikelihood(requests) - - - - - - - - - - - def padding_336(b): @@ -259,7 +249,7 @@ def HD_transform(img, im_num=16): img = img.transpose(Image.TRANSPOSE) trans = True width, height = img.size - ratio = (width / height) + ratio = width / height scale = 1 while scale * np.ceil(scale / ratio) <= im_num: scale += 1 @@ -267,7 +257,10 @@ def HD_transform(img, im_num=16): new_w = int(scale * 336) new_h = int(new_w / ratio) - img = transforms.functional.resize(img, [new_h, new_w],) + img = transforms.functional.resize( + img, + [new_h, new_w], + ) img = padding_336(img) width, height = img.size assert width * height <= im_num * 336 * 336 @@ -276,6 +269,7 @@ def HD_transform(img, im_num=16): return img + def listinstr(lst, s): assert isinstance(lst, list) for item in lst: @@ -283,17 +277,17 @@ def listinstr(lst, s): return True return False + def DATASET_TYPE(dataset): # Dealing with Custom Dataset dataset = dataset.lower() - if listinstr(['mmbench', 'seedbench', 'ccbench', 'mmmu', 'scienceqa', 'ai2d', 'mmstar'], dataset): - return 'multi-choice' - elif listinstr(['mme', 'hallusion'], dataset): - return 'Y/N' - elif 'coco' in dataset: - return 'Caption' - elif listinstr(['ocrvqa', 'textvqa', 'chartqa', 'mathvista', 'docvqa', 'infovqa', 'llavabench', - 'mmvet', 'ocrbench'], dataset): - return 'VQA' + if listinstr(["mmbench", "seedbench", "ccbench", "mmmu", "scienceqa", "ai2d", "mmstar"], dataset): + return "multi-choice" + elif listinstr(["mme", "hallusion"], dataset): + return "Y/N" + elif "coco" in dataset: + return "Caption" + elif listinstr(["ocrvqa", "textvqa", "chartqa", "mathvista", "docvqa", "infovqa", "llavabench", "mmvet", "ocrbench"], dataset): + return "VQA" else: - return 'QA' \ No newline at end of file + return "QA" From a862487366a91bc3df7da63239c9ab8cdc680ca0 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Mon, 29 Apr 2024 00:50:04 +0000 Subject: [PATCH 016/181] Refactor output path creation in cli_evaluate_single function --- lmms_eval/__main__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lmms_eval/__main__.py b/lmms_eval/__main__.py index 0c6661450..0d5c23648 100755 --- a/lmms_eval/__main__.py +++ b/lmms_eval/__main__.py @@ -305,6 +305,10 @@ def cli_evaluate_single(args: Union[argparse.Namespace, None] = None) -> None: print(dumped) if args.output_path: + last_part = args.output_path.name + last_part = "..." + last_part[-15:] if len(last_part) > 15 else last_part + args.output_path = args.output_path.parent / last_part + args.output_path.mkdir(parents=True, exist_ok=True) result_file_path = path.joinpath("results.json") if result_file_path.exists(): From 4bcd002f15f94394f8a55aed2549966b422391b3 Mon Sep 17 00:00:00 2001 From: "bo.li01" Date: Mon, 29 Apr 2024 14:59:38 +0800 Subject: [PATCH 017/181] updates --- lmms_eval/models/llava.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lmms_eval/models/llava.py b/lmms_eval/models/llava.py index 6c93af3af..8ea94ee2f 100755 --- a/lmms_eval/models/llava.py +++ b/lmms_eval/models/llava.py @@ -91,7 +91,9 @@ def __init__( self._device = torch.device(f"cuda:{accelerator.local_process_index}") self.device_map = f"cuda:{accelerator.local_process_index}" - llava_model_args = {} + llava_model_args = { + "multimodal": True, + } if customized_config is not None: llava_model_args["customized_config"] = customized_config if attn_implementation is not None: From 30222871a0a42d106c7ed91a39998e6d7c67b63b Mon Sep 17 00:00:00 2001 From: Bo Li Date: Tue, 30 Apr 2024 08:20:29 +0000 Subject: [PATCH 018/181] Fix log_samples suffix length --- lmms_eval/__main__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lmms_eval/__main__.py b/lmms_eval/__main__.py index 0d5c23648..e1d366aa4 100755 --- a/lmms_eval/__main__.py +++ b/lmms_eval/__main__.py @@ -271,6 +271,10 @@ def cli_evaluate_single(args: Union[argparse.Namespace, None] = None) -> None: # set datetime before evaluation datetime_str = utils.get_datetime_str(timezone=args.timezone) if args.output_path: + if args.log_samples_suffix and len(args.log_samples_suffix) > 15: + eval_logger.warning("The suffix for log_samples is too long. It is recommended to keep it under 15 characters.") + args.log_samples_suffix = args.log_samples_suffix[:5] + "..." + args.log_samples_suffix[-5:] + hash_input = f"{args.model_args}".encode("utf-8") hash_output = hashlib.sha256(hash_input).hexdigest()[:6] path = Path(args.output_path) @@ -305,10 +309,6 @@ def cli_evaluate_single(args: Union[argparse.Namespace, None] = None) -> None: print(dumped) if args.output_path: - last_part = args.output_path.name - last_part = "..." + last_part[-15:] if len(last_part) > 15 else last_part - args.output_path = args.output_path.parent / last_part - args.output_path.mkdir(parents=True, exist_ok=True) result_file_path = path.joinpath("results.json") if result_file_path.exists(): From dcc67c40f27629d95096a6cc64fe05b28f2b594b Mon Sep 17 00:00:00 2001 From: Bo Li Date: Tue, 30 Apr 2024 18:03:11 +0000 Subject: [PATCH 019/181] Add video encoding functionality and update prompt for video modality --- lmms_eval/models/gpt4v.py | 39 +++++++++++++++++-- lmms_eval/models/llava_vid.py | 6 +-- .../tasks/mix_evals/_default_template_yaml | 7 +++- .../mix_evals_video2text_freeform.yaml | 10 +++-- .../mix_evals/mix_evals_video2text_mc.yaml | 4 ++ lmms_eval/tasks/mix_evals/utils.py | 8 +--- 6 files changed, 56 insertions(+), 18 deletions(-) diff --git a/lmms_eval/models/gpt4v.py b/lmms_eval/models/gpt4v.py index 1e2fa5b03..a0d95c4b5 100755 --- a/lmms_eval/models/gpt4v.py +++ b/lmms_eval/models/gpt4v.py @@ -1,5 +1,6 @@ from io import BytesIO from copy import deepcopy +import numpy as np import os import base64 from typing import List, Tuple @@ -13,6 +14,11 @@ from lmms_eval.api.registry import register_model from lmms_eval import utils +try: + from decord import VideoReader, cpu +except ImportError: + pass + from PIL import Image API_TYPE = os.getenv("API_TYPE", "openai") @@ -40,6 +46,8 @@ class GPT4V(lmms): def __init__( self, model_version: str = "gpt-4-vision-preview", + modality: str = "image", + max_frames_for_video: int = 10, timeout: int = 120, **kwargs, ) -> None: @@ -48,6 +56,8 @@ def __init__( # and split the text and image # Here we just use the same token as llava for convenient self.model_version = model_version + self.modality = modality + self.max_frames_for_video = max_frames_for_video self.image_token = "" self.timeout = timeout @@ -59,6 +69,25 @@ def encode_image(self, image: Image): base64_str = base64.b64encode(byte_data).decode("utf-8") return base64_str + # Function to encode the video + def encode_video(self, video_path, for_get_frames_num): + vr = VideoReader(video_path, ctx=cpu(0)) + total_frame_num = len(vr) + uniform_sampled_frames = np.linspace(0, total_frame_num - 1, for_get_frames_num, dtype=int) + frame_idx = uniform_sampled_frames.tolist() + frames = vr.get_batch(frame_idx).asnumpy() + + base64_frames = [] + for frame in frames: + img = Image.fromarray(frame) + output_buffer = BytesIO() + img.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + base64_frames.append(base64_str) + + return base64_frames + def flatten(self, input): new_list = [] for i in input: @@ -74,10 +103,14 @@ def generate_until(self, requests) -> List[str]: # encode, pad, and truncate contexts for this batch visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] visuals = self.flatten(visuals) - imgs = [] + imgs = [] # multiple images or frames for video for visual in visuals: - img = self.encode_image(visual) - imgs.append(img) + if self.modality == "image": + img = self.encode_image(visual) + imgs.append(img) + elif self.modality == "video": + frames = self.encode_video(visual, self.max_frames_for_video) + imgs.extend(frames) payload = {"model": self.model_version, "messages": []} response_json = {"role": "user", "content": []} diff --git a/lmms_eval/models/llava_vid.py b/lmms_eval/models/llava_vid.py index 143ba8358..d4f6a89bf 100755 --- a/lmms_eval/models/llava_vid.py +++ b/lmms_eval/models/llava_vid.py @@ -219,7 +219,7 @@ def load_video(self, video_path, for_get_frames_num): uniform_sampled_frames = np.linspace(0, total_frame_num - 1, for_get_frames_num, dtype=int) frame_idx = uniform_sampled_frames.tolist() spare_frames = vr.get_batch(frame_idx).asnumpy() - return spare_frames + return spare_frames # (frames, height, width, channels) def tok_decode(self, tokens): return self.tokenizer.decode(tokens) @@ -340,8 +340,8 @@ def generate_until(self, requests) -> List[str]: if "num_beams" not in gen_kwargs: gen_kwargs["num_beams"] = 1 with torch.inference_mode(): - self.model.update_prompt([[cur_prompt]]) - # import pdb;pdb.set_trace() + # self.model.update_prompt([[cur_prompt]]) + # # import pdb;pdb.set_trace() output_ids = self.model.generate( inputs=input_ids, images=videos, diff --git a/lmms_eval/tasks/mix_evals/_default_template_yaml b/lmms_eval/tasks/mix_evals/_default_template_yaml index 8364226c9..2549e95c8 100644 --- a/lmms_eval/tasks/mix_evals/_default_template_yaml +++ b/lmms_eval/tasks/mix_evals/_default_template_yaml @@ -6,4 +6,9 @@ dataset_kwargs: model_specific_prompt_kwargs: default: pre_prompt: "" - post_prompt: "" \ No newline at end of file + post_prompt: "" + gpt4v: + pre_prompt: "These are frames from a video. Please answer the following questions about the video." + post_prompt: "" +metadata: + modality: video \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml index 87ca8b1ee..e03ce2473 100755 --- a/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml +++ b/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml @@ -5,16 +5,18 @@ output_type: generate_until doc_to_visual: !function utils.mix_evals_video2text_doc_to_visual doc_to_text: !function utils.mix_evals_video2text_doc_to_text doc_to_target: "{{target}}" -# process_results: !function utils.mix_evals_video2text_process_results_freeform + metric_list: - - metric: exact_match + - metric: anls aggregation: mean higher_is_better: true - ignore_case: true - ignore_punctuation: true + include: _default_template_yaml model_specific_prompt_kwargs: default: pre_prompt: "" + post_prompt: "Answer the question using a single word or phrase." + gpt4v: + pre_prompt: "These are frames from a video. Please answer the following questions about the video." post_prompt: "Answer the question using a single word or phrase." \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml index ca19aa098..1ff2be786 100755 --- a/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml +++ b/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml @@ -13,6 +13,7 @@ metric_list: higher_is_better: true ignore_case: true ignore_punctuation: true + filter_list: - name: "flexible-extract" filter: @@ -25,4 +26,7 @@ filter_list: model_specific_prompt_kwargs: default: pre_prompt: "" + post_prompt: "Answer with the option’s letter from the given choices directly." + gpt4v: + pre_prompt: "These are frames from a video. Please answer the following questions about the video." post_prompt: "Answer with the option’s letter from the given choices directly." \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/utils.py b/lmms_eval/tasks/mix_evals/utils.py index 2cf175f35..2151fcfa0 100755 --- a/lmms_eval/tasks/mix_evals/utils.py +++ b/lmms_eval/tasks/mix_evals/utils.py @@ -160,15 +160,9 @@ def apply(self, resps, docs): without_paren_fallback_regexes = [] without_paren_to_target = {} - options_prompt = "" - for idx, option in enumerate(doc["options"]): - char_idx = chr(ord("A") + idx) - option = option.strip() - options_prompt += f"{char_idx}. {option}\n" - options_prompt = options_prompt.rstrip("\n") # Regex to extract multiple choice options from the question multiple_choices_regex = re.compile(r"\b([A-Z])\.\s+([^\n]*)") - matches = multiple_choices_regex.findall(options_prompt) + matches = multiple_choices_regex.findall(doc["question"]) # Build regex patterns and mappings for each choice for m in matches: From b934ffd6cf1839162ef17610d51dec20c40be283 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Wed, 1 May 2024 03:23:54 +0000 Subject: [PATCH 020/181] Add Accelerator and DistributedType imports*** ***Update torch version check in Llava model*** ***Handle older versions of LLaVA without multimodal argument --- lmms_eval/models/gpt4v.py | 15 +++++++++++++++ lmms_eval/models/llava.py | 14 +++++++++++--- pyproject.toml | 1 + 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/lmms_eval/models/gpt4v.py b/lmms_eval/models/gpt4v.py index a0d95c4b5..89b63208a 100755 --- a/lmms_eval/models/gpt4v.py +++ b/lmms_eval/models/gpt4v.py @@ -14,6 +14,9 @@ from lmms_eval.api.registry import register_model from lmms_eval import utils +from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs +from accelerate.state import AcceleratorState + try: from decord import VideoReader, cpu except ImportError: @@ -61,6 +64,18 @@ def __init__( self.image_token = "" self.timeout = timeout + accelerator = Accelerator() + # assert self.batch_size_per_gpu == 1, "Llava currently does not support batched generation. See https://github.com/haotian-liu/LLaVA/issues/754. HF Llava also has this issue." + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + + self.device = self.accelerator.device + # Function to encode the image def encode_image(self, image: Image): output_buffer = BytesIO() diff --git a/lmms_eval/models/llava.py b/lmms_eval/models/llava.py index 8ea94ee2f..8d8e135ad 100755 --- a/lmms_eval/models/llava.py +++ b/lmms_eval/models/llava.py @@ -1,4 +1,3 @@ -import ast import torch torch.backends.cuda.matmul.allow_tf32 = True @@ -17,6 +16,7 @@ from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs from accelerate.state import AcceleratorState from typing import List, Optional, Union, Tuple +from packaging import version import warnings warnings.filterwarnings("ignore") @@ -46,7 +46,7 @@ # if is_flash_attn_2_available: # best_fit_attn_implementation = "flash_attention_2" # flash_attn has a bug that says: ERROR Error query and key must have the same dtype in generating -if torch.__version__ > "2.1.2": +if version.parse(torch.__version__) > version.parse("2.1.2"): best_fit_attn_implementation = "sdpa" else: best_fit_attn_implementation = "eager" @@ -100,7 +100,15 @@ def __init__( llava_model_args["attn_implementation"] = attn_implementation if "use_flash_attention_2" in kwargs: llava_model_args["use_flash_attention_2"] = kwargs["use_flash_attention_2"] - self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, get_model_name_from_path(pretrained), device_map=self.device_map, **llava_model_args) + + try: + # Try to load the model with the multimodal argument + self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, get_model_name_from_path(pretrained), device_map=self.device_map, **llava_model_args) + except TypeError: + # for older versions of LLaVA that don't have multimodal argument + llava_model_args.pop("multimodal", None) + self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, get_model_name_from_path(pretrained), device_map=self.device_map, **llava_model_args) + self._config = self._model.config self.model.eval() self.model.tie_weights() diff --git a/pyproject.toml b/pyproject.toml index 29dac10f1..a1b5893b3 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,6 +54,7 @@ dependencies = [ "tiktoken", "pre-commit", "pydantic", + "packaging", ] [tool.setuptools.packages.find] From 582fd44377f8e7e8fb0266b5263d2552b580e460 Mon Sep 17 00:00:00 2001 From: Li Bo Date: Wed, 1 May 2024 11:24:57 +0800 Subject: [PATCH 021/181] [Feat & Fix]Add GPT4V for video and fix the import issue for older version llava. (#81) * Add video encoding functionality and update prompt for video modality * Add Accelerator and DistributedType imports*** ***Update torch version check in Llava model*** ***Handle older versions of LLaVA without multimodal argument --- lmms_eval/models/gpt4v.py | 54 +++++++++++++++++-- lmms_eval/models/llava.py | 14 +++-- lmms_eval/models/llava_vid.py | 6 +-- .../tasks/mix_evals/_default_template_yaml | 7 ++- .../mix_evals_video2text_freeform.yaml | 10 ++-- .../mix_evals/mix_evals_video2text_mc.yaml | 4 ++ lmms_eval/tasks/mix_evals/utils.py | 8 +-- pyproject.toml | 1 + 8 files changed, 83 insertions(+), 21 deletions(-) diff --git a/lmms_eval/models/gpt4v.py b/lmms_eval/models/gpt4v.py index 1e2fa5b03..89b63208a 100755 --- a/lmms_eval/models/gpt4v.py +++ b/lmms_eval/models/gpt4v.py @@ -1,5 +1,6 @@ from io import BytesIO from copy import deepcopy +import numpy as np import os import base64 from typing import List, Tuple @@ -13,6 +14,14 @@ from lmms_eval.api.registry import register_model from lmms_eval import utils +from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs +from accelerate.state import AcceleratorState + +try: + from decord import VideoReader, cpu +except ImportError: + pass + from PIL import Image API_TYPE = os.getenv("API_TYPE", "openai") @@ -40,6 +49,8 @@ class GPT4V(lmms): def __init__( self, model_version: str = "gpt-4-vision-preview", + modality: str = "image", + max_frames_for_video: int = 10, timeout: int = 120, **kwargs, ) -> None: @@ -48,9 +59,23 @@ def __init__( # and split the text and image # Here we just use the same token as llava for convenient self.model_version = model_version + self.modality = modality + self.max_frames_for_video = max_frames_for_video self.image_token = "" self.timeout = timeout + accelerator = Accelerator() + # assert self.batch_size_per_gpu == 1, "Llava currently does not support batched generation. See https://github.com/haotian-liu/LLaVA/issues/754. HF Llava also has this issue." + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + + self.device = self.accelerator.device + # Function to encode the image def encode_image(self, image: Image): output_buffer = BytesIO() @@ -59,6 +84,25 @@ def encode_image(self, image: Image): base64_str = base64.b64encode(byte_data).decode("utf-8") return base64_str + # Function to encode the video + def encode_video(self, video_path, for_get_frames_num): + vr = VideoReader(video_path, ctx=cpu(0)) + total_frame_num = len(vr) + uniform_sampled_frames = np.linspace(0, total_frame_num - 1, for_get_frames_num, dtype=int) + frame_idx = uniform_sampled_frames.tolist() + frames = vr.get_batch(frame_idx).asnumpy() + + base64_frames = [] + for frame in frames: + img = Image.fromarray(frame) + output_buffer = BytesIO() + img.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + base64_frames.append(base64_str) + + return base64_frames + def flatten(self, input): new_list = [] for i in input: @@ -74,10 +118,14 @@ def generate_until(self, requests) -> List[str]: # encode, pad, and truncate contexts for this batch visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] visuals = self.flatten(visuals) - imgs = [] + imgs = [] # multiple images or frames for video for visual in visuals: - img = self.encode_image(visual) - imgs.append(img) + if self.modality == "image": + img = self.encode_image(visual) + imgs.append(img) + elif self.modality == "video": + frames = self.encode_video(visual, self.max_frames_for_video) + imgs.extend(frames) payload = {"model": self.model_version, "messages": []} response_json = {"role": "user", "content": []} diff --git a/lmms_eval/models/llava.py b/lmms_eval/models/llava.py index 8ea94ee2f..8d8e135ad 100755 --- a/lmms_eval/models/llava.py +++ b/lmms_eval/models/llava.py @@ -1,4 +1,3 @@ -import ast import torch torch.backends.cuda.matmul.allow_tf32 = True @@ -17,6 +16,7 @@ from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs from accelerate.state import AcceleratorState from typing import List, Optional, Union, Tuple +from packaging import version import warnings warnings.filterwarnings("ignore") @@ -46,7 +46,7 @@ # if is_flash_attn_2_available: # best_fit_attn_implementation = "flash_attention_2" # flash_attn has a bug that says: ERROR Error query and key must have the same dtype in generating -if torch.__version__ > "2.1.2": +if version.parse(torch.__version__) > version.parse("2.1.2"): best_fit_attn_implementation = "sdpa" else: best_fit_attn_implementation = "eager" @@ -100,7 +100,15 @@ def __init__( llava_model_args["attn_implementation"] = attn_implementation if "use_flash_attention_2" in kwargs: llava_model_args["use_flash_attention_2"] = kwargs["use_flash_attention_2"] - self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, get_model_name_from_path(pretrained), device_map=self.device_map, **llava_model_args) + + try: + # Try to load the model with the multimodal argument + self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, get_model_name_from_path(pretrained), device_map=self.device_map, **llava_model_args) + except TypeError: + # for older versions of LLaVA that don't have multimodal argument + llava_model_args.pop("multimodal", None) + self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, get_model_name_from_path(pretrained), device_map=self.device_map, **llava_model_args) + self._config = self._model.config self.model.eval() self.model.tie_weights() diff --git a/lmms_eval/models/llava_vid.py b/lmms_eval/models/llava_vid.py index 143ba8358..d4f6a89bf 100755 --- a/lmms_eval/models/llava_vid.py +++ b/lmms_eval/models/llava_vid.py @@ -219,7 +219,7 @@ def load_video(self, video_path, for_get_frames_num): uniform_sampled_frames = np.linspace(0, total_frame_num - 1, for_get_frames_num, dtype=int) frame_idx = uniform_sampled_frames.tolist() spare_frames = vr.get_batch(frame_idx).asnumpy() - return spare_frames + return spare_frames # (frames, height, width, channels) def tok_decode(self, tokens): return self.tokenizer.decode(tokens) @@ -340,8 +340,8 @@ def generate_until(self, requests) -> List[str]: if "num_beams" not in gen_kwargs: gen_kwargs["num_beams"] = 1 with torch.inference_mode(): - self.model.update_prompt([[cur_prompt]]) - # import pdb;pdb.set_trace() + # self.model.update_prompt([[cur_prompt]]) + # # import pdb;pdb.set_trace() output_ids = self.model.generate( inputs=input_ids, images=videos, diff --git a/lmms_eval/tasks/mix_evals/_default_template_yaml b/lmms_eval/tasks/mix_evals/_default_template_yaml index 8364226c9..2549e95c8 100644 --- a/lmms_eval/tasks/mix_evals/_default_template_yaml +++ b/lmms_eval/tasks/mix_evals/_default_template_yaml @@ -6,4 +6,9 @@ dataset_kwargs: model_specific_prompt_kwargs: default: pre_prompt: "" - post_prompt: "" \ No newline at end of file + post_prompt: "" + gpt4v: + pre_prompt: "These are frames from a video. Please answer the following questions about the video." + post_prompt: "" +metadata: + modality: video \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml index 87ca8b1ee..e03ce2473 100755 --- a/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml +++ b/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml @@ -5,16 +5,18 @@ output_type: generate_until doc_to_visual: !function utils.mix_evals_video2text_doc_to_visual doc_to_text: !function utils.mix_evals_video2text_doc_to_text doc_to_target: "{{target}}" -# process_results: !function utils.mix_evals_video2text_process_results_freeform + metric_list: - - metric: exact_match + - metric: anls aggregation: mean higher_is_better: true - ignore_case: true - ignore_punctuation: true + include: _default_template_yaml model_specific_prompt_kwargs: default: pre_prompt: "" + post_prompt: "Answer the question using a single word or phrase." + gpt4v: + pre_prompt: "These are frames from a video. Please answer the following questions about the video." post_prompt: "Answer the question using a single word or phrase." \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml index ca19aa098..1ff2be786 100755 --- a/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml +++ b/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml @@ -13,6 +13,7 @@ metric_list: higher_is_better: true ignore_case: true ignore_punctuation: true + filter_list: - name: "flexible-extract" filter: @@ -25,4 +26,7 @@ filter_list: model_specific_prompt_kwargs: default: pre_prompt: "" + post_prompt: "Answer with the option’s letter from the given choices directly." + gpt4v: + pre_prompt: "These are frames from a video. Please answer the following questions about the video." post_prompt: "Answer with the option’s letter from the given choices directly." \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/utils.py b/lmms_eval/tasks/mix_evals/utils.py index 2cf175f35..2151fcfa0 100755 --- a/lmms_eval/tasks/mix_evals/utils.py +++ b/lmms_eval/tasks/mix_evals/utils.py @@ -160,15 +160,9 @@ def apply(self, resps, docs): without_paren_fallback_regexes = [] without_paren_to_target = {} - options_prompt = "" - for idx, option in enumerate(doc["options"]): - char_idx = chr(ord("A") + idx) - option = option.strip() - options_prompt += f"{char_idx}. {option}\n" - options_prompt = options_prompt.rstrip("\n") # Regex to extract multiple choice options from the question multiple_choices_regex = re.compile(r"\b([A-Z])\.\s+([^\n]*)") - matches = multiple_choices_regex.findall(options_prompt) + matches = multiple_choices_regex.findall(doc["question"]) # Build regex patterns and mappings for each choice for m in matches: diff --git a/pyproject.toml b/pyproject.toml index 29dac10f1..a1b5893b3 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,6 +54,7 @@ dependencies = [ "tiktoken", "pre-commit", "pydantic", + "packaging", ] [tool.setuptools.packages.find] From b82e69341d840175d3f9c4f00da17f11446a07f9 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Wed, 1 May 2024 06:31:14 +0000 Subject: [PATCH 022/181] Add Gemini API/Model and update filtering logic for worldqa --- lmms_eval/models/__init__.py | 2 + lmms_eval/models/gemini_api.py | 192 ++++++++++++++++++ lmms_eval/models/gemini_model.py | 163 +++++++++++++++ lmms_eval/models/idefics2.py | 12 +- .../tasks/worldqa/_default_template_yaml | 2 +- lmms_eval/tasks/worldqa/utils.py | 69 ++++++- lmms_eval/tasks/worldqa/worldqa.yaml | 5 + lmms_eval/tasks/worldqa/worldqa_mc.yaml | 10 + 8 files changed, 447 insertions(+), 8 deletions(-) create mode 100644 lmms_eval/models/gemini_api.py create mode 100644 lmms_eval/models/gemini_model.py create mode 100644 lmms_eval/tasks/worldqa/worldqa.yaml diff --git a/lmms_eval/models/__init__.py b/lmms_eval/models/__init__.py index a97831158..d2b52c4f3 100755 --- a/lmms_eval/models/__init__.py +++ b/lmms_eval/models/__init__.py @@ -16,6 +16,8 @@ "qwen_vl_api": "Qwen_VL_API", "llava_sglang": "LlavaSglang", "idefics2": "Idefics2", + "gemini_api": "GeminiAPI", + "gemini_model": "GeminiModel", } for model_name, model_class in AVAILABLE_MODELS.items(): diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py new file mode 100644 index 000000000..01a7a1f36 --- /dev/null +++ b/lmms_eval/models/gemini_api.py @@ -0,0 +1,192 @@ +from io import BytesIO +from copy import deepcopy +import numpy as np +import os +import base64 +from typing import List, Tuple +from tqdm import tqdm +import requests as url_requests +import time +import logging + +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model +from lmms_eval import utils + +from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs +from accelerate.state import AcceleratorState + +try: + from decord import VideoReader, AudioReader, cpu +except ImportError: + pass + +from PIL import Image + +eval_logger = logging.getLogger("lmms-eval") + +NUM_SECONDS_TO_SLEEP = 5 +API_TYPE = os.getenv("API_TYPE", "openai") +if API_TYPE == "openai": # FIXME: Please modify this to support other type of API + API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") + API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } +else: + eval_logger.error("API_TYPE not supported") + + +@register_model("gemini_api") +class GeminiAPI(lmms): + def __init__( + self, + model_version: str = "gpt-4-turbo", # FIXME: Please modify this to support real gemini model version + modality: str = "video", + max_frames_for_video: int = -1, + frame_rate: int = -1, + timeout: int = 120, + **kwargs, + ) -> None: + super().__init__() + self.model_version = model_version + self.modality = modality + self.max_frames_for_video = max_frames_for_video + self.frame_rate = frame_rate + assert self.modality in ["image", "video"], "Modality must be either image or video" + assert self.max_frames_for_video == -1 or self.frame_rate == -1, "max_frames_for_video and frame_rate cannot be provided at the same time" + assert self.max_frames_for_video == -1 if self.frame_rate != -1 else True, "max_frames_for_video must be -1 if frame_rate > 0" + self.image_token = "" # In case the question contains token for placeholder + self.timeout = timeout + + accelerator = Accelerator() # This is not neccessary, it is only used to get the rank and world size + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + + self.device = self.accelerator.device + + # Function to encode the image + def encode_image(self, image: Image): + output_buffer = BytesIO() + image.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + return base64_str + + # Function to encode the video + def encode_video(self, video_path, for_get_frames_num=-1, frame_rate=-1): + assert for_get_frames_num != -1 or frame_rate != -1, "Either for_get_frames_num or frame_rate must be provided" + vr = VideoReader(video_path, ctx=cpu(0)) + total_frame_num = len(vr) + if for_get_frames_num != -1: + uniform_sampled_frames = np.linspace(0, total_frame_num - 1, for_get_frames_num, dtype=int) + frame_idx = uniform_sampled_frames.tolist() + else: + frame_idx = range(0, total_frame_num, frame_rate) + frames = vr.get_batch(frame_idx).asnumpy() + + base64_frames = [] + for frame in frames: + img = Image.fromarray(frame) + output_buffer = BytesIO() + img.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + base64_frames.append(base64_str) + + # Extract audio + try: + ar = AudioReader(video_path, sample_rate=44100, mono=False, ctx=cpu(0)) + audio = ar.get_batch(frame_idx).asnumpy() + audio_buffer = BytesIO() + audio.save(audio_buffer, format="mp3") + audio_byte_data = audio_buffer.getvalue() + base64_audio = base64.b64encode(audio_byte_data).decode("utf-8") + except Exception as e: + eval_logger.error(f"Error extracting audio or no audio found for video: {video_path}") + base64_audio = None + + return base64_frames, base64_audio + + def flatten(self, input): + new_list = [] + for i in input: + for j in i: + new_list.append(j) + return new_list + + def generate_until(self, requests) -> List[str]: + res = [] + pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") + + for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + # encode, pad, and truncate contexts for this batch + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + imgs = [] # multiple images or frames for video + for visual in visuals: + if self.modality == "image": + img = self.encode_image(visual) + imgs.append(img) + elif self.modality == "video": + frames, audio = self.encode_video(visual, self.max_frames_for_video, self.frame_rate) # FIXME: I am not sure how to put audio information into query, please modify this + imgs.extend(frames) + + payload = {"model": self.model_version, "messages": []} + response_json = {"role": "user", "content": []} + # When there is no image token in the context, append the image to the text + if self.image_token not in contexts: + payload["messages"].append(deepcopy(response_json)) + payload["messages"][0]["content"].append({"type": "text", "text": contexts}) + for img in imgs: + payload["messages"][0]["content"].append({"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{img}"}}) + else: + contexts = contexts.split(self.image_token) + for idx, img in enumerate(imgs): + payload["messages"].append(deepcopy(response_json)) + payload["messages"][idx]["content"].append({"type": "text", "text": contexts[idx]}) + payload["messages"][idx]["content"].append({"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{img}"}}) + + # If n image tokens are in the contexts + # contexts will be splitted into n+1 chunks + # Manually add it into the payload + payload["messages"].append(deepcopy(response_json)) + payload["messages"][-1]["content"].append({"type": "text", "text": contexts[-1]}) + + if "max_new_tokens" not in gen_kwargs: + gen_kwargs["max_new_tokens"] = 1024 + if "temperature" not in gen_kwargs: + gen_kwargs["temperature"] = 0 + + payload["max_tokens"] = gen_kwargs["max_new_tokens"] + payload["temperature"] = gen_kwargs["temperature"] + + for attempt in range(5): + try: + response = url_requests.post(API_URL, headers=headers, json=payload, timeout=self.timeout) + response_data = response.json() + + content = response_data["choices"][0]["message"]["content"].strip() + break # If successful, break out of the loop + + except Exception as e: + eval_logger.info(f"Attempt {attempt + 1} failed with error: {str(e)}") + if attempt < 5 - 1: # If we have retries left, sleep and then continue to next attempt + time.sleep(NUM_SECONDS_TO_SLEEP) + else: # If this was the last attempt, log and return empty + eval_logger.error(f"All 5 attempts failed. Last error message: {str(e)}") + content = "" + res.append(content) + pbar.update(1) + return res + + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + # TODO + assert False, "Gemini API not support" diff --git a/lmms_eval/models/gemini_model.py b/lmms_eval/models/gemini_model.py new file mode 100644 index 000000000..b474099c6 --- /dev/null +++ b/lmms_eval/models/gemini_model.py @@ -0,0 +1,163 @@ +from io import BytesIO +from copy import deepcopy +import numpy as np +import os +import base64 +from typing import List, Tuple +from tqdm import tqdm +import requests as url_requests +import time +import logging + +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model +from lmms_eval import utils + +from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs +from accelerate.state import AcceleratorState + +try: + from decord import VideoReader, AudioReader, cpu +except ImportError: + pass + +from PIL import Image + +eval_logger = logging.getLogger("lmms-eval") + +NUM_SECONDS_TO_SLEEP = 5 +API_TYPE = os.getenv("API_TYPE", "openai") +if API_TYPE == "openai": # FIXME: Please modify this to support other type of API + API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") + API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } +else: + eval_logger.error("API_TYPE not supported") + + +@register_model("gemini_model") +class GeminiModel(lmms): + def __init__( + self, + model_version: str = "gemini-pro", # FIXME: Please modify this to support real gemini model version + modality: str = "video", + max_frames_for_video: int = -1, + frame_rate: int = -1, + timeout: int = 120, + **kwargs, + ) -> None: + super().__init__() + self.model_version = model_version + self.modality = modality + self.max_frames_for_video = max_frames_for_video + self.frame_rate = frame_rate + assert self.modality in ["image", "video"], "Modality must be either image or video" + assert self.max_frames_for_video == -1 or self.frame_rate == -1, "max_frames_for_video and frame_rate cannot be provided at the same time" + assert self.max_frames_for_video == -1 if self.frame_rate != -1 else True, "max_frames_for_video must be -1 if frame_rate > 0" + self.image_token = "" # In case the question contains token for placeholder + self.timeout = timeout + + accelerator = Accelerator() # This is not neccessary, it is only used to get the rank and world size + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + + self.device = self.accelerator.device + + # Function to encode the image + def encode_image(self, image: Image): + output_buffer = BytesIO() + image.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + return base64_str + + # Function to encode the video + def encode_video(self, video_path, for_get_frames_num=-1, frame_rate=-1): + assert for_get_frames_num != -1 or frame_rate != -1, "Either for_get_frames_num or frame_rate must be provided" + vr = VideoReader(video_path, ctx=cpu(0)) + total_frame_num = len(vr) + if for_get_frames_num != -1: + uniform_sampled_frames = np.linspace(0, total_frame_num - 1, for_get_frames_num, dtype=int) + frame_idx = uniform_sampled_frames.tolist() + else: + frame_idx = range(0, total_frame_num, frame_rate) + frames = vr.get_batch(frame_idx).asnumpy() + + base64_frames = [] + for frame in frames: + img = Image.fromarray(frame) + output_buffer = BytesIO() + img.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + base64_frames.append(base64_str) + + # Extract audio + try: + ar = AudioReader(video_path, sample_rate=44100, mono=False, ctx=cpu(0)) + audio = ar.get_batch(frame_idx).asnumpy() + audio_buffer = BytesIO() + audio.save(audio_buffer, format="mp3") + audio_byte_data = audio_buffer.getvalue() + base64_audio = base64.b64encode(audio_byte_data).decode("utf-8") + except Exception as e: + eval_logger.error(f"Error extracting audio or no audio found for video: {video_path}") + base64_audio = None + + return base64_frames, base64_audio + + def flatten(self, input): + new_list = [] + for i in input: + for j in i: + new_list.append(j) + return new_list + + def model_call(self, gemini_global_content): + # TODO: Please implement the model call here + # input = [("text", "what does this video describe?"), ("image_bytes", image_png_bytes), ("image_bytes", image_png_bytes), ("image_bytes", image_png_bytes), ....] + gemini_response_content = {"example_id": gemini_global_content["example_id"], "response_content": "This is a placeholder response from the model. Please implement the model call."} + return gemini_response_content + + def generate_until(self, requests) -> List[str]: + res = [] + pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") + + for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + # encode, pad, and truncate contexts for this batch + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + imgs = [] # multiple images or frames for video + for visual in visuals: + if self.modality == "image": + img = self.encode_image(visual) + imgs.append(img) + elif self.modality == "video": + frames, audio = self.encode_video(visual, self.max_frames_for_video, self.frame_rate) # FIXME: I am not sure how to put audio information into query, please modify this + imgs.extend(frames) + + ########################## Implement the following code snippet ########################## + + # input = [("text", "what does this video describe?"), ("image_bytes", image_png_bytes), ("image_bytes", image_png_bytes), ("image_bytes", image_png_bytes), ....] + gemini_input_content = {"example_id": "placeholder", "request_content": [("text", contexts)]} + gemini_input_content["request_content"].extend([("image_bytes", img) for img in imgs]) + + gemini_output_content = self.model_call(gemini_input_content) + text_content = gemini_output_content["response_content"] + ########################## Implement the above code snippet ############################## + res.append(text_content) + pbar.update(1) + return res + + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + # TODO + assert False, "Gemini Model not support" diff --git a/lmms_eval/models/idefics2.py b/lmms_eval/models/idefics2.py index 4bbd393c3..42035a9f9 100644 --- a/lmms_eval/models/idefics2.py +++ b/lmms_eval/models/idefics2.py @@ -17,12 +17,14 @@ eval_logger = logging.getLogger("lmms-eval") DEFAULT_IMAGE_TOKEN = "" -try: +try: import flash_attn + best_fit_attn_implementation = "flash_attention_2" except ImportError: best_fit_attn_implementation = "eager" + @register_model("idefics2") class Idefics2(lmms): """ @@ -50,7 +52,7 @@ def __init__( attn_implementation: Optional[str] = best_fit_attn_implementation, device_map: str = "", use_cache: bool = True, - do_image_splitting: bool =False, + do_image_splitting: bool = False, **kwargs, ) -> None: super().__init__() @@ -194,7 +196,7 @@ def _collate(x): # we assume all gen kwargs in the batch are the same # this is safe to assume because the `grouper` object ensures it. gen_kwargs = all_gen_kwargs[0] - # + # until = gen_kwargs.pop("until", None) prompts = [] for context, visual in zip(contexts, visuals): @@ -211,9 +213,9 @@ def _collate(x): output_ids = self.model.generate(**inputs, **gen_kwargs) # only retain the generated text for output_id, input_id in zip(output_ids, inputs["input_ids"]): - generated_id = output_id[len(input_id):] + generated_id = output_id[len(input_id) :] generated_text = self.tokenizer.decode(generated_id, skip_special_tokens=True) - + res.append(generated_text) pbar.update(1) # reorder this group of results back to original unsorted form diff --git a/lmms_eval/tasks/worldqa/_default_template_yaml b/lmms_eval/tasks/worldqa/_default_template_yaml index f3202b828..7fd6e9484 100644 --- a/lmms_eval/tasks/worldqa/_default_template_yaml +++ b/lmms_eval/tasks/worldqa/_default_template_yaml @@ -6,4 +6,4 @@ dataset_kwargs: model_specific_prompt_kwargs: default: pre_prompt: "" - post_prompt: "" \ No newline at end of file + post_prompt: "\nAnswer with the option's letter from the given choices directly." \ No newline at end of file diff --git a/lmms_eval/tasks/worldqa/utils.py b/lmms_eval/tasks/worldqa/utils.py index 421508eb8..a9120387a 100755 --- a/lmms_eval/tasks/worldqa/utils.py +++ b/lmms_eval/tasks/worldqa/utils.py @@ -1,8 +1,9 @@ -import numpy as np +import re import os import sys import datetime import lmms_eval.tasks._task_utils.file_utils as file_utils +from lmms_eval.filters.extraction import ExtendedRegexFilter import json import logging import yaml @@ -60,7 +61,7 @@ def worldqa_doc_to_text(doc, model_specific_prompt_kwargs=None): if "option" in doc: for op in doc["option"]: question += "\n" + op - post_prompt = "\nAnswer with the option's letter from the given choices directly." + # post_prompt = "\nAnswer with the option's letter from the given choices directly." return f"{pre_prompt}{question}{post_prompt}" @@ -110,3 +111,67 @@ def worldqa_aggregate_mc_ppl(results, args): def worldqa_doc_to_choice(doc): return [op.split(".")[1].strip() for op in doc["option"]] + + +class MultiChoiceRegexFilter(ExtendedRegexFilter): + def __init__(self, *args, **kwargs): + """ + regex_pattern: The basic regex pattern to use. If fails to match, we will use the customized match procedure + - step 1 : We parse the choices between ([A-Z])s then try to find these choices in the response. + - step 2 : We parse the choice with regex :[\s]*([A-?]), where ? varies by number of choices. + group_select: Selects the (group_select)th match from the findall result. + ignore_case: Ignores the case during step 1 matching + ignore_punctuation: Remove the punctuation during step 1 matching + regexes_to_ignore: Remove these regexes during step 1 matching + """ + super().__init__(*args, **kwargs) + + def apply(self, resps, docs): + # here, we assume we have a list, in which each element is + # a list of model responses for some particular input/target pair. + # so we process each of these (same input/target response sets) + # independently (and keep them a list.) + + filtered_resps = [] + + for r, doc in zip(resps, docs): + fallback_regexes = [] + choice_to_alpha = {} + next_alpha = "A" + + question = doc["question"] + if "option" in doc: + for op in doc["option"]: + question += "\n" + op + # Regex to extract multiple choice options from the question + multiple_choices_regex = re.compile(r"\b([A-Z])\.\s+([^\n]*)") + matches = multiple_choices_regex.findall(question) + + # Build regex patterns and mappings for each choice + for m in matches: + choice_text = m[1].strip() + fallback_regexes.append(f"{re.escape(choice_text)}") + choice_to_alpha[choice_text] = next_alpha + + next_alpha = chr(ord(next_alpha) + 1) + + # Compile regex to match any of the extracted choices + fallback_regex = re.compile("|".join(fallback_regexes)) + + # Process each response + filtered = [] + for resp in r: + # Remove any punctuation and extra spaces + cleaned_resp = re.sub(r"[^\w\s]", "", resp).strip() + # Try to match cleaned response with the choice text + match = fallback_regex.search(cleaned_resp) + if match and match.group() in choice_to_alpha: + # Map the matched choice text back to its corresponding letter + filtered.append(choice_to_alpha[match.group()]) + else: + # If no match, return the cleaned response + filtered.append(cleaned_resp) + + filtered_resps.append(filtered[0]) + + return filtered_resps diff --git a/lmms_eval/tasks/worldqa/worldqa.yaml b/lmms_eval/tasks/worldqa/worldqa.yaml new file mode 100644 index 000000000..4b77db4d0 --- /dev/null +++ b/lmms_eval/tasks/worldqa/worldqa.yaml @@ -0,0 +1,5 @@ +group: worldqa +task: +- worldqa_gen +- worldqa_mc + diff --git a/lmms_eval/tasks/worldqa/worldqa_mc.yaml b/lmms_eval/tasks/worldqa/worldqa_mc.yaml index e9681ad13..e0d121096 100755 --- a/lmms_eval/tasks/worldqa/worldqa_mc.yaml +++ b/lmms_eval/tasks/worldqa/worldqa_mc.yaml @@ -8,4 +8,14 @@ doc_to_target: !function utils.worldqa_doc_to_answer_mc metric_list: - metric: exact_match higher_is_better: true + +filter_list: + - name: "flexible-extract" + filter: + - function: !function utils.MultiChoiceRegexFilter + group_select: 0 + ignore_case: true + ignore_punctuation: true + regex_pattern: "(\\([A-Z]\\))" + include: _default_template_yaml From d64be021123d916f1ec474727974dc368c7a1741 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Wed, 1 May 2024 06:39:17 +0000 Subject: [PATCH 023/181] Add 'decord' to dependencies in pyproject.toml --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index a1b5893b3..b66d5e9f0 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,6 +55,7 @@ dependencies = [ "pre-commit", "pydantic", "packaging", + "decord", ] [tool.setuptools.packages.find] From 6377474e3839f31d38b6fb0a276b480cd4088b60 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Wed, 1 May 2024 06:43:43 +0000 Subject: [PATCH 024/181] Update default value for log_samples_suffix --- lmms_eval/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lmms_eval/__main__.py b/lmms_eval/__main__.py index e1d366aa4..15eef6ed5 100755 --- a/lmms_eval/__main__.py +++ b/lmms_eval/__main__.py @@ -106,7 +106,7 @@ def parse_eval_args() -> argparse.Namespace: parser.add_argument( "--log_samples_suffix", type=str, - default="", + default="model_outputs", help="Specify a suffix for the log_samples file name.", ) parser.add_argument( From ee31b42a175fce0dddbbbb91fce37d77742714a4 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Wed, 1 May 2024 07:04:51 +0000 Subject: [PATCH 025/181] Update gemini_input_content example_id to use doc_id --- lmms_eval/models/gemini_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lmms_eval/models/gemini_model.py b/lmms_eval/models/gemini_model.py index b474099c6..2050c5996 100644 --- a/lmms_eval/models/gemini_model.py +++ b/lmms_eval/models/gemini_model.py @@ -148,7 +148,7 @@ def generate_until(self, requests) -> List[str]: ########################## Implement the following code snippet ########################## # input = [("text", "what does this video describe?"), ("image_bytes", image_png_bytes), ("image_bytes", image_png_bytes), ("image_bytes", image_png_bytes), ....] - gemini_input_content = {"example_id": "placeholder", "request_content": [("text", contexts)]} + gemini_input_content = {"example_id": f"{doc_id:06d}", "request_content": [("text", contexts)]} gemini_input_content["request_content"].extend([("image_bytes", img) for img in imgs]) gemini_output_content = self.model_call(gemini_input_content) From f49d35d5ac391991bb7598e83fe5f24f96eef5be Mon Sep 17 00:00:00 2001 From: kcz358 Date: Thu, 2 May 2024 11:14:19 +0800 Subject: [PATCH 026/181] Add worldqa gpt eval --- .../tasks/worldqa/_default_template_yaml | 5 +- lmms_eval/tasks/worldqa/utils.py | 86 ++++++++++++++++++- 2 files changed, 89 insertions(+), 2 deletions(-) diff --git a/lmms_eval/tasks/worldqa/_default_template_yaml b/lmms_eval/tasks/worldqa/_default_template_yaml index 7fd6e9484..64b36c176 100644 --- a/lmms_eval/tasks/worldqa/_default_template_yaml +++ b/lmms_eval/tasks/worldqa/_default_template_yaml @@ -6,4 +6,7 @@ dataset_kwargs: model_specific_prompt_kwargs: default: pre_prompt: "" - post_prompt: "\nAnswer with the option's letter from the given choices directly." \ No newline at end of file + post_prompt: "\nAnswer with the option's letter from the given choices directly." +metadata: + version: 0.0 + gpt_eval_model_name: "gpt-4-0613" \ No newline at end of file diff --git a/lmms_eval/tasks/worldqa/utils.py b/lmms_eval/tasks/worldqa/utils.py index a9120387a..79a9ba7dd 100755 --- a/lmms_eval/tasks/worldqa/utils.py +++ b/lmms_eval/tasks/worldqa/utils.py @@ -8,6 +8,10 @@ import logging import yaml from pathlib import Path +import requests +import time + +NUM_SECONDS_TO_SLEEP=5 with open(Path(__file__).parent / "_default_template_yaml", "r") as f: raw_data = f.readlines() @@ -19,6 +23,84 @@ config = yaml.safe_load("".join(safe_data)) +GPT_EVAL_MODEL_NAME = config["metadata"]["gpt_eval_model_name"] + +API_TYPE = os.getenv("API_TYPE", "openai") + +if API_TYPE == "openai": + API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") + API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } +elif API_TYPE == "azure": + API_URL = os.getenv("AZURE_ENDPOINT", "https://api.cognitive.microsoft.com/sts/v1.0/issueToken") + API_KEY = os.getenv("AZURE_API_KEY", "YOUR_API_KEY") + headers = { + "api-key": API_KEY, + "Content-Type": "application/json", + } + +eval_prompt = """You are an AI assistant who will help me to evaluate the quality of the candidate responses belonging to a question. The quality of the responses should be referred to the ground truth response. + +Some criterion +- Response that perfectly reflect the key points in the ground truth: 1 point +- Response that reflect none of the key points in the ground truth: 0 point +- Some part in the response are correct but other parts in the response are contrast to the ground truth: 0.3 point +- Some part in the response are correct but some parts in the ground truth are not mentioned in the response: 0.5 point +- Some part in the response are correct but other parts in the response are not mentioned in the ground truth: 0.5 point + +Your output should be in the following format: +Keypoint in the ground truth response: +XXX +Rationale: +XXXX +Point: +1/0.5/0.3/0 + +Let's begin this task: +question: {question} +ground truth: {answer} +candidate: {candidate}""" + + +def get_eval(question: str, ground_truth : str, candidate : str, max_tokens: int, retries: int = 5): + global headers + + content = eval_prompt.format(question=question, answer=ground_truth, candidate=candidate) + + messages = [ + {"role": "user", "content": content}, + ] + + payload = { + "model": GPT_EVAL_MODEL_NAME, + "messages": messages, + "temperature": 0.2, + "max_tokens": max_tokens, + } + + for attempt in range(retries): + try: + response = requests.post(API_URL, headers=headers, json=payload, timeout=60) + response.raise_for_status() + response_data = response.json() + + content = response_data["choices"][0]["message"]["content"].strip() + if content != "": + return content, response_data["model"] + break # If successful, break out of the loop + + except Exception as e: + eval_logger.info(f"Attempt {attempt + 1} failed with error: {e}") + if attempt < retries: # If we have retries left, sleep and then continue to next attempt + time.sleep(NUM_SECONDS_TO_SLEEP) + else: # If this was the last attempt, log and return empty + eval_logger.error(f"All {retries} attempts failed. Last error message: {e}") + return "", "" + return "", "" + # A bit ugly here # But the idea is that we will unzip all the zip files # To HF HOME cache dir @@ -84,7 +166,9 @@ def worldqa_doc_to_answer_mc_ppl(doc): # Your metric name should have the same key name in your return dict def worldqa_process_results(doc, result): pred = result[0] - return {"submission": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"]}} + eval_answer = get_eval(question=doc["question"], ground_truth=doc["answer"], candidate=pred, max_tokens=1024) + return {"submission": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "eval_answer" : eval_answer}} + def worldqa_aggregate_submissions(results, args, task): From b4e15d254af88358e7bc0e7469b58501a9856554 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Thu, 2 May 2024 04:27:21 +0000 Subject: [PATCH 027/181] Add gpt eval in metric list --- lmms_eval/tasks/worldqa/utils.py | 24 +++++++++++++++++-- .../tasks/worldqa/worldqa_generation.yaml | 3 +++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/lmms_eval/tasks/worldqa/utils.py b/lmms_eval/tasks/worldqa/utils.py index 79a9ba7dd..9a930471c 100755 --- a/lmms_eval/tasks/worldqa/utils.py +++ b/lmms_eval/tasks/worldqa/utils.py @@ -166,8 +166,12 @@ def worldqa_doc_to_answer_mc_ppl(doc): # Your metric name should have the same key name in your return dict def worldqa_process_results(doc, result): pred = result[0] - eval_answer = get_eval(question=doc["question"], ground_truth=doc["answer"], candidate=pred, max_tokens=1024) - return {"submission": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "eval_answer" : eval_answer}} + content = eval_prompt.format(question=doc["question"], answer=doc["answer"], candidate=pred) + eval_answer, model_name = get_eval(question=doc["question"], ground_truth=doc["answer"], candidate=pred, max_tokens=1024) + return { + "submission": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "eval_answer" : eval_answer, "gpt_prompt" : content}, + "gpt_eval": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "eval_answer" : eval_answer, "gpt_prompt" : content}, + } @@ -179,6 +183,19 @@ def worldqa_aggregate_submissions(results, args, task): json.dump(results, f) eval_logger.info(f"Submission file saved to {path}") +def worldq_gen_gpt_eval(results, args): + score = 0 + for result in results: + eval_answer = result["eval_answer"] + eval_score = eval_answer.split("\n")[-1].strip() + try: + eval_score = float(eval_score) + except: + eval_score = 0.0 + score += eval_score + + return score / len(results) + # Factory into different aggregate def worldqa_aggregate_gen(results, args): @@ -192,6 +209,9 @@ def worldqa_aggregate_mc(results, args): def worldqa_aggregate_mc_ppl(results, args): worldqa_aggregate_submissions(results, args, "MC_PPL") +def worldqa_aggregate_gen_eval(results, args): + return + def worldqa_doc_to_choice(doc): return [op.split(".")[1].strip() for op in doc["option"]] diff --git a/lmms_eval/tasks/worldqa/worldqa_generation.yaml b/lmms_eval/tasks/worldqa/worldqa_generation.yaml index 68be5412e..0640d3d62 100755 --- a/lmms_eval/tasks/worldqa/worldqa_generation.yaml +++ b/lmms_eval/tasks/worldqa/worldqa_generation.yaml @@ -10,4 +10,7 @@ metric_list: - metric: submission aggregation: !function utils.worldqa_aggregate_gen higher_is_better: true + - metric: gpt_eval + aggregation: !function utils.worldq_gen_gpt_eval + higher_is_better: true include: _default_template_yaml From 656184a7251372209e750802cad7c880dd17f114 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Thu, 2 May 2024 06:13:56 +0000 Subject: [PATCH 028/181] Add model_name parameter to Llava constructor --- lmms_eval/models/llava.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lmms_eval/models/llava.py b/lmms_eval/models/llava.py index 8d8e135ad..ba1617bd9 100755 --- a/lmms_eval/models/llava.py +++ b/lmms_eval/models/llava.py @@ -67,6 +67,7 @@ def __init__( batch_size: Optional[Union[int, str]] = 1, trust_remote_code: Optional[bool] = False, revision=None, + model_name=None, attn_implementation=best_fit_attn_implementation, device_map="cuda:0", conv_template="vicuna_v1", @@ -101,13 +102,14 @@ def __init__( if "use_flash_attention_2" in kwargs: llava_model_args["use_flash_attention_2"] = kwargs["use_flash_attention_2"] + model_name = model_name if model_name is not None else get_model_name_from_path(pretrained) try: # Try to load the model with the multimodal argument - self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, get_model_name_from_path(pretrained), device_map=self.device_map, **llava_model_args) + self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, model_name, device_map=self.device_map, **llava_model_args) except TypeError: # for older versions of LLaVA that don't have multimodal argument llava_model_args.pop("multimodal", None) - self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, get_model_name_from_path(pretrained), device_map=self.device_map, **llava_model_args) + self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, model_name, device_map=self.device_map, **llava_model_args) self._config = self._model.config self.model.eval() From 65abc44a0406dba26c5f4dd080022ae610898aa4 Mon Sep 17 00:00:00 2001 From: Li Bo Date: Thu, 2 May 2024 18:34:11 +0800 Subject: [PATCH 029/181] [WIP] Add Gemini interface for worldqa, update worldqa's filtering logic for multiple-choice matching. (#82) * Add video encoding functionality and update prompt for video modality * Add Accelerator and DistributedType imports*** ***Update torch version check in Llava model*** ***Handle older versions of LLaVA without multimodal argument * Add Gemini API/Model and update filtering logic for worldqa * Add 'decord' to dependencies in pyproject.toml * Update default value for log_samples_suffix * Update gemini_input_content example_id to use doc_id * Add worldqa gpt eval * Add gpt eval in metric list * Add model_name parameter to Llava constructor --------- Co-authored-by: kcz358 --- lmms_eval/__main__.py | 2 +- lmms_eval/models/__init__.py | 2 + lmms_eval/models/gemini_api.py | 192 ++++++++++++++++++ lmms_eval/models/gemini_model.py | 163 +++++++++++++++ lmms_eval/models/idefics2.py | 12 +- lmms_eval/models/llava.py | 6 +- .../tasks/worldqa/_default_template_yaml | 5 +- lmms_eval/tasks/worldqa/utils.py | 175 +++++++++++++++- lmms_eval/tasks/worldqa/worldqa.yaml | 5 + .../tasks/worldqa/worldqa_generation.yaml | 3 + lmms_eval/tasks/worldqa/worldqa_mc.yaml | 10 + pyproject.toml | 1 + 12 files changed, 564 insertions(+), 12 deletions(-) create mode 100644 lmms_eval/models/gemini_api.py create mode 100644 lmms_eval/models/gemini_model.py create mode 100644 lmms_eval/tasks/worldqa/worldqa.yaml diff --git a/lmms_eval/__main__.py b/lmms_eval/__main__.py index e1d366aa4..15eef6ed5 100755 --- a/lmms_eval/__main__.py +++ b/lmms_eval/__main__.py @@ -106,7 +106,7 @@ def parse_eval_args() -> argparse.Namespace: parser.add_argument( "--log_samples_suffix", type=str, - default="", + default="model_outputs", help="Specify a suffix for the log_samples file name.", ) parser.add_argument( diff --git a/lmms_eval/models/__init__.py b/lmms_eval/models/__init__.py index a97831158..d2b52c4f3 100755 --- a/lmms_eval/models/__init__.py +++ b/lmms_eval/models/__init__.py @@ -16,6 +16,8 @@ "qwen_vl_api": "Qwen_VL_API", "llava_sglang": "LlavaSglang", "idefics2": "Idefics2", + "gemini_api": "GeminiAPI", + "gemini_model": "GeminiModel", } for model_name, model_class in AVAILABLE_MODELS.items(): diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py new file mode 100644 index 000000000..01a7a1f36 --- /dev/null +++ b/lmms_eval/models/gemini_api.py @@ -0,0 +1,192 @@ +from io import BytesIO +from copy import deepcopy +import numpy as np +import os +import base64 +from typing import List, Tuple +from tqdm import tqdm +import requests as url_requests +import time +import logging + +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model +from lmms_eval import utils + +from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs +from accelerate.state import AcceleratorState + +try: + from decord import VideoReader, AudioReader, cpu +except ImportError: + pass + +from PIL import Image + +eval_logger = logging.getLogger("lmms-eval") + +NUM_SECONDS_TO_SLEEP = 5 +API_TYPE = os.getenv("API_TYPE", "openai") +if API_TYPE == "openai": # FIXME: Please modify this to support other type of API + API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") + API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } +else: + eval_logger.error("API_TYPE not supported") + + +@register_model("gemini_api") +class GeminiAPI(lmms): + def __init__( + self, + model_version: str = "gpt-4-turbo", # FIXME: Please modify this to support real gemini model version + modality: str = "video", + max_frames_for_video: int = -1, + frame_rate: int = -1, + timeout: int = 120, + **kwargs, + ) -> None: + super().__init__() + self.model_version = model_version + self.modality = modality + self.max_frames_for_video = max_frames_for_video + self.frame_rate = frame_rate + assert self.modality in ["image", "video"], "Modality must be either image or video" + assert self.max_frames_for_video == -1 or self.frame_rate == -1, "max_frames_for_video and frame_rate cannot be provided at the same time" + assert self.max_frames_for_video == -1 if self.frame_rate != -1 else True, "max_frames_for_video must be -1 if frame_rate > 0" + self.image_token = "" # In case the question contains token for placeholder + self.timeout = timeout + + accelerator = Accelerator() # This is not neccessary, it is only used to get the rank and world size + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + + self.device = self.accelerator.device + + # Function to encode the image + def encode_image(self, image: Image): + output_buffer = BytesIO() + image.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + return base64_str + + # Function to encode the video + def encode_video(self, video_path, for_get_frames_num=-1, frame_rate=-1): + assert for_get_frames_num != -1 or frame_rate != -1, "Either for_get_frames_num or frame_rate must be provided" + vr = VideoReader(video_path, ctx=cpu(0)) + total_frame_num = len(vr) + if for_get_frames_num != -1: + uniform_sampled_frames = np.linspace(0, total_frame_num - 1, for_get_frames_num, dtype=int) + frame_idx = uniform_sampled_frames.tolist() + else: + frame_idx = range(0, total_frame_num, frame_rate) + frames = vr.get_batch(frame_idx).asnumpy() + + base64_frames = [] + for frame in frames: + img = Image.fromarray(frame) + output_buffer = BytesIO() + img.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + base64_frames.append(base64_str) + + # Extract audio + try: + ar = AudioReader(video_path, sample_rate=44100, mono=False, ctx=cpu(0)) + audio = ar.get_batch(frame_idx).asnumpy() + audio_buffer = BytesIO() + audio.save(audio_buffer, format="mp3") + audio_byte_data = audio_buffer.getvalue() + base64_audio = base64.b64encode(audio_byte_data).decode("utf-8") + except Exception as e: + eval_logger.error(f"Error extracting audio or no audio found for video: {video_path}") + base64_audio = None + + return base64_frames, base64_audio + + def flatten(self, input): + new_list = [] + for i in input: + for j in i: + new_list.append(j) + return new_list + + def generate_until(self, requests) -> List[str]: + res = [] + pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") + + for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + # encode, pad, and truncate contexts for this batch + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + imgs = [] # multiple images or frames for video + for visual in visuals: + if self.modality == "image": + img = self.encode_image(visual) + imgs.append(img) + elif self.modality == "video": + frames, audio = self.encode_video(visual, self.max_frames_for_video, self.frame_rate) # FIXME: I am not sure how to put audio information into query, please modify this + imgs.extend(frames) + + payload = {"model": self.model_version, "messages": []} + response_json = {"role": "user", "content": []} + # When there is no image token in the context, append the image to the text + if self.image_token not in contexts: + payload["messages"].append(deepcopy(response_json)) + payload["messages"][0]["content"].append({"type": "text", "text": contexts}) + for img in imgs: + payload["messages"][0]["content"].append({"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{img}"}}) + else: + contexts = contexts.split(self.image_token) + for idx, img in enumerate(imgs): + payload["messages"].append(deepcopy(response_json)) + payload["messages"][idx]["content"].append({"type": "text", "text": contexts[idx]}) + payload["messages"][idx]["content"].append({"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{img}"}}) + + # If n image tokens are in the contexts + # contexts will be splitted into n+1 chunks + # Manually add it into the payload + payload["messages"].append(deepcopy(response_json)) + payload["messages"][-1]["content"].append({"type": "text", "text": contexts[-1]}) + + if "max_new_tokens" not in gen_kwargs: + gen_kwargs["max_new_tokens"] = 1024 + if "temperature" not in gen_kwargs: + gen_kwargs["temperature"] = 0 + + payload["max_tokens"] = gen_kwargs["max_new_tokens"] + payload["temperature"] = gen_kwargs["temperature"] + + for attempt in range(5): + try: + response = url_requests.post(API_URL, headers=headers, json=payload, timeout=self.timeout) + response_data = response.json() + + content = response_data["choices"][0]["message"]["content"].strip() + break # If successful, break out of the loop + + except Exception as e: + eval_logger.info(f"Attempt {attempt + 1} failed with error: {str(e)}") + if attempt < 5 - 1: # If we have retries left, sleep and then continue to next attempt + time.sleep(NUM_SECONDS_TO_SLEEP) + else: # If this was the last attempt, log and return empty + eval_logger.error(f"All 5 attempts failed. Last error message: {str(e)}") + content = "" + res.append(content) + pbar.update(1) + return res + + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + # TODO + assert False, "Gemini API not support" diff --git a/lmms_eval/models/gemini_model.py b/lmms_eval/models/gemini_model.py new file mode 100644 index 000000000..2050c5996 --- /dev/null +++ b/lmms_eval/models/gemini_model.py @@ -0,0 +1,163 @@ +from io import BytesIO +from copy import deepcopy +import numpy as np +import os +import base64 +from typing import List, Tuple +from tqdm import tqdm +import requests as url_requests +import time +import logging + +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model +from lmms_eval import utils + +from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs +from accelerate.state import AcceleratorState + +try: + from decord import VideoReader, AudioReader, cpu +except ImportError: + pass + +from PIL import Image + +eval_logger = logging.getLogger("lmms-eval") + +NUM_SECONDS_TO_SLEEP = 5 +API_TYPE = os.getenv("API_TYPE", "openai") +if API_TYPE == "openai": # FIXME: Please modify this to support other type of API + API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") + API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } +else: + eval_logger.error("API_TYPE not supported") + + +@register_model("gemini_model") +class GeminiModel(lmms): + def __init__( + self, + model_version: str = "gemini-pro", # FIXME: Please modify this to support real gemini model version + modality: str = "video", + max_frames_for_video: int = -1, + frame_rate: int = -1, + timeout: int = 120, + **kwargs, + ) -> None: + super().__init__() + self.model_version = model_version + self.modality = modality + self.max_frames_for_video = max_frames_for_video + self.frame_rate = frame_rate + assert self.modality in ["image", "video"], "Modality must be either image or video" + assert self.max_frames_for_video == -1 or self.frame_rate == -1, "max_frames_for_video and frame_rate cannot be provided at the same time" + assert self.max_frames_for_video == -1 if self.frame_rate != -1 else True, "max_frames_for_video must be -1 if frame_rate > 0" + self.image_token = "" # In case the question contains token for placeholder + self.timeout = timeout + + accelerator = Accelerator() # This is not neccessary, it is only used to get the rank and world size + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + + self.device = self.accelerator.device + + # Function to encode the image + def encode_image(self, image: Image): + output_buffer = BytesIO() + image.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + return base64_str + + # Function to encode the video + def encode_video(self, video_path, for_get_frames_num=-1, frame_rate=-1): + assert for_get_frames_num != -1 or frame_rate != -1, "Either for_get_frames_num or frame_rate must be provided" + vr = VideoReader(video_path, ctx=cpu(0)) + total_frame_num = len(vr) + if for_get_frames_num != -1: + uniform_sampled_frames = np.linspace(0, total_frame_num - 1, for_get_frames_num, dtype=int) + frame_idx = uniform_sampled_frames.tolist() + else: + frame_idx = range(0, total_frame_num, frame_rate) + frames = vr.get_batch(frame_idx).asnumpy() + + base64_frames = [] + for frame in frames: + img = Image.fromarray(frame) + output_buffer = BytesIO() + img.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + base64_frames.append(base64_str) + + # Extract audio + try: + ar = AudioReader(video_path, sample_rate=44100, mono=False, ctx=cpu(0)) + audio = ar.get_batch(frame_idx).asnumpy() + audio_buffer = BytesIO() + audio.save(audio_buffer, format="mp3") + audio_byte_data = audio_buffer.getvalue() + base64_audio = base64.b64encode(audio_byte_data).decode("utf-8") + except Exception as e: + eval_logger.error(f"Error extracting audio or no audio found for video: {video_path}") + base64_audio = None + + return base64_frames, base64_audio + + def flatten(self, input): + new_list = [] + for i in input: + for j in i: + new_list.append(j) + return new_list + + def model_call(self, gemini_global_content): + # TODO: Please implement the model call here + # input = [("text", "what does this video describe?"), ("image_bytes", image_png_bytes), ("image_bytes", image_png_bytes), ("image_bytes", image_png_bytes), ....] + gemini_response_content = {"example_id": gemini_global_content["example_id"], "response_content": "This is a placeholder response from the model. Please implement the model call."} + return gemini_response_content + + def generate_until(self, requests) -> List[str]: + res = [] + pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") + + for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + # encode, pad, and truncate contexts for this batch + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + imgs = [] # multiple images or frames for video + for visual in visuals: + if self.modality == "image": + img = self.encode_image(visual) + imgs.append(img) + elif self.modality == "video": + frames, audio = self.encode_video(visual, self.max_frames_for_video, self.frame_rate) # FIXME: I am not sure how to put audio information into query, please modify this + imgs.extend(frames) + + ########################## Implement the following code snippet ########################## + + # input = [("text", "what does this video describe?"), ("image_bytes", image_png_bytes), ("image_bytes", image_png_bytes), ("image_bytes", image_png_bytes), ....] + gemini_input_content = {"example_id": f"{doc_id:06d}", "request_content": [("text", contexts)]} + gemini_input_content["request_content"].extend([("image_bytes", img) for img in imgs]) + + gemini_output_content = self.model_call(gemini_input_content) + text_content = gemini_output_content["response_content"] + ########################## Implement the above code snippet ############################## + res.append(text_content) + pbar.update(1) + return res + + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + # TODO + assert False, "Gemini Model not support" diff --git a/lmms_eval/models/idefics2.py b/lmms_eval/models/idefics2.py index 4bbd393c3..42035a9f9 100644 --- a/lmms_eval/models/idefics2.py +++ b/lmms_eval/models/idefics2.py @@ -17,12 +17,14 @@ eval_logger = logging.getLogger("lmms-eval") DEFAULT_IMAGE_TOKEN = "" -try: +try: import flash_attn + best_fit_attn_implementation = "flash_attention_2" except ImportError: best_fit_attn_implementation = "eager" + @register_model("idefics2") class Idefics2(lmms): """ @@ -50,7 +52,7 @@ def __init__( attn_implementation: Optional[str] = best_fit_attn_implementation, device_map: str = "", use_cache: bool = True, - do_image_splitting: bool =False, + do_image_splitting: bool = False, **kwargs, ) -> None: super().__init__() @@ -194,7 +196,7 @@ def _collate(x): # we assume all gen kwargs in the batch are the same # this is safe to assume because the `grouper` object ensures it. gen_kwargs = all_gen_kwargs[0] - # + # until = gen_kwargs.pop("until", None) prompts = [] for context, visual in zip(contexts, visuals): @@ -211,9 +213,9 @@ def _collate(x): output_ids = self.model.generate(**inputs, **gen_kwargs) # only retain the generated text for output_id, input_id in zip(output_ids, inputs["input_ids"]): - generated_id = output_id[len(input_id):] + generated_id = output_id[len(input_id) :] generated_text = self.tokenizer.decode(generated_id, skip_special_tokens=True) - + res.append(generated_text) pbar.update(1) # reorder this group of results back to original unsorted form diff --git a/lmms_eval/models/llava.py b/lmms_eval/models/llava.py index 8d8e135ad..ba1617bd9 100755 --- a/lmms_eval/models/llava.py +++ b/lmms_eval/models/llava.py @@ -67,6 +67,7 @@ def __init__( batch_size: Optional[Union[int, str]] = 1, trust_remote_code: Optional[bool] = False, revision=None, + model_name=None, attn_implementation=best_fit_attn_implementation, device_map="cuda:0", conv_template="vicuna_v1", @@ -101,13 +102,14 @@ def __init__( if "use_flash_attention_2" in kwargs: llava_model_args["use_flash_attention_2"] = kwargs["use_flash_attention_2"] + model_name = model_name if model_name is not None else get_model_name_from_path(pretrained) try: # Try to load the model with the multimodal argument - self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, get_model_name_from_path(pretrained), device_map=self.device_map, **llava_model_args) + self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, model_name, device_map=self.device_map, **llava_model_args) except TypeError: # for older versions of LLaVA that don't have multimodal argument llava_model_args.pop("multimodal", None) - self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, get_model_name_from_path(pretrained), device_map=self.device_map, **llava_model_args) + self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, model_name, device_map=self.device_map, **llava_model_args) self._config = self._model.config self.model.eval() diff --git a/lmms_eval/tasks/worldqa/_default_template_yaml b/lmms_eval/tasks/worldqa/_default_template_yaml index f3202b828..64b36c176 100644 --- a/lmms_eval/tasks/worldqa/_default_template_yaml +++ b/lmms_eval/tasks/worldqa/_default_template_yaml @@ -6,4 +6,7 @@ dataset_kwargs: model_specific_prompt_kwargs: default: pre_prompt: "" - post_prompt: "" \ No newline at end of file + post_prompt: "\nAnswer with the option's letter from the given choices directly." +metadata: + version: 0.0 + gpt_eval_model_name: "gpt-4-0613" \ No newline at end of file diff --git a/lmms_eval/tasks/worldqa/utils.py b/lmms_eval/tasks/worldqa/utils.py index 421508eb8..9a930471c 100755 --- a/lmms_eval/tasks/worldqa/utils.py +++ b/lmms_eval/tasks/worldqa/utils.py @@ -1,12 +1,17 @@ -import numpy as np +import re import os import sys import datetime import lmms_eval.tasks._task_utils.file_utils as file_utils +from lmms_eval.filters.extraction import ExtendedRegexFilter import json import logging import yaml from pathlib import Path +import requests +import time + +NUM_SECONDS_TO_SLEEP=5 with open(Path(__file__).parent / "_default_template_yaml", "r") as f: raw_data = f.readlines() @@ -18,6 +23,84 @@ config = yaml.safe_load("".join(safe_data)) +GPT_EVAL_MODEL_NAME = config["metadata"]["gpt_eval_model_name"] + +API_TYPE = os.getenv("API_TYPE", "openai") + +if API_TYPE == "openai": + API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") + API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } +elif API_TYPE == "azure": + API_URL = os.getenv("AZURE_ENDPOINT", "https://api.cognitive.microsoft.com/sts/v1.0/issueToken") + API_KEY = os.getenv("AZURE_API_KEY", "YOUR_API_KEY") + headers = { + "api-key": API_KEY, + "Content-Type": "application/json", + } + +eval_prompt = """You are an AI assistant who will help me to evaluate the quality of the candidate responses belonging to a question. The quality of the responses should be referred to the ground truth response. + +Some criterion +- Response that perfectly reflect the key points in the ground truth: 1 point +- Response that reflect none of the key points in the ground truth: 0 point +- Some part in the response are correct but other parts in the response are contrast to the ground truth: 0.3 point +- Some part in the response are correct but some parts in the ground truth are not mentioned in the response: 0.5 point +- Some part in the response are correct but other parts in the response are not mentioned in the ground truth: 0.5 point + +Your output should be in the following format: +Keypoint in the ground truth response: +XXX +Rationale: +XXXX +Point: +1/0.5/0.3/0 + +Let's begin this task: +question: {question} +ground truth: {answer} +candidate: {candidate}""" + + +def get_eval(question: str, ground_truth : str, candidate : str, max_tokens: int, retries: int = 5): + global headers + + content = eval_prompt.format(question=question, answer=ground_truth, candidate=candidate) + + messages = [ + {"role": "user", "content": content}, + ] + + payload = { + "model": GPT_EVAL_MODEL_NAME, + "messages": messages, + "temperature": 0.2, + "max_tokens": max_tokens, + } + + for attempt in range(retries): + try: + response = requests.post(API_URL, headers=headers, json=payload, timeout=60) + response.raise_for_status() + response_data = response.json() + + content = response_data["choices"][0]["message"]["content"].strip() + if content != "": + return content, response_data["model"] + break # If successful, break out of the loop + + except Exception as e: + eval_logger.info(f"Attempt {attempt + 1} failed with error: {e}") + if attempt < retries: # If we have retries left, sleep and then continue to next attempt + time.sleep(NUM_SECONDS_TO_SLEEP) + else: # If this was the last attempt, log and return empty + eval_logger.error(f"All {retries} attempts failed. Last error message: {e}") + return "", "" + return "", "" + # A bit ugly here # But the idea is that we will unzip all the zip files # To HF HOME cache dir @@ -60,7 +143,7 @@ def worldqa_doc_to_text(doc, model_specific_prompt_kwargs=None): if "option" in doc: for op in doc["option"]: question += "\n" + op - post_prompt = "\nAnswer with the option's letter from the given choices directly." + # post_prompt = "\nAnswer with the option's letter from the given choices directly." return f"{pre_prompt}{question}{post_prompt}" @@ -83,7 +166,13 @@ def worldqa_doc_to_answer_mc_ppl(doc): # Your metric name should have the same key name in your return dict def worldqa_process_results(doc, result): pred = result[0] - return {"submission": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"]}} + content = eval_prompt.format(question=doc["question"], answer=doc["answer"], candidate=pred) + eval_answer, model_name = get_eval(question=doc["question"], ground_truth=doc["answer"], candidate=pred, max_tokens=1024) + return { + "submission": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "eval_answer" : eval_answer, "gpt_prompt" : content}, + "gpt_eval": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "eval_answer" : eval_answer, "gpt_prompt" : content}, + } + def worldqa_aggregate_submissions(results, args, task): @@ -94,6 +183,19 @@ def worldqa_aggregate_submissions(results, args, task): json.dump(results, f) eval_logger.info(f"Submission file saved to {path}") +def worldq_gen_gpt_eval(results, args): + score = 0 + for result in results: + eval_answer = result["eval_answer"] + eval_score = eval_answer.split("\n")[-1].strip() + try: + eval_score = float(eval_score) + except: + eval_score = 0.0 + score += eval_score + + return score / len(results) + # Factory into different aggregate def worldqa_aggregate_gen(results, args): @@ -107,6 +209,73 @@ def worldqa_aggregate_mc(results, args): def worldqa_aggregate_mc_ppl(results, args): worldqa_aggregate_submissions(results, args, "MC_PPL") +def worldqa_aggregate_gen_eval(results, args): + return + def worldqa_doc_to_choice(doc): return [op.split(".")[1].strip() for op in doc["option"]] + + +class MultiChoiceRegexFilter(ExtendedRegexFilter): + def __init__(self, *args, **kwargs): + """ + regex_pattern: The basic regex pattern to use. If fails to match, we will use the customized match procedure + - step 1 : We parse the choices between ([A-Z])s then try to find these choices in the response. + - step 2 : We parse the choice with regex :[\s]*([A-?]), where ? varies by number of choices. + group_select: Selects the (group_select)th match from the findall result. + ignore_case: Ignores the case during step 1 matching + ignore_punctuation: Remove the punctuation during step 1 matching + regexes_to_ignore: Remove these regexes during step 1 matching + """ + super().__init__(*args, **kwargs) + + def apply(self, resps, docs): + # here, we assume we have a list, in which each element is + # a list of model responses for some particular input/target pair. + # so we process each of these (same input/target response sets) + # independently (and keep them a list.) + + filtered_resps = [] + + for r, doc in zip(resps, docs): + fallback_regexes = [] + choice_to_alpha = {} + next_alpha = "A" + + question = doc["question"] + if "option" in doc: + for op in doc["option"]: + question += "\n" + op + # Regex to extract multiple choice options from the question + multiple_choices_regex = re.compile(r"\b([A-Z])\.\s+([^\n]*)") + matches = multiple_choices_regex.findall(question) + + # Build regex patterns and mappings for each choice + for m in matches: + choice_text = m[1].strip() + fallback_regexes.append(f"{re.escape(choice_text)}") + choice_to_alpha[choice_text] = next_alpha + + next_alpha = chr(ord(next_alpha) + 1) + + # Compile regex to match any of the extracted choices + fallback_regex = re.compile("|".join(fallback_regexes)) + + # Process each response + filtered = [] + for resp in r: + # Remove any punctuation and extra spaces + cleaned_resp = re.sub(r"[^\w\s]", "", resp).strip() + # Try to match cleaned response with the choice text + match = fallback_regex.search(cleaned_resp) + if match and match.group() in choice_to_alpha: + # Map the matched choice text back to its corresponding letter + filtered.append(choice_to_alpha[match.group()]) + else: + # If no match, return the cleaned response + filtered.append(cleaned_resp) + + filtered_resps.append(filtered[0]) + + return filtered_resps diff --git a/lmms_eval/tasks/worldqa/worldqa.yaml b/lmms_eval/tasks/worldqa/worldqa.yaml new file mode 100644 index 000000000..4b77db4d0 --- /dev/null +++ b/lmms_eval/tasks/worldqa/worldqa.yaml @@ -0,0 +1,5 @@ +group: worldqa +task: +- worldqa_gen +- worldqa_mc + diff --git a/lmms_eval/tasks/worldqa/worldqa_generation.yaml b/lmms_eval/tasks/worldqa/worldqa_generation.yaml index 68be5412e..0640d3d62 100755 --- a/lmms_eval/tasks/worldqa/worldqa_generation.yaml +++ b/lmms_eval/tasks/worldqa/worldqa_generation.yaml @@ -10,4 +10,7 @@ metric_list: - metric: submission aggregation: !function utils.worldqa_aggregate_gen higher_is_better: true + - metric: gpt_eval + aggregation: !function utils.worldq_gen_gpt_eval + higher_is_better: true include: _default_template_yaml diff --git a/lmms_eval/tasks/worldqa/worldqa_mc.yaml b/lmms_eval/tasks/worldqa/worldqa_mc.yaml index e9681ad13..e0d121096 100755 --- a/lmms_eval/tasks/worldqa/worldqa_mc.yaml +++ b/lmms_eval/tasks/worldqa/worldqa_mc.yaml @@ -8,4 +8,14 @@ doc_to_target: !function utils.worldqa_doc_to_answer_mc metric_list: - metric: exact_match higher_is_better: true + +filter_list: + - name: "flexible-extract" + filter: + - function: !function utils.MultiChoiceRegexFilter + group_select: 0 + ignore_case: true + ignore_punctuation: true + regex_pattern: "(\\([A-Z]\\))" + include: _default_template_yaml diff --git a/pyproject.toml b/pyproject.toml index a1b5893b3..b66d5e9f0 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,6 +55,7 @@ dependencies = [ "pre-commit", "pydantic", "packaging", + "decord", ] [tool.setuptools.packages.find] From ee3fcedfdec3bed28d9e6c8156f59291921c156f Mon Sep 17 00:00:00 2001 From: Bo Li Date: Fri, 3 May 2024 07:59:22 +0000 Subject: [PATCH 030/181] update --- lmms_eval/models/llama_vid.py | 2 +- lmms_eval/models/llava.py | 7 ++----- lmms_eval/models/llava_sglang.py | 3 +-- lmms_eval/models/llava_vid.py | 2 +- lmms_eval/models/video_llava.py | 2 +- lmms_eval/tasks/worldqa/utils.py | 16 +++++++++------- 6 files changed, 15 insertions(+), 17 deletions(-) diff --git a/lmms_eval/models/llama_vid.py b/lmms_eval/models/llama_vid.py index d9545a382..cd3e87965 100644 --- a/lmms_eval/models/llama_vid.py +++ b/lmms_eval/models/llama_vid.py @@ -29,7 +29,7 @@ from llamavid.model.builder import load_pretrained_model from llava.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria except ImportError: - eval_logger.error("LLaMA-Video is not installed. Please install LLaMA-Video to use this model.") + eval_logger.debug("LLaMA-Video is not installed. Please install LLaMA-Video to use this model.") @register_model("llama_vid") diff --git a/lmms_eval/models/llava.py b/lmms_eval/models/llava.py index ba1617bd9..77183f7a5 100755 --- a/lmms_eval/models/llava.py +++ b/lmms_eval/models/llava.py @@ -29,10 +29,7 @@ from llava.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN, IGNORE_INDEX from llava.conversation import conv_templates, SeparatorStyle except ImportError: - import traceback - - traceback.print_exc() - # eval_logger.error("LLaVA is not installed. Please install LLaVA to use this model.") + eval_logger.debug("LLaVA is not installed. Please install LLaVA to use this model.") from transformers.integrations.deepspeed import ( is_deepspeed_zero3_enabled, @@ -403,7 +400,7 @@ def _collate(x): input_ids = self.pad_sequence(input_ids_list, batch_first=True, padding_value=pad_token_ids).to(self.device) attention_masks = input_ids.ne(pad_token_ids).to(self.device) # These steps are not in LLaVA's original code, but are necessary for generation to work - # TODO: pay attention to this major generation step... + # TODO: attention to this major generation step... try: cont = self.model.generate( input_ids, diff --git a/lmms_eval/models/llava_sglang.py b/lmms_eval/models/llava_sglang.py index 01f23535d..10d5c98c3 100644 --- a/lmms_eval/models/llava_sglang.py +++ b/lmms_eval/models/llava_sglang.py @@ -25,7 +25,7 @@ import sglang as sgl from sglang.lang.chat_template import get_chat_template except ImportError: - eval_logger.error("SGLang is not installed. If you want to use llava_sglang, please install it using pip install 'sglang[all]' ") + eval_logger.debug("SGLang is not installed. If you want to use llava_sglang, please install it using pip install 'sglang[all]' ") if torch.__version__ > "2.1.2": best_fit_attn_implementation = "sdpa" @@ -66,7 +66,6 @@ def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: raise NotImplementedError("Llava-sglang does not support loglikelihood evaluation yet") def generate_until(self, requests: List[Instance]) -> List[str]: - runtime = sgl.Runtime(model_path=self.pretrained, tokenizer_path=self.tokenizer, tp_size=self.tp_size) runtime.endpoint.chat_template = get_chat_template(self.conv_template) sgl.set_default_backend(runtime) diff --git a/lmms_eval/models/llava_vid.py b/lmms_eval/models/llava_vid.py index d4f6a89bf..ae5b9e982 100755 --- a/lmms_eval/models/llava_vid.py +++ b/lmms_eval/models/llava_vid.py @@ -24,7 +24,7 @@ from llavavid.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN, IGNORE_INDEX from llavavid.conversation import conv_templates, SeparatorStyle except ImportError: - eval_logger.error("LLaVA-Video is not installed. Please install LLaVA-Video to use this model.") + eval_logger.debug("LLaVA-Video is not installed. Please install LLaVA-Video to use this model.") @register_model("llavavid") diff --git a/lmms_eval/models/video_llava.py b/lmms_eval/models/video_llava.py index bc25b7a5b..7aba4ab01 100644 --- a/lmms_eval/models/video_llava.py +++ b/lmms_eval/models/video_llava.py @@ -25,7 +25,7 @@ from videollava.utils import disable_torch_init from videollava.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria except ImportError: - eval_logger.error("Video-LLaVA is not installed. Please install Video-LLaVA to use this model.") + eval_logger.debug("Video-LLaVA is not installed. Please install Video-LLaVA to use this model.") @register_model("video_llava") diff --git a/lmms_eval/tasks/worldqa/utils.py b/lmms_eval/tasks/worldqa/utils.py index 9a930471c..0448012a5 100755 --- a/lmms_eval/tasks/worldqa/utils.py +++ b/lmms_eval/tasks/worldqa/utils.py @@ -11,7 +11,7 @@ import requests import time -NUM_SECONDS_TO_SLEEP=5 +NUM_SECONDS_TO_SLEEP = 5 with open(Path(__file__).parent / "_default_template_yaml", "r") as f: raw_data = f.readlines() @@ -65,7 +65,7 @@ candidate: {candidate}""" -def get_eval(question: str, ground_truth : str, candidate : str, max_tokens: int, retries: int = 5): +def get_eval(question: str, ground_truth: str, candidate: str, max_tokens: int, retries: int = 5): global headers content = eval_prompt.format(question=question, answer=ground_truth, candidate=candidate) @@ -101,6 +101,7 @@ def get_eval(question: str, ground_truth : str, candidate : str, max_tokens: int return "", "" return "", "" + # A bit ugly here # But the idea is that we will unzip all the zip files # To HF HOME cache dir @@ -169,12 +170,11 @@ def worldqa_process_results(doc, result): content = eval_prompt.format(question=doc["question"], answer=doc["answer"], candidate=pred) eval_answer, model_name = get_eval(question=doc["question"], ground_truth=doc["answer"], candidate=pred, max_tokens=1024) return { - "submission": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "eval_answer" : eval_answer, "gpt_prompt" : content}, - "gpt_eval": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "eval_answer" : eval_answer, "gpt_prompt" : content}, + "submission": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "eval_answer": eval_answer, "gpt_prompt": content}, + "gpt_eval": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "eval_answer": eval_answer, "gpt_prompt": content}, } - def worldqa_aggregate_submissions(results, args, task): now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") submission_file_name = f"worldqa-{task}-{now_date_time}.json" @@ -183,6 +183,7 @@ def worldqa_aggregate_submissions(results, args, task): json.dump(results, f) eval_logger.info(f"Submission file saved to {path}") + def worldq_gen_gpt_eval(results, args): score = 0 for result in results: @@ -193,7 +194,7 @@ def worldq_gen_gpt_eval(results, args): except: eval_score = 0.0 score += eval_score - + return score / len(results) @@ -209,8 +210,9 @@ def worldqa_aggregate_mc(results, args): def worldqa_aggregate_mc_ppl(results, args): worldqa_aggregate_submissions(results, args, "MC_PPL") + def worldqa_aggregate_gen_eval(results, args): - return + return def worldqa_doc_to_choice(doc): From bce39fecbec333ac4e8a70171b85c5a95a812611 Mon Sep 17 00:00:00 2001 From: choiszt Date: Fri, 3 May 2024 12:01:48 +0000 Subject: [PATCH 031/181] add InternVL_chat_1.5b model for lmmseval --- .gitignore | 2 + 1.jpg | Bin 0 -> 78872 bytes InternVL | 1 + lmms_eval/evaluator.py | 2 +- lmms_eval/models/__init__.py | 31 +-- lmms_eval/models/internvl.py | 501 +++++++++++++++++++++++++++++++++++ lmms_eval/models/llava.py | 3 +- lmms_eval/tasks/__init__.py | 2 +- 8 files changed, 524 insertions(+), 18 deletions(-) create mode 100644 1.jpg create mode 160000 InternVL create mode 100644 lmms_eval/models/internvl.py diff --git a/.gitignore b/.gitignore index 9441eafc0..4f9826e67 100755 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,5 @@ lmms_eval/tasks/hallusion_bench/hallusion_output_vd_model.json zk.log cache_dir ckpt +pretrained/ +LLaVA/ \ No newline at end of file diff --git a/1.jpg b/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dc5d849fcaf8165cdf9a232af472b19cd36ba864 GIT binary patch literal 78872 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 >fOT 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

?w^JpvC|_LRLyq%7glR5<|Kys5yl&rl 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 E1!Ooh5dZ)H literal 0 HcmV?d00001 diff --git a/InternVL b/InternVL new file mode 160000 index 000000000..e611cdd61 --- /dev/null +++ b/InternVL @@ -0,0 +1 @@ +Subproject commit e611cdd613485e4a47f0289b616a7db0b4db8451 diff --git a/lmms_eval/evaluator.py b/lmms_eval/evaluator.py index d4e6370db..fda3e173d 100755 --- a/lmms_eval/evaluator.py +++ b/lmms_eval/evaluator.py @@ -285,7 +285,7 @@ def evaluate( cloned_reqs.extend([req] * req.repeats) # run requests through model - resps = getattr(lm, reqtype)(cloned_reqs) + resps = getattr(lm, reqtype)(cloned_reqs)#Choiszt run generate until # put responses from model into a list of length K for each request. for x, req in zip(resps, cloned_reqs): diff --git a/lmms_eval/models/__init__.py b/lmms_eval/models/__init__.py index a97831158..e9a2d975e 100755 --- a/lmms_eval/models/__init__.py +++ b/lmms_eval/models/__init__.py @@ -2,27 +2,28 @@ AVAILABLE_MODELS = { "llava": "Llava", - "qwen_vl": "Qwen_VL", - "fuyu": "Fuyu", - "gpt4v": "GPT4V", - "instructblip": "InstructBLIP", - "minicpm_v": "MiniCPM_V", - "llava_vid": "LlavaVid", - "videoChatGPT": "VideoChatGPT", - "llama_vid": "LLaMAVid", - "video_llava": "VideoLLaVA", - "xcomposer2_4KHD": "XComposer2_4KHD", - "claude": "Claude", - "qwen_vl_api": "Qwen_VL_API", - "llava_sglang": "LlavaSglang", - "idefics2": "Idefics2", + # "qwen_vl": "Qwen_VL", + # "fuyu": "Fuyu", + # "gpt4v": "GPT4V", + # "instructblip": "InstructBLIP", + # "minicpm_v": "MiniCPM_V", + # "llava_vid": "LlavaVid", + # "videoChatGPT": "VideoChatGPT", + # "llama_vid": "LLaMAVid", + # "video_llava": "VideoLLaVA", + # "xcomposer2_4KHD": "XComposer2_4KHD", + # "claude": "Claude", + # "qwen_vl_api": "Qwen_VL_API", + # "llava_sglang": "LlavaSglang", + # "idefics2": "Idefics2", + "internvl":"InternVLChat" } for model_name, model_class in AVAILABLE_MODELS.items(): try: exec(f"from .{model_name} import {model_class}") except ImportError: - pass + print(model_name) import hf_transfer diff --git a/lmms_eval/models/internvl.py b/lmms_eval/models/internvl.py new file mode 100644 index 000000000..2b91f543e --- /dev/null +++ b/lmms_eval/models/internvl.py @@ -0,0 +1,501 @@ +import logging +import os +from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs +from accelerate.state import AcceleratorState +from typing import List, Optional, Union, Tuple +import torch +from tqdm import tqdm +# from decord import VideoReader, cpu +import numpy as np +import math +from datetime import timedelta +from transformers import AutoConfig +from huggingface_hub import snapshot_download +import requests + +from lmms_eval import utils +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model +from lmms_eval.utils import stop_sequences_criteria +from PIL import Image + +import subprocess +from pathlib import Path +wd = Path(__file__).parent.parent.parent.resolve() +import sys +sys.path.append(os.path.join(str(wd),"InternVL","internvl_chat")) + +eval_logger = logging.getLogger("lmms-eval") + +try: + from internvl.model.internlm2.modeling_internlm2 import InternLM2ForCausalLM + from internvl.model.internvl_chat.configuration_internvl_chat import InternVLChatConfig + from internvl.model.internvl_chat.modeling_intern_vit import InternVisionModel + from internvl.model.internvl_chat import InternVLChatModel + from internvl.train.dataset import build_transform, dynamic_preprocess +except ImportError: + eval_logger.error("InternVL is not installed. Please install InternVL to use this model.") + + + +import warnings +from typing import Any, List, Optional, Tuple, Union + +import torch.utils.checkpoint + +from peft import LoraConfig, get_peft_model +from torch import nn +from torch.nn import CrossEntropyLoss +from transformers import (AutoModel, GenerationConfig, LlamaForCausalLM, + LlamaTokenizer) +from transformers.modeling_outputs import CausalLMOutputWithPast +from transformers.modeling_utils import PreTrainedModel +from transformers import AutoTokenizer +import re + + + + +@register_model("internvl") +class InternVLChat(lmms): + config_class = InternVLChatConfig + main_input_name = 'pixel_values' + _no_split_modules = ['InternVisionEncoderLayer', 'LlamaDecoderLayer'] + + def __init__( + self, config: Optional[InternVLChatConfig] = None, + pretrained:str="OpenGVLab/InternVL-Chat-V1-5", + truncation: Optional[bool] = True, + device: Optional[str] = "cuda:0", + dtype: Optional[Union[str, torch.dtype]] = "auto", + batch_size: Optional[Union[int, str]] = 1, + trust_remote_code: Optional[bool] = False, + revision=None, + device_map="cuda:0", + conv_template="vicuna_v1", + use_cache=True, + truncate_context=False, # whether to truncate the context in generation, set it False for LLaVA-1.6 + customized_config=None, # ends in json + dynamic=True, + load_in_8bit=False, + vision_model=None, + language_model=None, + max_num=12, + **kwargs, + ) -> None: + super().__init__() + + assert kwargs == {}, f"Unexpected kwargs: {kwargs}" + + accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) + accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) + if accelerator.num_processes > 1: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + elif accelerator.num_processes == 1 and device_map == "auto": + self._device = torch.device(device) + self.device_map = device_map + else: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + + self.dynamic=dynamic #dynamic image_size + self.max_num=max_num + + + config=InternVLChatConfig.from_pretrained(pretrained) + tokenizer = AutoTokenizer.from_pretrained(pretrained, trust_remote_code=True, use_fast=False) + model = InternVLChatModel.from_pretrained( + pretrained, low_cpu_mem_usage=True,config=config, torch_dtype=torch.bfloat16, + load_in_8bit=load_in_8bit).eval() + if not load_in_8bit: + model = model.cuda() + # self.model=model + # self.device=self._device + self._tokenizer=tokenizer + # self.tokenizer=tokenizer + self._model=model + self._config = self._model.config + self.use_thumbnail=self.model.config.use_thumbnail + self.model.eval() + self.model.tie_weights() + self.truncation = truncation + self.batch_size_per_gpu = int(batch_size) + self.conv_template = conv_template + self.use_cache = use_cache + self.truncate_context = truncate_context + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + # If you want to use DistributedType.DEEPSPEED, you have to run accelerate config before using the model + # Also, you have to select zero stage 0 (equivalent to DDP) in order to make the prepare model works + # I tried to set different parameters in the kwargs to let default zero 2 stage works, but it didn't work. + if accelerator.distributed_type == DistributedType.DEEPSPEED: + kwargs = { + "train_micro_batch_size_per_gpu": self.batch_size_per_gpu, + "train_batch_size": self.batch_size_per_gpu * accelerator.num_processes, + } + AcceleratorState().deepspeed_plugin.deepspeed_config_process(must_match=True, **kwargs) + eval_logger.info("Detected that you are using DistributedType.DEEPSPEED. Make sure you run `accelerate config` and set zero stage to 0") + + if accelerator.distributed_type == DistributedType.FSDP or accelerator.distributed_type == DistributedType.DEEPSPEED: + self._model = accelerator.prepare(self.model) + else: + self._model = accelerator.prepare_model(self.model, evaluation_mode=True) + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + elif accelerator.num_processes == 1 and device_map == "auto": + eval_logger.info(f"Using {accelerator.num_processes} devices with tensor parallelism") + self._rank = 0 + self._word_size = 1 + else: + eval_logger.info(f"Using single device: {self._device}") + self.model.to(self._device) + self._rank = 0 + self._world_size = 1 + + #from internvl model + + self.image_size = config.force_image_size or config.vision_config.image_size + # patch_size = config.vision_config.patch_size + # self.patch_size = patch_size + # self.select_layer = config.select_layer + # self.template = config.template + # self.num_image_token = int((image_size // patch_size) ** 2 * (config.downsample_ratio ** 2)) + # self.downsample_ratio = config.downsample_ratio + # self.ps_version = config.ps_version + + # eval_logger.info(f'num_image_token: {self.num_image_token}') + # eval_logger.info(f'ps_version: {self.ps_version}') + # if vision_model is not None: + # self.vision_model = vision_model + # else: + # self.vision_model = InternVisionModel(config.vision_config) + # if language_model is not None: + # self.language_model = language_model + # else: + # if config.llm_config.architectures[0] == 'LlamaForCausalLM': + # self.language_model = LlamaForCausalLM(config.llm_config) + # elif config.llm_config.architectures[0] == 'InternLM2ForCausalLM': + # self.language_model = InternLM2ForCausalLM(config.llm_config) + # else: + # raise NotImplementedError(f'{config.llm_config.architectures[0]} is not implemented.') + + # vit_hidden_size = config.vision_config.hidden_size + # llm_hidden_size = config.llm_config.hidden_size + + # self.mlp1 = nn.Sequential( + # nn.LayerNorm(vit_hidden_size * int(1 / self.downsample_ratio) ** 2), + # nn.Linear(vit_hidden_size * int(1 / self.downsample_ratio) ** 2, llm_hidden_size), + # nn.GELU(), + # nn.Linear(llm_hidden_size, llm_hidden_size) + # ) + + # # if config.force_image_size != config.vision_config.image_size: + # # self.vision_model.resize_pos_embeddings( + # # old_size=config.vision_config.image_size, + # # new_size=config.force_image_size, + # # patch_size=config.vision_config.patch_size + # # ) + + # self.img_context_token_id = None + # self.neftune_alpha = None + + # if config.use_backbone_lora: + # self.wrap_backbone_lora(r=config.use_backbone_lora, lora_alpha=2 * config.use_backbone_lora) + + # if config.use_llm_lora: + # self.wrap_llm_lora(r=config.use_llm_lora, lora_alpha=2 * config.use_llm_lora) + + def wrap_backbone_lora(self, r=128, lora_alpha=256, lora_dropout=0.05): + lora_config = LoraConfig( + r=r, + target_modules=['attn.qkv', 'attn.proj', 'mlp.fc1', 'mlp.fc2'], + lora_alpha=lora_alpha, + lora_dropout=lora_dropout, + ) + self.vision_model = get_peft_model(self.vision_model, lora_config) + self.vision_model.print_trainable_parameters() + + def wrap_llm_lora(self, r=128, lora_alpha=256, lora_dropout=0.05): + lora_config = LoraConfig( + r=r, + target_modules=['self_attn.q_proj', 'self_attn.k_proj', 'self_attn.v_proj', 'self_attn.o_proj', + 'mlp.gate_proj', 'mlp.down_proj', 'mlp.up_proj'], + lora_alpha=lora_alpha, + lora_dropout=lora_dropout, + task_type='CAUSAL_LM' + ) + self.language_model = get_peft_model(self.language_model, lora_config) + self.language_model.enable_input_require_grads() + self.language_model.print_trainable_parameters() + + def pixel_shuffle(self, x, scale_factor=0.5): + n, w, h, c = x.size() + # N, W, H, C --> N, W, H * scale, C // scale + x = x.view(n, w, int(h * scale_factor), int(c / scale_factor)) + # N, W, H * scale, C // scale --> N, H * scale, W, C // scale + x = x.permute(0, 2, 1, 3).contiguous() + # N, H * scale, W, C // scale --> N, H * scale, W * scale, C // (scale ** 2) + x = x.view(n, int(h * scale_factor), int(w * scale_factor), + int(c / (scale_factor * scale_factor))) + if self.ps_version == 'v1': + warnings.warn("In ps_version 'v1', the height and width have not been swapped back, " + 'which results in a transposed image.') + else: + x = x.permute(0, 2, 1, 3).contiguous() + return x + + def noised_embed(self, vit_embeds, noise_alpha=5): + dims = torch.tensor(vit_embeds.size(1) * vit_embeds.size(2)) + mag_norm = noise_alpha / torch.sqrt(dims) + noise = torch.zeros_like(vit_embeds).uniform_(-mag_norm, mag_norm) + return vit_embeds + noise + + def extract_feature(self, pixel_values): + if self.select_layer == -1: + vit_embeds = self.vision_model( + pixel_values=pixel_values, + output_hidden_states=False, + return_dict=True).last_hidden_state + else: + vit_embeds = self.vision_model( + pixel_values=pixel_values, + output_hidden_states=True, + return_dict=True).hidden_states[self.select_layer] + vit_embeds = vit_embeds[:, 1:, :] + + if self.training and self.neftune_alpha is not None: + vit_embeds = self.noised_embed(vit_embeds, self.neftune_alpha) + + h = w = int(vit_embeds.shape[1] ** 0.5) + vit_embeds = vit_embeds.reshape(vit_embeds.shape[0], h, w, -1) + vit_embeds = self.pixel_shuffle(vit_embeds, scale_factor=self.downsample_ratio) + vit_embeds = vit_embeds.reshape(vit_embeds.shape[0], -1, vit_embeds.shape[-1]) + vit_embeds = self.mlp1(vit_embeds)#.to(pixel_values.device) + return vit_embeds + + def multi_image_chat(self, tokenizer, pixel_values, image_counts, question, generation_config, history=None, + return_history=False, IMG_START_TOKEN='', IMG_END_TOKEN='', IMG_CONTEXT_TOKEN=''): + + img_context_token_id = tokenizer.convert_tokens_to_ids(IMG_CONTEXT_TOKEN) + self.img_context_token_id = img_context_token_id + if tokenizer.convert_tokens_to_ids('<|im_end|>') != 0: + eos_token_id = tokenizer.convert_tokens_to_ids('<|im_end|>') # 92542, InternLM2 + else: + eos_token_id = tokenizer.eos_token_id + + from internvl.conversation import get_conv_template + + template = get_conv_template(self.template) + + if history is None: + history = [] + image_tokens = '' + image_bs = pixel_values.shape[0] + print(f'dynamic ViT batch size: {image_bs}, image_counts: {image_counts}') + for idx, image_count in enumerate(image_counts): + image_tokens += f' (图{idx+1}):' + IMG_START_TOKEN + IMG_CONTEXT_TOKEN * self.num_image_token * image_count + IMG_END_TOKEN + question = image_tokens + '\n' + question + else: + for (old_question, old_answer) in history: + template.append_message(template.roles[0], old_question) + template.append_message(template.roles[1], old_answer) + template.append_message(template.roles[0], question) + template.append_message(template.roles[1], None) + query = template.get_prompt() + model_inputs = tokenizer(query, return_tensors='pt') + input_ids = model_inputs['input_ids'].cuda() + attention_mask = model_inputs['attention_mask'].cuda() + generation_config['eos_token_id'] = eos_token_id + + generation_output = self.generate( + pixel_values=pixel_values, + input_ids=input_ids, + attention_mask=attention_mask, + **generation_config + ) + response = tokenizer.batch_decode(generation_output, skip_special_tokens=True)[0] + response = response.split('<|im_end|>')[0].strip() # for InternLM2 + history.append((question, response)) + if return_history: + return response, history + else: + query_to_print = query.replace(image_tokens, '') + print(query_to_print, response) + return response + return response + + @property + def tokenizer(self): + return self._tokenizer + + @property + def model(self): + # returns the model, unwrapping it if using Accelerate + if hasattr(self, "accelerator"): + return self.accelerator.unwrap_model(self._model) + else: + return self._model + + @property + def batch_size(self): + return self.batch_size_per_gpu + + @property + def device(self): + return self._device + + @property + def rank(self): + return self._rank + + @property + def world_size(self): + return self._world_size + + def tok_encode(self, string: str, left_truncate_len=None, add_special_tokens=None) -> List[int]: + """ """ + add_special_tokens = False if add_special_tokens is None else add_special_tokens + encoding = self.tokenizer.encode(string, add_special_tokens=add_special_tokens) + # left-truncate the encoded context to be at most `left_truncate_len` tokens long + if left_truncate_len: + encoding = encoding[-left_truncate_len:] + return encoding + + def tok_decode(self, tokens): + try: + return self.tokenizer.decode(tokens) + except: + return self.tokenizer.decode([tokens]) + + def post_processing(self,response): + response = response.replace('\n', '').replace('不是', 'No').replace('是', 'Yes').replace('否', 'No') + response = response.lower().replace('true', 'yes').replace('false', 'no') + pattern = re.compile(r'[\u4e00-\u9fa5]') + response = re.sub(pattern, '', response) + return response + + @torch.no_grad() + def generate( + self, + pixel_values: Optional[torch.FloatTensor] = None, + input_ids: Optional[torch.FloatTensor] = None, + attention_mask: Optional[torch.LongTensor] = None, + visual_features: Optional[torch.FloatTensor] = None, + generation_config: Optional[GenerationConfig] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + **generate_kwargs, + ) -> torch.LongTensor: + + assert self.img_context_token_id is not None + if pixel_values is not None: + if visual_features is not None: + vit_embeds = visual_features + else: + vit_embeds = self.extract_feature(pixel_values) + + input_embeds = self.language_model.get_input_embeddings()(input_ids) + B, N, C = input_embeds.shape + input_embeds = input_embeds.reshape(B * N, C) + + input_ids = input_ids.reshape(B * N) + selected = (input_ids == self.img_context_token_id) + assert selected.sum() != 0 + input_embeds[selected] = vit_embeds.reshape(-1, C).to(input_embeds.device) + + input_embeds = input_embeds.reshape(B, N, C) + else: + input_embeds = self.language_model.get_input_embeddings()(input_ids) + + outputs = self.language_model.generate( + inputs_embeds=input_embeds, + attention_mask=attention_mask, + generation_config=generation_config, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + use_cache=True, + **generate_kwargs, + ) + + return outputs + + def flatten(self, input): + new_list = [] + for i in input: + for j in i: + new_list.append(j) + return new_list + + def load_image(self,flattened_visuals, input_size=224): + assert flattened_visuals[0].mode == 'RGB' + image = flattened_visuals[0].convert('RGB') + transform = build_transform(is_train=False, input_size=input_size) + if self.dynamic: + images = dynamic_preprocess(image, image_size=input_size, + use_thumbnail=self.use_thumbnail, + max_num=self.max_num) + else: + images = [image] + pixel_values = [transform(image) for image in images] + pixel_values = torch.stack(pixel_values) + return pixel_values + + def generate_until(self, requests: List[Instance]) -> List[str]: + res = [] + + def _collate(x): + # the negative sign on len(toks) sorts descending - this has a few advantages: + # - time estimates will always be over not underestimates, which is more useful for planning + # - to know the size of a batch when going through the list, you know the first one is always the batch + # padded context length. this is useful to simplify the batching logic and more importantly to make + # automatic adaptive batches much much easier to implement + # - any OOMs will happen right away rather than near the end + toks = self.tok_encode(x[0]) + return -len(toks), x[0] + + # we group requests by their generation_kwargs, + # so that we don't try to execute e.g. greedy sampling and temp=0.8 sampling + # in the same batch. + re_ords = utils.Collator([reg.args for reg in requests], _collate, grouping=True) + chunks = re_ords.get_batched(n=self.batch_size, batch_fn=None) + num_iters = len(requests) // self.batch_size if len(requests) % self.batch_size == 0 else len(requests) // self.batch_size + 1 + pbar = tqdm(total=num_iters, disable=(self.rank != 0), desc="Model Responding") + for chunk in chunks: + contexts, all_gen_kwargs, doc_to_visual, doc_id, task, split = zip(*chunk) + task = task[0] + split = split[0] + batched_visuals = [doc_to_visual[0](self.task_dict[task][split][ids]) for ids in doc_id] # [B, N] + flattened_visuals = self.flatten(batched_visuals) + pixel_values=self.load_image(flattened_visuals, self.image_size).cuda().to(torch.bfloat16) + gen_kwargs = all_gen_kwargs[0] + + generation_config = dict( + do_sample=False, + top_k=50, + top_p=0.9, + num_beams=5, + max_new_tokens=20, + eos_token_id=self.tokenizer.eos_token_id, + ) + question = contexts[0] + response = self.model.chat( + tokenizer=self.tokenizer, + pixel_values=pixel_values, + question=question, + generation_config=generation_config + ) + #TODO(choiszt) try batch_chat for multiple inputs + response=self.post_processing(response) + res.append(response) + self.cache_hook.add_partial("generate_until", (question, gen_kwargs), response) + pbar.update(1) + res = re_ords.get_original(res) + return res + # print(chunk) + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + pass \ No newline at end of file diff --git a/lmms_eval/models/llava.py b/lmms_eval/models/llava.py index 8ea94ee2f..6f7186c6c 100755 --- a/lmms_eval/models/llava.py +++ b/lmms_eval/models/llava.py @@ -100,7 +100,8 @@ def __init__( llava_model_args["attn_implementation"] = attn_implementation if "use_flash_attention_2" in kwargs: llava_model_args["use_flash_attention_2"] = kwargs["use_flash_attention_2"] - self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, get_model_name_from_path(pretrained), device_map=self.device_map, **llava_model_args) + # self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, get_model_name_from_path(pretrained), device_map=self.device_map, **llava_model_args) + self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, get_model_name_from_path(pretrained), device_map=self.device_map) self._config = self._model.config self.model.eval() self.model.tie_weights() diff --git a/lmms_eval/tasks/__init__.py b/lmms_eval/tasks/__init__.py index e6e25d857..d2faee179 100755 --- a/lmms_eval/tasks/__init__.py +++ b/lmms_eval/tasks/__init__.py @@ -112,7 +112,7 @@ def initialize_tasks(verbosity="INFO"): def get_task(task_name, model_name): try: - return TASK_REGISTRY[task_name](model_name=model_name) + return TASK_REGISTRY[task_name](model_name=model_name) #TODO choiszt the return result need to check " 'mmeConfigurableTask' object has no attribute '_instances'. Did you mean: 'instances'?" except KeyError: eval_logger.info("Available tasks:") eval_logger.info(list(TASK_REGISTRY) + list(GROUP_REGISTRY)) From 88614ee4a71416f6aeeffb1e04567fe68e420014 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Sat, 4 May 2024 09:01:13 +0000 Subject: [PATCH 032/181] update --- lmms_eval/models/gemini_api.py | 2 +- lmms_eval/models/gemini_model.py | 2 +- lmms_eval/tasks/llava-in-the-wild/llava-in-the-wild.yaml | 2 +- lmms_eval/tasks/mmvet/mmvet.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index 01a7a1f36..6591b1b77 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -96,7 +96,7 @@ def encode_video(self, video_path, for_get_frames_num=-1, frame_rate=-1): for frame in frames: img = Image.fromarray(frame) output_buffer = BytesIO() - img.save(output_buffer, format="PNG") + img.save(output_buffer, format="JPEG") byte_data = output_buffer.getvalue() base64_str = base64.b64encode(byte_data).decode("utf-8") base64_frames.append(base64_str) diff --git a/lmms_eval/models/gemini_model.py b/lmms_eval/models/gemini_model.py index 2050c5996..dfc7d8186 100644 --- a/lmms_eval/models/gemini_model.py +++ b/lmms_eval/models/gemini_model.py @@ -96,7 +96,7 @@ def encode_video(self, video_path, for_get_frames_num=-1, frame_rate=-1): for frame in frames: img = Image.fromarray(frame) output_buffer = BytesIO() - img.save(output_buffer, format="PNG") + img.save(output_buffer, format="JPEG") byte_data = output_buffer.getvalue() base64_str = base64.b64encode(byte_data).decode("utf-8") base64_frames.append(base64_str) diff --git a/lmms_eval/tasks/llava-in-the-wild/llava-in-the-wild.yaml b/lmms_eval/tasks/llava-in-the-wild/llava-in-the-wild.yaml index 535202795..5cad8d9db 100755 --- a/lmms_eval/tasks/llava-in-the-wild/llava-in-the-wild.yaml +++ b/lmms_eval/tasks/llava-in-the-wild/llava-in-the-wild.yaml @@ -11,7 +11,7 @@ generation_kwargs: until: - "ASSISTANT:" image_aspect_ratio: original - max_new_tokens: 1024 + max_new_tokens: 32768 temperature: 0 top_p: 0 num_beams: 1 diff --git a/lmms_eval/tasks/mmvet/mmvet.yaml b/lmms_eval/tasks/mmvet/mmvet.yaml index 0e01afb34..f5b4962cb 100755 --- a/lmms_eval/tasks/mmvet/mmvet.yaml +++ b/lmms_eval/tasks/mmvet/mmvet.yaml @@ -10,7 +10,7 @@ doc_to_target: "{{answer}}" generation_kwargs: until: - "ASSISTANT:" - max_new_tokens: 1024 + max_new_tokens: 32768 temperature: 0 top_p: 0 num_beams: 1 From 18ca59004cc7adb079503571819c04f4fdf37556 Mon Sep 17 00:00:00 2001 From: Pu Fanyi Date: Sat, 4 May 2024 19:23:39 +0800 Subject: [PATCH 033/181] Group MMMU images into one image (#83) * update * update font * Add matplotlib.font_manager import in utils.py * Refactor font handling in add_order_label function in utils.py * group mmmu --------- Co-authored-by: Li Bo --- lmms_eval/api/samplers.py | 4 +- lmms_eval/tasks/mmmu/mmmu_group_img.yaml | 4 + lmms_eval/tasks/mmmu/mmmu_group_img_test.yaml | 19 + lmms_eval/tasks/mmmu/mmmu_group_img_val.yaml | 21 + lmms_eval/tasks/mmmu/utils_group_img.py | 589 ++++++++++++++++++ 5 files changed, 634 insertions(+), 3 deletions(-) create mode 100644 lmms_eval/tasks/mmmu/mmmu_group_img.yaml create mode 100644 lmms_eval/tasks/mmmu/mmmu_group_img_test.yaml create mode 100644 lmms_eval/tasks/mmmu/mmmu_group_img_val.yaml create mode 100644 lmms_eval/tasks/mmmu/utils_group_img.py diff --git a/lmms_eval/api/samplers.py b/lmms_eval/api/samplers.py index 2cecfe224..f77065e8e 100755 --- a/lmms_eval/api/samplers.py +++ b/lmms_eval/api/samplers.py @@ -37,9 +37,7 @@ def get_context(self, doc, num_fewshot): + ( str(self.doc_to_target(doc)[0]) if type(self.doc_to_target(doc)) is list - else self.doc_to_target(doc) - if (self.config.doc_to_choice is None or type(self.doc_to_target(doc)) is str) - else str(self.doc_to_choice(doc)[self.doc_to_target(doc)]) + else self.doc_to_target(doc) if (self.config.doc_to_choice is None or type(self.doc_to_target(doc)) is str) else str(self.doc_to_choice(doc)[self.doc_to_target(doc)]) ) for doc in selected_docs ] diff --git a/lmms_eval/tasks/mmmu/mmmu_group_img.yaml b/lmms_eval/tasks/mmmu/mmmu_group_img.yaml new file mode 100644 index 000000000..8d8713a72 --- /dev/null +++ b/lmms_eval/tasks/mmmu/mmmu_group_img.yaml @@ -0,0 +1,4 @@ +group: mmmu_group_img +task: +- mmmu_val_group_img +- mmmu_test_group_img diff --git a/lmms_eval/tasks/mmmu/mmmu_group_img_test.yaml b/lmms_eval/tasks/mmmu/mmmu_group_img_test.yaml new file mode 100644 index 000000000..509336c49 --- /dev/null +++ b/lmms_eval/tasks/mmmu/mmmu_group_img_test.yaml @@ -0,0 +1,19 @@ +dataset_path: lmms-lab/MMMU +task: "mmmu_test_group_img" +test_split: test +output_type: generate_until +doc_to_visual: !function utils_group_img.mmmu_doc_to_visual +doc_to_text: !function utils_group_img.mmmu_doc_to_text +doc_to_target: "answer" +# The return value of process_results will be used by metrics +process_results: !function utils_group_img.mmmu_process_results +# Note that the metric name can be either a registed metric function (such as the case for GQA) or a key name returned by process_results +generation_kwargs: + max_new_tokens: 16 + image_aspect_ratio: original +metric_list: + - metric: submission + aggregation: !function utils_group_img.mmmu_test_aggregate_results_for_submission + higher_is_better: true +metadata: + - version: 0.0 \ No newline at end of file diff --git a/lmms_eval/tasks/mmmu/mmmu_group_img_val.yaml b/lmms_eval/tasks/mmmu/mmmu_group_img_val.yaml new file mode 100644 index 000000000..c9f9239e4 --- /dev/null +++ b/lmms_eval/tasks/mmmu/mmmu_group_img_val.yaml @@ -0,0 +1,21 @@ +dataset_path: lmms-lab/MMMU +task: "mmmu_val_group_img" +test_split: validation +output_type: generate_until +doc_to_visual: !function utils_group_img.mmmu_doc_to_visual +doc_to_text: !function utils_group_img.mmmu_doc_to_text +doc_to_target: "answer" +# The return value of process_results will be used by metrics +process_results: !function utils_group_img.mmmu_process_results +# Note that the metric name can be either a registed metric function (such as the case for GQA) or a key name returned by process_results +generation_kwargs: + max_new_tokens: 16 +model_specific_generation_kwargs: + llava: + image_aspect_ratio: original +metric_list: + - metric: mmmu_acc + aggregation: !function utils_group_img.mmmu_aggregate_results + higher_is_better: true +metadata: + - version: 0.0 \ No newline at end of file diff --git a/lmms_eval/tasks/mmmu/utils_group_img.py b/lmms_eval/tasks/mmmu/utils_group_img.py new file mode 100644 index 000000000..e3e475be4 --- /dev/null +++ b/lmms_eval/tasks/mmmu/utils_group_img.py @@ -0,0 +1,589 @@ +from collections import defaultdict +import re +import ast +import random +import numpy as np +import os +import json +import logging +import matplotlib.font_manager as fm + +from lmms_eval.tasks._task_utils.file_utils import generate_submission_file + +from PIL import Image, ImageDraw, ImageFont +import numpy as np + + +def add_order_label(image, label, font_family="DejaVu Sans", font_size=40): + # Create a drawing context + draw = ImageDraw.Draw(image) + + # Define font for the label + font_path = fm.findfont(fm.FontProperties(family=font_family)) + font = ImageFont.truetype(font_path, font_size) + + # Calculate text size and position + text_width = text_height = font_size + label_background_margin = 10 + label_background_size = (text_width + 2 * label_background_margin, text_height + 2 * label_background_margin) + + # Draw a solid white square for the label background + label_background_position = (0, 0) # Top-left corner + draw.rectangle([label_background_position, (label_background_position[0] + label_background_size[0], label_background_position[1] + label_background_size[1])], fill="white") + + # Add the label text in black over the white square + label_position = (label_background_margin, label_background_margin) + draw.text(label_position, label, font=font, fill="black") + + return image + + +def resize_image_height(image, fixed_size): + # Resize image, maintaining aspect ratio + width, height = image.size + new_size = int(width * fixed_size / height), fixed_size + return image.resize(new_size, Image.Resampling.LANCZOS) + + +def concatenate_images_horizontal(image_list): + # Concatenate images horizontally + widths, heights = zip(*(i.size for i in image_list)) + total_width = sum(widths) + max_height = max(heights) + assert all(height == max_height for height in heights) + new_im = Image.new("RGB", (total_width, max_height)) + x_offset = 0 + for im in image_list: + new_im.paste(im, (x_offset, 0)) + x_offset += im.size[0] + return new_im + + +def resize_image_width(image, fixed_size): + # Resize image, maintaining aspect ratio + width, height = image.size + new_size = fixed_size, int(height * fixed_size / width) + return image.resize(new_size, Image.Resampling.LANCZOS) + + +def concatenate_images_vertical(image_list): + # Concatenate images horizontally + widths, heights = zip(*(i.size for i in image_list)) + total_height = sum(heights) + max_width = max(widths) + assert all(width == max_width for width in widths) + new_im = Image.new("RGB", (max_width, total_height)) + y_offset = 0 + for im in image_list: + new_im.paste(im, (0, y_offset)) + y_offset += im.size[1] + return new_im + + +def process_images_horizontal(original_images, size): + images = [] + for i, img in enumerate(original_images): + # Resize image + img_resized = resize_image_height(img, fixed_size=size) + + # Add order label + img_labeled = add_order_label(img_resized, f"[{i+1}]") + + # Append to list + images.append(img_labeled) + + # Concatenate all images + return concatenate_images_horizontal(images) + + +def process_images_vertical(original_images, size): + images = [] + for i, img in enumerate(original_images): + # Resize image + img_resized = resize_image_width(img, fixed_size=size) + + # Add order label + img_labeled = add_order_label(img_resized, f"[{i+1}]") + + # Append to list + images.append(img_labeled) + + # Concatenate all images + return concatenate_images_vertical(images) + + +def process_images(images, size=672): + concat_horizontal = process_images_horizontal(images, size) + concat_vertical = process_images_vertical(images, size) + + hw, hh = concat_horizontal.size + vw, vh = concat_vertical.size + + ha = hw / hh + va = vh / vw + + if ha > va: + return concat_vertical + else: + return concat_horizontal + + +lmms_logger = logging.getLogger("lmms-eval") + +MULTI_CHOICE_PROMPT = "Answer with the option letter from the given choices directly." +OPEN_ENDED_PROMPT = "Answer the question using a single word or phrase." + + +def replace_images_tokens(input_string): + # for i in range(1, 8): + # question_text = f"" + # query_text = "" + # if question_text in input_string: + # input_string = input_string.replace(question_text, query_text) + return input_string + + +def parse_options(options): + option_letters = [chr(ord("A") + i) for i in range(len(options))] + choices_str = "\n".join([f"{option_letter}. {option}" for option_letter, option in zip(option_letters, options)]) + return choices_str + + +def construct_prompt(doc): + question = doc["question"] + if doc["question_type"] == "multiple-choice": + # Weirdly, data["options"] is a string in MMMU Huggingface dataset + parsed_options = parse_options(ast.literal_eval(doc["options"])) + # parsed_options already prepends a newline so no need to add space here + question = f"{question}\n{parsed_options}\n{MULTI_CHOICE_PROMPT}" + else: + question = f"{question}\n{OPEN_ENDED_PROMPT}" + return question + + +def mmmu_doc_to_text(doc): + question = construct_prompt(doc) + return replace_images_tokens(question) + + +def mmmu_doc_to_visual(doc): + prompt = construct_prompt(doc) + image_tokens = re.findall(r"", prompt) + # Remove <> and swap space as _ + image_tokens = sorted(list(set([image_token.strip("<>").replace(" ", "_") for image_token in image_tokens]))) + visual = [doc[image_token].convert("RGB") for image_token in image_tokens] + visual = process_images(visual) + return [visual] + + +def mmmu_process_results(doc, results): + pred = results[0] + if doc["question_type"] == "multiple-choice": + index2ans, all_choices = get_multi_choice_info(ast.literal_eval(doc["options"])) + parsed_pred = parse_multi_choice_response(pred, all_choices, index2ans) + else: + parsed_pred = parse_open_response(pred) + id = doc["id"] + mmmu_acc = {"id": id, "subdomain": extract_subset_name(doc["id"]), "question_type": doc["question_type"], "answer": doc["answer"], "parsed_pred": parsed_pred} + return { + "mmmu_acc": mmmu_acc, + "submission": { + id: pred, + }, + } + + +def extract_subset_name(input_string): + # Define a regex pattern to match "validation_" at the beginning and "_" at the end + split = input_string.split("_")[0] + pattern = re.compile(rf"^{split}_(.+?)_\d+$") + match = pattern.search(input_string) + if match: + return match.group(1) + else: + raise ValueError(f'No match found in "{input_string}"') + + +def mmmu_test_aggregate_results_for_submission(results, args): + path = generate_submission_file("mmmu_test_for_submission.json", args) + with open(path, "w") as f: + json.dump(results, f) + lmms_logger.info(f"Results saved to {path}.") + + +def mmmu_aggregate_results(results): + evaluation_result = {} + subset_to_eval_samples = defaultdict(list) + for result in results: + subset_to_eval_samples[result["subdomain"]].append(result) + for subset, sub_eval_samples in subset_to_eval_samples.items(): + judge_dict, metric_dict = evaluate_mmmu(sub_eval_samples) + metric_dict.update({"num_example": len(sub_eval_samples)}) + evaluation_result[subset] = metric_dict + printable_results = {} + for domain, in_domain_cats in DOMAIN_CAT2SUB_CAT.items(): + in_domain_cat_results = {} + for cat_name in in_domain_cats: + if cat_name in evaluation_result.keys(): + in_domain_cat_results[cat_name] = evaluation_result[cat_name] + else: + pass + in_domain_ins_acc = calculate_ins_level_acc(in_domain_cat_results) + in_domain_data_num = sum([cat_results["num_example"] for cat_results in in_domain_cat_results.values()]) + printable_results["Overall-" + domain] = { + "num": int(in_domain_data_num), + "acc": round(in_domain_ins_acc, 3), + } + # add sub category + for cat_name, cat_results in in_domain_cat_results.items(): + printable_results[cat_name] = { + "num": int(cat_results["num_example"]), + "acc": round(cat_results["acc"], 3), + } + all_ins_acc = calculate_ins_level_acc(evaluation_result) + printable_results["Overall"] = { + "num": sum([cat_results["num_example"] for cat_results in evaluation_result.values()]), + "acc": round(all_ins_acc, 3), + } + print(printable_results) + return printable_results["Overall"]["acc"] + + +################## +# Helper functions written by official MMMU repo. +################## + + +def calculate_ins_level_acc(results): + """Calculate the instruction level accuracy for given Subject results + https://github.com/MMMU-Benchmark/MMMU/blob/51ce7f3e829c16bb44bc5445782686b4c3508794/eval/eval_utils.py#L246 + """ + acc = 0 + ins_num = 0 + for cat_results in results.values(): + acc += cat_results["acc"] * cat_results["num_example"] + ins_num += cat_results["num_example"] + if ins_num == 0: + return 0 + return acc / ins_num + + +DOMAIN_CAT2SUB_CAT = { + "Art and Design": ["Art", "Art_Theory", "Design", "Music"], + "Business": ["Accounting", "Economics", "Finance", "Manage", "Marketing"], + "Science": [ + "Biology", + "Chemistry", + "Geography", + "Math", + "Physics", + ], + "Health and Medicine": [ + "Basic_Medical_Science", + "Clinical_Medicine", + "Diagnostics_and_Laboratory_Medicine", + "Pharmacy", + "Public_Health", + ], + "Humanities and Social Science": [ + "History", + "Literature", + "Sociology", + "Psychology", + ], + "Tech and Engineering": [ + "Agriculture", + "Architecture_and_Engineering", + "Computer_Science", + "Electronics", + "Energy_and_Power", + "Materials", + "Mechanical_Engineering", + ], +} + + +def eval_multi_choice(gold_i, pred_i): + """ + Evaluate a multiple choice instance. + https://github.com/MMMU-Benchmark/MMMU/blob/51ce7f3e829c16bb44bc5445782686b4c3508794/eval/eval_utils.py#L175 + """ + correct = False + # only they are exactly the same, we consider it as correct + if isinstance(gold_i, list): + for answer in gold_i: + if answer == pred_i: + correct = True + break + else: # gold_i is a string + if gold_i == pred_i: + correct = True + return correct + + +def eval_open(gold_i, pred_i): + """ + Evaluate an open question instance + https://github.com/MMMU-Benchmark/MMMU/blob/51ce7f3e829c16bb44bc5445782686b4c3508794/eval/eval_utils.py#L191 + """ + correct = False + if isinstance(gold_i, list): + # use float to avoid trivial matches + norm_answers = [] + for answer in gold_i: + norm_answers.extend(normalize_str(answer)) + else: + norm_answers = normalize_str(gold_i) + for pred in pred_i: # pred is already normalized in parse response phase + if isinstance(pred, str): # if it's a string, then find if ans in the pred_i + for norm_ans in norm_answers: + # only see if the string answer in the string pred + if isinstance(norm_ans, str) and norm_ans in pred: + if not correct: + correct = True + break + else: # it's a float number + if pred in norm_answers: + if not correct: + correct = True + break + return correct + + +def evaluate_mmmu(samples): + """ + Batch evaluation for multiple choice and open questions. + https://github.com/MMMU-Benchmark/MMMU/blob/51ce7f3e829c16bb44bc5445782686b4c3508794/eval/eval_utils.py#L219 + """ + pred_correct = 0 + judge_dict = dict() + for sample in samples: + gold_i = sample["answer"] + pred_i = sample["parsed_pred"] + if sample["question_type"] == "multiple-choice": + correct = eval_multi_choice(gold_i, pred_i) + else: # open question + correct = eval_open(gold_i, pred_i) + + if correct: + judge_dict[sample["id"]] = "Correct" + pred_correct += 1 + else: + judge_dict[sample["id"]] = "Wrong" + + if len(samples) == 0: + return {"acc": 0} + return judge_dict, {"acc": pred_correct / len(samples)} + + +def parse_multi_choice_response(response, all_choices, index2ans): + """ + Parse the prediction from the generated response. + Return the predicted index e.g., A, B, C, D. + https://github.com/MMMU-Benchmark/MMMU/blob/51ce7f3e829c16bb44bc5445782686b4c3508794/eval/eval_utils.py#L10 + """ + for char in [",", ".", "!", "?", ";", ":", "'"]: + response = response.strip(char) + response = " " + response + " " # add space to avoid partial match + + index_ans = True + ans_with_brack = False + candidates = [] + for choice in all_choices: # e.g., (A) (B) (C) (D) + if f"({choice})" in response: + candidates.append(choice) + ans_with_brack = True + + if len(candidates) == 0: + for choice in all_choices: # e.g., A B C D + if f"{choice} " in response: + candidates.append(choice) + + if len(candidates) == 0: + for choice in all_choices: # e.g., A. B. C. D. + if f"{choice}." in response: + candidates.append(choice) + + # if all above doesn't get candidates, check if the content is larger than 5 tokens and try to parse the example + if len(candidates) == 0 and len(response.split()) > 5: + for index, ans in index2ans.items(): + if ans.lower() in response.lower(): + candidates.append(index) + index_ans = False # it's content ans. + + if len(candidates) == 0: # still not get answer, randomly choose one. + pred_index = random.choice(all_choices) + elif len(candidates) > 1: + start_indexes = [] + if index_ans: + if ans_with_brack: + for can in candidates: + index = response.rfind(f"({can})") + start_indexes.append(index) # -1 will be ignored anyway + # start_indexes = [generated_response.index(f'({can})') for can in candidates] + else: + for can in candidates: + index = response.rfind(f" {can} ") + start_indexes.append(index) + else: + for can in candidates: + index = response.lower().rfind(index2ans[can].lower()) + start_indexes.append(index) + # get the last one + pred_index = candidates[np.argmax(start_indexes)] + else: # if only one candidate, use it. + pred_index = candidates[0] + + return pred_index + + +def extract_numbers(string): + """ + Exact all forms of numbers from a string with regex. + https://github.com/MMMU-Benchmark/MMMU/blob/51ce7f3e829c16bb44bc5445782686b4c3508794/eval/eval_utils.py#L100 + """ + # Pattern for numbers with commas + pattern_commas = r"-?\b\d{1,3}(?:,\d{3})+\b" + # Pattern for scientific notation + pattern_scientific = r"-?\d+(?:\.\d+)?[eE][+-]?\d+" + # Pattern for simple numbers without commas + pattern_simple = r"-?(?:\d+\.\d+|\.\d+|\d+\b)(?![eE][+-]?\d+)(?![,\d])" + + # Extract numbers with commas + numbers_with_commas = re.findall(pattern_commas, string) + # Extract numbers in scientific notation + numbers_scientific = re.findall(pattern_scientific, string) + # Extract simple numbers without commas + numbers_simple = re.findall(pattern_simple, string) + + # Combine all extracted numbersz + all_numbers = numbers_with_commas + numbers_scientific + numbers_simple + return all_numbers + + +def check_is_number(string): + """ + Check if the given string a number. + https://github.com/MMMU-Benchmark/MMMU/blob/51ce7f3e829c16bb44bc5445782686b4c3508794/eval/eval_utils.py#L65 + """ + try: + float(string.replace(",", "")) + return True + except ValueError: + # check if there's comma inside + return False + + +def normalize_str(string): + """ + Normalize the str to lower case and make them float numbers if possible. + https://github.com/MMMU-Benchmark/MMMU/blob/51ce7f3e829c16bb44bc5445782686b4c3508794/eval/eval_utils.py#L76 + """ + # check if characters in the string + + # if number, numerize it. + string = string.strip() + + is_number = check_is_number(string) + + if is_number: + string = string.replace(",", "") + string = float(string) + # leave 2 decimal + string = round(string, 2) + return [string] + else: # it's likely to be a string + # lower it + string = string.lower() + if len(string) == 1: + return [" " + string, string + " "] # avoid trivial matches + return [string] + + +def parse_open_response(response): + """ + Parse the prediction from the generated response. + Return a list of predicted strings or numbers. + https://github.com/MMMU-Benchmark/MMMU/blob/51ce7f3e829c16bb44bc5445782686b4c3508794/eval/eval_utils.py#L122 + """ + + # content = content.strip("\n").strip(".").strip(" ") + def get_key_subresponses(response): + key_responses = [] + response = response.strip().strip(".").lower() + sub_responses = re.split(r"\.\s(?=[A-Z])|\n", response) + indicators_of_keys = [ + "could be ", + "so ", + "is ", + "thus ", + "therefore ", + "final ", + "answer ", + "result ", + ] + key_responses = [] + for index, resp in enumerate(sub_responses): + # if last one, accept it's an equation (the entire response can be just one sentence with equation) + if index == len(sub_responses) - 1: + indicators_of_keys.extend(["="]) + shortest_key_response = None # the shortest response that may contain the answer (tail part of the response) + for indicator in indicators_of_keys: + if indicator in resp: + if not shortest_key_response: + shortest_key_response = resp.split(indicator)[-1].strip() + else: + if len(resp.split(indicator)[-1].strip()) < len(shortest_key_response): + shortest_key_response = resp.split(indicator)[-1].strip() + # key_responses.append(resp.split(indicator)[1].strip()) + + if shortest_key_response: + # and it's not trivial + if shortest_key_response.strip() not in [ + ":", + ",", + ".", + "!", + "?", + ";", + ":", + "'", + ]: + key_responses.append(shortest_key_response) + if len(key_responses) == 0: # did not found any + return [response] + return key_responses + + # pdb.set_trace() + key_responses = get_key_subresponses(response) + + pred_list = key_responses.copy() # keep the original string response + for resp in key_responses: + pred_list.extend(extract_numbers(resp)) + + tmp_pred_list = [] + for i in range(len(pred_list)): + tmp_pred_list.extend(normalize_str(pred_list[i])) + pred_list = tmp_pred_list + + # remove duplicates + pred_list = list(set(pred_list)) + + return pred_list + + +def get_multi_choice_info(options): + """ + Given the list of options for multiple choice question + Return the index2ans and all_choices + https://github.com/MMMU-Benchmark/MMMU/blob/51ce7f3e829c16bb44bc5445782686b4c3508794/eval/data_utils.py#L54 + """ + + start_chr = "A" + all_choices = [] + index2ans = {} + for i, option in enumerate(options): + index2ans[chr(ord(start_chr) + i)] = option + all_choices.append(chr(ord(start_chr) + i)) + + return index2ans, all_choices From 9ee68f6af95c5f2aedbedec4b6162f41bfb05dfb Mon Sep 17 00:00:00 2001 From: Bo Li Date: Sat, 4 May 2024 17:23:08 +0000 Subject: [PATCH 034/181] Fix formatting and typos in lmms_eval code --- lmms_eval/evaluator.py | 2 +- lmms_eval/models/__init__.py | 39 +++--- lmms_eval/models/idefics2.py | 12 +- lmms_eval/models/internvl.py | 260 ++++++++++++----------------------- lmms_eval/tasks/__init__.py | 2 +- 5 files changed, 117 insertions(+), 198 deletions(-) diff --git a/lmms_eval/evaluator.py b/lmms_eval/evaluator.py index fda3e173d..47f7cd694 100755 --- a/lmms_eval/evaluator.py +++ b/lmms_eval/evaluator.py @@ -285,7 +285,7 @@ def evaluate( cloned_reqs.extend([req] * req.repeats) # run requests through model - resps = getattr(lm, reqtype)(cloned_reqs)#Choiszt run generate until + resps = getattr(lm, reqtype)(cloned_reqs) # Choiszt run generate until # put responses from model into a list of length K for each request. for x, req in zip(resps, cloned_reqs): diff --git a/lmms_eval/models/__init__.py b/lmms_eval/models/__init__.py index e9a2d975e..e59e9d216 100755 --- a/lmms_eval/models/__init__.py +++ b/lmms_eval/models/__init__.py @@ -1,30 +1,29 @@ import os +import hf_transfer + +os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1" AVAILABLE_MODELS = { "llava": "Llava", - # "qwen_vl": "Qwen_VL", - # "fuyu": "Fuyu", - # "gpt4v": "GPT4V", - # "instructblip": "InstructBLIP", - # "minicpm_v": "MiniCPM_V", - # "llava_vid": "LlavaVid", - # "videoChatGPT": "VideoChatGPT", - # "llama_vid": "LLaMAVid", - # "video_llava": "VideoLLaVA", - # "xcomposer2_4KHD": "XComposer2_4KHD", - # "claude": "Claude", - # "qwen_vl_api": "Qwen_VL_API", - # "llava_sglang": "LlavaSglang", - # "idefics2": "Idefics2", - "internvl":"InternVLChat" + "qwen_vl": "Qwen_VL", + "fuyu": "Fuyu", + "gpt4v": "GPT4V", + "instructblip": "InstructBLIP", + "minicpm_v": "MiniCPM_V", + "llava_vid": "LlavaVid", + "videoChatGPT": "VideoChatGPT", + "llama_vid": "LLaMAVid", + "video_llava": "VideoLLaVA", + "xcomposer2_4KHD": "XComposer2_4KHD", + "claude": "Claude", + "qwen_vl_api": "Qwen_VL_API", + "llava_sglang": "LlavaSglang", + "idefics2": "Idefics2", + "internvl": "InternVLChat", } for model_name, model_class in AVAILABLE_MODELS.items(): try: exec(f"from .{model_name} import {model_class}") except ImportError: - print(model_name) - -import hf_transfer - -os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1" + pass diff --git a/lmms_eval/models/idefics2.py b/lmms_eval/models/idefics2.py index 4bbd393c3..42035a9f9 100644 --- a/lmms_eval/models/idefics2.py +++ b/lmms_eval/models/idefics2.py @@ -17,12 +17,14 @@ eval_logger = logging.getLogger("lmms-eval") DEFAULT_IMAGE_TOKEN = "" -try: +try: import flash_attn + best_fit_attn_implementation = "flash_attention_2" except ImportError: best_fit_attn_implementation = "eager" + @register_model("idefics2") class Idefics2(lmms): """ @@ -50,7 +52,7 @@ def __init__( attn_implementation: Optional[str] = best_fit_attn_implementation, device_map: str = "", use_cache: bool = True, - do_image_splitting: bool =False, + do_image_splitting: bool = False, **kwargs, ) -> None: super().__init__() @@ -194,7 +196,7 @@ def _collate(x): # we assume all gen kwargs in the batch are the same # this is safe to assume because the `grouper` object ensures it. gen_kwargs = all_gen_kwargs[0] - # + # until = gen_kwargs.pop("until", None) prompts = [] for context, visual in zip(contexts, visuals): @@ -211,9 +213,9 @@ def _collate(x): output_ids = self.model.generate(**inputs, **gen_kwargs) # only retain the generated text for output_id, input_id in zip(output_ids, inputs["input_ids"]): - generated_id = output_id[len(input_id):] + generated_id = output_id[len(input_id) :] generated_text = self.tokenizer.decode(generated_id, skip_special_tokens=True) - + res.append(generated_text) pbar.update(1) # reorder this group of results back to original unsorted form diff --git a/lmms_eval/models/internvl.py b/lmms_eval/models/internvl.py index 2b91f543e..8b556bd6a 100644 --- a/lmms_eval/models/internvl.py +++ b/lmms_eval/models/internvl.py @@ -5,7 +5,6 @@ from typing import List, Optional, Union, Tuple import torch from tqdm import tqdm -# from decord import VideoReader, cpu import numpy as np import math from datetime import timedelta @@ -22,9 +21,11 @@ import subprocess from pathlib import Path + wd = Path(__file__).parent.parent.parent.resolve() import sys -sys.path.append(os.path.join(str(wd),"InternVL","internvl_chat")) + +sys.path.append(os.path.join(str(wd), "InternVL", "internvl_chat")) eval_logger = logging.getLogger("lmms-eval") @@ -37,8 +38,6 @@ except ImportError: eval_logger.error("InternVL is not installed. Please install InternVL to use this model.") - - import warnings from typing import Any, List, Optional, Tuple, Union @@ -47,42 +46,40 @@ from peft import LoraConfig, get_peft_model from torch import nn from torch.nn import CrossEntropyLoss -from transformers import (AutoModel, GenerationConfig, LlamaForCausalLM, - LlamaTokenizer) +from transformers import AutoModel, GenerationConfig, LlamaForCausalLM, LlamaTokenizer from transformers.modeling_outputs import CausalLMOutputWithPast from transformers.modeling_utils import PreTrainedModel from transformers import AutoTokenizer import re - - @register_model("internvl") class InternVLChat(lmms): config_class = InternVLChatConfig - main_input_name = 'pixel_values' - _no_split_modules = ['InternVisionEncoderLayer', 'LlamaDecoderLayer'] + main_input_name = "pixel_values" + _no_split_modules = ["InternVisionEncoderLayer", "LlamaDecoderLayer"] def __init__( - self, config: Optional[InternVLChatConfig] = None, - pretrained:str="OpenGVLab/InternVL-Chat-V1-5", - truncation: Optional[bool] = True, - device: Optional[str] = "cuda:0", - dtype: Optional[Union[str, torch.dtype]] = "auto", - batch_size: Optional[Union[int, str]] = 1, - trust_remote_code: Optional[bool] = False, - revision=None, - device_map="cuda:0", - conv_template="vicuna_v1", - use_cache=True, - truncate_context=False, # whether to truncate the context in generation, set it False for LLaVA-1.6 - customized_config=None, # ends in json - dynamic=True, - load_in_8bit=False, - vision_model=None, - language_model=None, - max_num=12, - **kwargs, + self, + config: Optional[InternVLChatConfig] = None, + pretrained: str = "OpenGVLab/InternVL-Chat-V1-5", + truncation: Optional[bool] = True, + device: Optional[str] = "cuda:0", + dtype: Optional[Union[str, torch.dtype]] = "auto", + batch_size: Optional[Union[int, str]] = 1, + trust_remote_code: Optional[bool] = False, + revision=None, + device_map="cuda:0", + conv_template="vicuna_v1", + use_cache=True, + truncate_context=False, # whether to truncate the context in generation, set it False for LLaVA-1.6 + customized_config=None, # ends in json + dynamic=True, + load_in_8bit=False, + vision_model=None, + language_model=None, + max_num=12, + **kwargs, ) -> None: super().__init__() @@ -100,24 +97,21 @@ def __init__( self._device = torch.device(f"cuda:{accelerator.local_process_index}") self.device_map = f"cuda:{accelerator.local_process_index}" - self.dynamic=dynamic #dynamic image_size - self.max_num=max_num - - - config=InternVLChatConfig.from_pretrained(pretrained) + self.dynamic = dynamic # dynamic image_size + self.max_num = max_num + + config = InternVLChatConfig.from_pretrained(pretrained) tokenizer = AutoTokenizer.from_pretrained(pretrained, trust_remote_code=True, use_fast=False) - model = InternVLChatModel.from_pretrained( - pretrained, low_cpu_mem_usage=True,config=config, torch_dtype=torch.bfloat16, - load_in_8bit=load_in_8bit).eval() + model = InternVLChatModel.from_pretrained(pretrained, low_cpu_mem_usage=True, config=config, torch_dtype=torch.bfloat16, load_in_8bit=load_in_8bit).eval() if not load_in_8bit: model = model.cuda() # self.model=model # self.device=self._device - self._tokenizer=tokenizer + self._tokenizer = tokenizer # self.tokenizer=tokenizer - self._model=model + self._model = model self._config = self._model.config - self.use_thumbnail=self.model.config.use_thumbnail + self.use_thumbnail = self.model.config.use_thumbnail self.model.eval() self.model.tie_weights() self.truncation = truncation @@ -157,63 +151,14 @@ def __init__( self._rank = 0 self._world_size = 1 - #from internvl model + # from internvl model self.image_size = config.force_image_size or config.vision_config.image_size - # patch_size = config.vision_config.patch_size - # self.patch_size = patch_size - # self.select_layer = config.select_layer - # self.template = config.template - # self.num_image_token = int((image_size // patch_size) ** 2 * (config.downsample_ratio ** 2)) - # self.downsample_ratio = config.downsample_ratio - # self.ps_version = config.ps_version - - # eval_logger.info(f'num_image_token: {self.num_image_token}') - # eval_logger.info(f'ps_version: {self.ps_version}') - # if vision_model is not None: - # self.vision_model = vision_model - # else: - # self.vision_model = InternVisionModel(config.vision_config) - # if language_model is not None: - # self.language_model = language_model - # else: - # if config.llm_config.architectures[0] == 'LlamaForCausalLM': - # self.language_model = LlamaForCausalLM(config.llm_config) - # elif config.llm_config.architectures[0] == 'InternLM2ForCausalLM': - # self.language_model = InternLM2ForCausalLM(config.llm_config) - # else: - # raise NotImplementedError(f'{config.llm_config.architectures[0]} is not implemented.') - - # vit_hidden_size = config.vision_config.hidden_size - # llm_hidden_size = config.llm_config.hidden_size - - # self.mlp1 = nn.Sequential( - # nn.LayerNorm(vit_hidden_size * int(1 / self.downsample_ratio) ** 2), - # nn.Linear(vit_hidden_size * int(1 / self.downsample_ratio) ** 2, llm_hidden_size), - # nn.GELU(), - # nn.Linear(llm_hidden_size, llm_hidden_size) - # ) - - # # if config.force_image_size != config.vision_config.image_size: - # # self.vision_model.resize_pos_embeddings( - # # old_size=config.vision_config.image_size, - # # new_size=config.force_image_size, - # # patch_size=config.vision_config.patch_size - # # ) - - # self.img_context_token_id = None - # self.neftune_alpha = None - - # if config.use_backbone_lora: - # self.wrap_backbone_lora(r=config.use_backbone_lora, lora_alpha=2 * config.use_backbone_lora) - - # if config.use_llm_lora: - # self.wrap_llm_lora(r=config.use_llm_lora, lora_alpha=2 * config.use_llm_lora) def wrap_backbone_lora(self, r=128, lora_alpha=256, lora_dropout=0.05): lora_config = LoraConfig( r=r, - target_modules=['attn.qkv', 'attn.proj', 'mlp.fc1', 'mlp.fc2'], + target_modules=["attn.qkv", "attn.proj", "mlp.fc1", "mlp.fc2"], lora_alpha=lora_alpha, lora_dropout=lora_dropout, ) @@ -222,12 +167,7 @@ def wrap_backbone_lora(self, r=128, lora_alpha=256, lora_dropout=0.05): def wrap_llm_lora(self, r=128, lora_alpha=256, lora_dropout=0.05): lora_config = LoraConfig( - r=r, - target_modules=['self_attn.q_proj', 'self_attn.k_proj', 'self_attn.v_proj', 'self_attn.o_proj', - 'mlp.gate_proj', 'mlp.down_proj', 'mlp.up_proj'], - lora_alpha=lora_alpha, - lora_dropout=lora_dropout, - task_type='CAUSAL_LM' + r=r, target_modules=["self_attn.q_proj", "self_attn.k_proj", "self_attn.v_proj", "self_attn.o_proj", "mlp.gate_proj", "mlp.down_proj", "mlp.up_proj"], lora_alpha=lora_alpha, lora_dropout=lora_dropout, task_type="CAUSAL_LM" ) self.language_model = get_peft_model(self.language_model, lora_config) self.language_model.enable_input_require_grads() @@ -240,11 +180,9 @@ def pixel_shuffle(self, x, scale_factor=0.5): # N, W, H * scale, C // scale --> N, H * scale, W, C // scale x = x.permute(0, 2, 1, 3).contiguous() # N, H * scale, W, C // scale --> N, H * scale, W * scale, C // (scale ** 2) - x = x.view(n, int(h * scale_factor), int(w * scale_factor), - int(c / (scale_factor * scale_factor))) - if self.ps_version == 'v1': - warnings.warn("In ps_version 'v1', the height and width have not been swapped back, " - 'which results in a transposed image.') + x = x.view(n, int(h * scale_factor), int(w * scale_factor), int(c / (scale_factor * scale_factor))) + if self.ps_version == "v1": + warnings.warn("In ps_version 'v1', the height and width have not been swapped back, " "which results in a transposed image.") else: x = x.permute(0, 2, 1, 3).contiguous() return x @@ -257,15 +195,9 @@ def noised_embed(self, vit_embeds, noise_alpha=5): def extract_feature(self, pixel_values): if self.select_layer == -1: - vit_embeds = self.vision_model( - pixel_values=pixel_values, - output_hidden_states=False, - return_dict=True).last_hidden_state + vit_embeds = self.vision_model(pixel_values=pixel_values, output_hidden_states=False, return_dict=True).last_hidden_state else: - vit_embeds = self.vision_model( - pixel_values=pixel_values, - output_hidden_states=True, - return_dict=True).hidden_states[self.select_layer] + vit_embeds = self.vision_model(pixel_values=pixel_values, output_hidden_states=True, return_dict=True).hidden_states[self.select_layer] vit_embeds = vit_embeds[:, 1:, :] if self.training and self.neftune_alpha is not None: @@ -275,16 +207,14 @@ def extract_feature(self, pixel_values): vit_embeds = vit_embeds.reshape(vit_embeds.shape[0], h, w, -1) vit_embeds = self.pixel_shuffle(vit_embeds, scale_factor=self.downsample_ratio) vit_embeds = vit_embeds.reshape(vit_embeds.shape[0], -1, vit_embeds.shape[-1]) - vit_embeds = self.mlp1(vit_embeds)#.to(pixel_values.device) + vit_embeds = self.mlp1(vit_embeds) # .to(pixel_values.device) return vit_embeds - def multi_image_chat(self, tokenizer, pixel_values, image_counts, question, generation_config, history=None, - return_history=False, IMG_START_TOKEN='', IMG_END_TOKEN='', IMG_CONTEXT_TOKEN=''): - + def multi_image_chat(self, tokenizer, pixel_values, image_counts, question, generation_config, history=None, return_history=False, IMG_START_TOKEN="", IMG_END_TOKEN="", IMG_CONTEXT_TOKEN=""): img_context_token_id = tokenizer.convert_tokens_to_ids(IMG_CONTEXT_TOKEN) self.img_context_token_id = img_context_token_id - if tokenizer.convert_tokens_to_ids('<|im_end|>') != 0: - eos_token_id = tokenizer.convert_tokens_to_ids('<|im_end|>') # 92542, InternLM2 + if tokenizer.convert_tokens_to_ids("<|im_end|>") != 0: + eos_token_id = tokenizer.convert_tokens_to_ids("<|im_end|>") # 92542, InternLM2 else: eos_token_id = tokenizer.eos_token_id @@ -294,37 +224,32 @@ def multi_image_chat(self, tokenizer, pixel_values, image_counts, question, gene if history is None: history = [] - image_tokens = '' + image_tokens = "" image_bs = pixel_values.shape[0] - print(f'dynamic ViT batch size: {image_bs}, image_counts: {image_counts}') + print(f"dynamic ViT batch size: {image_bs}, image_counts: {image_counts}") for idx, image_count in enumerate(image_counts): - image_tokens += f' (图{idx+1}):' + IMG_START_TOKEN + IMG_CONTEXT_TOKEN * self.num_image_token * image_count + IMG_END_TOKEN - question = image_tokens + '\n' + question + image_tokens += f" (图{idx+1}):" + IMG_START_TOKEN + IMG_CONTEXT_TOKEN * self.num_image_token * image_count + IMG_END_TOKEN + question = image_tokens + "\n" + question else: - for (old_question, old_answer) in history: + for old_question, old_answer in history: template.append_message(template.roles[0], old_question) template.append_message(template.roles[1], old_answer) template.append_message(template.roles[0], question) template.append_message(template.roles[1], None) query = template.get_prompt() - model_inputs = tokenizer(query, return_tensors='pt') - input_ids = model_inputs['input_ids'].cuda() - attention_mask = model_inputs['attention_mask'].cuda() - generation_config['eos_token_id'] = eos_token_id - - generation_output = self.generate( - pixel_values=pixel_values, - input_ids=input_ids, - attention_mask=attention_mask, - **generation_config - ) + model_inputs = tokenizer(query, return_tensors="pt") + input_ids = model_inputs["input_ids"].cuda() + attention_mask = model_inputs["attention_mask"].cuda() + generation_config["eos_token_id"] = eos_token_id + + generation_output = self.generate(pixel_values=pixel_values, input_ids=input_ids, attention_mask=attention_mask, **generation_config) response = tokenizer.batch_decode(generation_output, skip_special_tokens=True)[0] - response = response.split('<|im_end|>')[0].strip() # for InternLM2 + response = response.split("<|im_end|>")[0].strip() # for InternLM2 history.append((question, response)) if return_history: return response, history else: - query_to_print = query.replace(image_tokens, '') + query_to_print = query.replace(image_tokens, "") print(query_to_print, response) return response return response @@ -365,33 +290,32 @@ def tok_encode(self, string: str, left_truncate_len=None, add_special_tokens=Non if left_truncate_len: encoding = encoding[-left_truncate_len:] return encoding - + def tok_decode(self, tokens): try: return self.tokenizer.decode(tokens) except: return self.tokenizer.decode([tokens]) - - def post_processing(self,response): - response = response.replace('\n', '').replace('不是', 'No').replace('是', 'Yes').replace('否', 'No') - response = response.lower().replace('true', 'yes').replace('false', 'no') - pattern = re.compile(r'[\u4e00-\u9fa5]') - response = re.sub(pattern, '', response) + + def post_processing(self, response): + response = response.replace("\n", "").replace("不是", "No").replace("是", "Yes").replace("否", "No") + response = response.lower().replace("true", "yes").replace("false", "no") + pattern = re.compile(r"[\u4e00-\u9fa5]") + response = re.sub(pattern, "", response) return response @torch.no_grad() def generate( - self, - pixel_values: Optional[torch.FloatTensor] = None, - input_ids: Optional[torch.FloatTensor] = None, - attention_mask: Optional[torch.LongTensor] = None, - visual_features: Optional[torch.FloatTensor] = None, - generation_config: Optional[GenerationConfig] = None, - output_hidden_states: Optional[bool] = None, - return_dict: Optional[bool] = None, - **generate_kwargs, + self, + pixel_values: Optional[torch.FloatTensor] = None, + input_ids: Optional[torch.FloatTensor] = None, + attention_mask: Optional[torch.LongTensor] = None, + visual_features: Optional[torch.FloatTensor] = None, + generation_config: Optional[GenerationConfig] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + **generate_kwargs, ) -> torch.LongTensor: - assert self.img_context_token_id is not None if pixel_values is not None: if visual_features is not None: @@ -404,7 +328,7 @@ def generate( input_embeds = input_embeds.reshape(B * N, C) input_ids = input_ids.reshape(B * N) - selected = (input_ids == self.img_context_token_id) + selected = input_ids == self.img_context_token_id assert selected.sum() != 0 input_embeds[selected] = vit_embeds.reshape(-1, C).to(input_embeds.device) @@ -430,15 +354,13 @@ def flatten(self, input): for j in i: new_list.append(j) return new_list - - def load_image(self,flattened_visuals, input_size=224): - assert flattened_visuals[0].mode == 'RGB' - image = flattened_visuals[0].convert('RGB') + + def load_image(self, flattened_visuals, input_size=224): + assert flattened_visuals[0].mode == "RGB" + image = flattened_visuals[0].convert("RGB") transform = build_transform(is_train=False, input_size=input_size) if self.dynamic: - images = dynamic_preprocess(image, image_size=input_size, - use_thumbnail=self.use_thumbnail, - max_num=self.max_num) + images = dynamic_preprocess(image, image_size=input_size, use_thumbnail=self.use_thumbnail, max_num=self.max_num) else: images = [image] pixel_values = [transform(image) for image in images] @@ -470,8 +392,8 @@ def _collate(x): task = task[0] split = split[0] batched_visuals = [doc_to_visual[0](self.task_dict[task][split][ids]) for ids in doc_id] # [B, N] - flattened_visuals = self.flatten(batched_visuals) - pixel_values=self.load_image(flattened_visuals, self.image_size).cuda().to(torch.bfloat16) + flattened_visuals = self.flatten(batched_visuals) + pixel_values = self.load_image(flattened_visuals, self.image_size).cuda().to(torch.bfloat16) gen_kwargs = all_gen_kwargs[0] generation_config = dict( @@ -483,19 +405,15 @@ def _collate(x): eos_token_id=self.tokenizer.eos_token_id, ) question = contexts[0] - response = self.model.chat( - tokenizer=self.tokenizer, - pixel_values=pixel_values, - question=question, - generation_config=generation_config - ) - #TODO(choiszt) try batch_chat for multiple inputs - response=self.post_processing(response) + response = self.model.chat(tokenizer=self.tokenizer, pixel_values=pixel_values, question=question, generation_config=generation_config) + # TODO(choiszt) try batch_chat for multiple inputs + response = self.post_processing(response) res.append(response) self.cache_hook.add_partial("generate_until", (question, gen_kwargs), response) pbar.update(1) res = re_ords.get_original(res) return res - # print(chunk) + # print(chunk) + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: - pass \ No newline at end of file + pass diff --git a/lmms_eval/tasks/__init__.py b/lmms_eval/tasks/__init__.py index d2faee179..029f09fb3 100755 --- a/lmms_eval/tasks/__init__.py +++ b/lmms_eval/tasks/__init__.py @@ -112,7 +112,7 @@ def initialize_tasks(verbosity="INFO"): def get_task(task_name, model_name): try: - return TASK_REGISTRY[task_name](model_name=model_name) #TODO choiszt the return result need to check " 'mmeConfigurableTask' object has no attribute '_instances'. Did you mean: 'instances'?" + return TASK_REGISTRY[task_name](model_name=model_name) # TODO choiszt the return result need to check " 'mmeConfigurableTask' object has no attribute '_instances'. Did you mean: 'instances'?" except KeyError: eval_logger.info("Available tasks:") eval_logger.info(list(TASK_REGISTRY) + list(GROUP_REGISTRY)) From 140c8a1258c9649b46360438593395b05c7e23e6 Mon Sep 17 00:00:00 2001 From: choiszt Date: Sun, 5 May 2024 06:02:24 +0000 Subject: [PATCH 035/181] update setup and bash command for evaluating InternVL --- lmms_eval/models/internvl.py | 37 ++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/lmms_eval/models/internvl.py b/lmms_eval/models/internvl.py index 8b556bd6a..593f9a183 100644 --- a/lmms_eval/models/internvl.py +++ b/lmms_eval/models/internvl.py @@ -59,6 +59,43 @@ class InternVLChat(lmms): main_input_name = "pixel_values" _no_split_modules = ["InternVisionEncoderLayer", "LlamaDecoderLayer"] + """ + How to Install InternVL: + 1. Clone the InternVL repository: + git clone https://github.com/OpenGVLab/InternVL.git + + 2. Install the requirements: + pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118 + + 3. Install flash-attn==2.3.6: + pip install flash-attn==2.3.6 --no-build-isolation + """ + + """ + How to download the pretrained model: + 1. Download the pretrained model from hugginface: + cd pretrained/ + # pip install -U huggingface_hub + huggingface-cli download --resume-download --local-dir-use-symlinks False OpenGVLab/InternVL-Chat-V1-5 --local-dir InternVL-Chat-V1-5 + + 2. the pretrained model should be in the following directory: + pretrained + └── InternVL-Chat-V1-5 + """ + + """ + InternVL-Chat-V1-5 Model for OpenGVLab https://github.com/OpenGVLab/InternVL/blob/main/internvl_chat/internvl/model/internvl_chat/modeling_internvl_chat.py + Example usage: + + accelerate launch --num_processes=8 -m lmms_eval \ + --model internvl \ + --model_args pretrained=pretrained/InternVL-Chat-V1-5 \ + --tasks mme \ + --batch_size 1 \ + --output_path ./logs/ \ + --log_samples + """ + def __init__( self, config: Optional[InternVLChatConfig] = None, From 64b56383676f1f738d6c3d32e216f0d84e842b8b Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 6 May 2024 01:25:46 +0000 Subject: [PATCH 036/181] Snapshot download for internvl ckpt --- lmms_eval/models/internvl.py | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/lmms_eval/models/internvl.py b/lmms_eval/models/internvl.py index 593f9a183..bbc16c582 100644 --- a/lmms_eval/models/internvl.py +++ b/lmms_eval/models/internvl.py @@ -51,7 +51,7 @@ from transformers.modeling_utils import PreTrainedModel from transformers import AutoTokenizer import re - +from huggingface_hub import snapshot_download @register_model("internvl") class InternVLChat(lmms): @@ -60,9 +60,15 @@ class InternVLChat(lmms): _no_split_modules = ["InternVisionEncoderLayer", "LlamaDecoderLayer"] """ + 0. Install lmms-eval + cd lmms-eval + pip install -e . + How to Install InternVL: 1. Clone the InternVL repository: git clone https://github.com/OpenGVLab/InternVL.git + cd InternVL/internvl_chat + pip install -e . 2. Install the requirements: pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118 @@ -82,14 +88,19 @@ class InternVLChat(lmms): pretrained └── InternVL-Chat-V1-5 """ + + # + # The above steps can be optional, I add snapshot download, so now can just use hf repo_id + # model_args pretrained=OpenGVLab/InternVL-Chat-V1-5 + # """ InternVL-Chat-V1-5 Model for OpenGVLab https://github.com/OpenGVLab/InternVL/blob/main/internvl_chat/internvl/model/internvl_chat/modeling_internvl_chat.py Example usage: - accelerate launch --num_processes=8 -m lmms_eval \ + accelerate launch --num_processes=8 --main_process_port 12345 -m lmms_eval \ --model internvl \ - --model_args pretrained=pretrained/InternVL-Chat-V1-5 \ + --model_args pretrained=OpenGVLab/InternVL-Chat-V1-5 \ --tasks mme \ --batch_size 1 \ --output_path ./logs/ \ @@ -136,10 +147,15 @@ def __init__( self.dynamic = dynamic # dynamic image_size self.max_num = max_num - - config = InternVLChatConfig.from_pretrained(pretrained) - tokenizer = AutoTokenizer.from_pretrained(pretrained, trust_remote_code=True, use_fast=False) - model = InternVLChatModel.from_pretrained(pretrained, low_cpu_mem_usage=True, config=config, torch_dtype=torch.bfloat16, load_in_8bit=load_in_8bit).eval() + if accelerator.is_main_process: + cache_dir = snapshot_download(repo_id=pretrained, cache_dir="cache_dir", local_dir="cache_dir", local_dir_use_symlinks=False) + accelerator.wait_for_everyone() + # So what I did is that I let main process to download the repo, and then + # other process can just simply read from this repo + cache_dir = snapshot_download(repo_id=pretrained, cache_dir="cache_dir", local_dir="cache_dir", local_dir_use_symlinks=False) + config = InternVLChatConfig.from_pretrained(cache_dir) + tokenizer = AutoTokenizer.from_pretrained(cache_dir, trust_remote_code=True, use_fast=False) + model = InternVLChatModel.from_pretrained(cache_dir, low_cpu_mem_usage=True, config=config, torch_dtype=torch.bfloat16, load_in_8bit=load_in_8bit).eval() if not load_in_8bit: model = model.cuda() # self.model=model @@ -263,7 +279,7 @@ def multi_image_chat(self, tokenizer, pixel_values, image_counts, question, gene history = [] image_tokens = "" image_bs = pixel_values.shape[0] - print(f"dynamic ViT batch size: {image_bs}, image_counts: {image_counts}") + # print(f"dynamic ViT batch size: {image_bs}, image_counts: {image_counts}") for idx, image_count in enumerate(image_counts): image_tokens += f" (图{idx+1}):" + IMG_START_TOKEN + IMG_CONTEXT_TOKEN * self.num_image_token * image_count + IMG_END_TOKEN question = image_tokens + "\n" + question @@ -287,7 +303,7 @@ def multi_image_chat(self, tokenizer, pixel_values, image_counts, question, gene return response, history else: query_to_print = query.replace(image_tokens, "") - print(query_to_print, response) + # print(query_to_print, response) return response return response From eec83c361ab51deeb8fb37a8892bb7a8c530b3a9 Mon Sep 17 00:00:00 2001 From: Kaichen Zhang - NTU Date: Mon, 6 May 2024 10:50:29 +0800 Subject: [PATCH 037/181] Update prompt in utils.py --- lmms_eval/tasks/worldqa/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lmms_eval/tasks/worldqa/utils.py b/lmms_eval/tasks/worldqa/utils.py index 57d4de46d..20dea7390 100755 --- a/lmms_eval/tasks/worldqa/utils.py +++ b/lmms_eval/tasks/worldqa/utils.py @@ -62,7 +62,8 @@ Let's begin this task: question: {question} ground truth: {answer} -candidate: {candidate}""" +candidate: {candidate} +""" def get_eval(question: str, ground_truth: str, candidate: str, max_tokens: int, retries: int = 5): From b8e31d8e07c8a2a82532f842e9649c0796f16098 Mon Sep 17 00:00:00 2001 From: Li Bo Date: Mon, 6 May 2024 12:43:32 +0800 Subject: [PATCH 038/181] update (#85) --- .../tasks/mix_evals/_default_template_yaml | 4 +- .../tasks/mix_evals/mix_evals_video2text.yaml | 2 +- .../mix_evals_video2text_freeform.yaml | 8 +- .../mix_evals/mix_evals_video2text_mc.yaml | 2 +- .../mix_evals_video2text_openended.yaml | 12 +- lmms_eval/tasks/mix_evals/utils.py | 108 +++++++++++++++++- lmms_eval/tasks/worldqa/utils.py | 18 --- 7 files changed, 126 insertions(+), 28 deletions(-) diff --git a/lmms_eval/tasks/mix_evals/_default_template_yaml b/lmms_eval/tasks/mix_evals/_default_template_yaml index 2549e95c8..ce26b0ea1 100644 --- a/lmms_eval/tasks/mix_evals/_default_template_yaml +++ b/lmms_eval/tasks/mix_evals/_default_template_yaml @@ -11,4 +11,6 @@ model_specific_prompt_kwargs: pre_prompt: "These are frames from a video. Please answer the following questions about the video." post_prompt: "" metadata: - modality: video \ No newline at end of file + modality: video + version: 0.0 + gpt_eval_model_name: "gpt-3.5-turbo" \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text.yaml index bee421c0d..ed0a517c0 100755 --- a/lmms_eval/tasks/mix_evals/mix_evals_video2text.yaml +++ b/lmms_eval/tasks/mix_evals/mix_evals_video2text.yaml @@ -1,5 +1,5 @@ group: mix_evals_video2text task: -- mix_evals_video2text_open +- mix_evals_video2text_openconv - mix_evals_video2text_mc - mix_evals_video2text_freeform \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml index e03ce2473..dc8332d03 100755 --- a/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml +++ b/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml @@ -5,17 +5,17 @@ output_type: generate_until doc_to_visual: !function utils.mix_evals_video2text_doc_to_visual doc_to_text: !function utils.mix_evals_video2text_doc_to_text doc_to_target: "{{target}}" - +process_results: !function utils.mix_evals_video2text_process_results_freeform metric_list: - - metric: anls - aggregation: mean + - metric: gpt_eval + aggregation: !function utils.mix_evals_video2text_gpt_eval higher_is_better: true include: _default_template_yaml model_specific_prompt_kwargs: default: - pre_prompt: "" + pre_prompt: "These are frames from a video. Please answer the following questions about the video." post_prompt: "Answer the question using a single word or phrase." gpt4v: pre_prompt: "These are frames from a video. Please answer the following questions about the video." diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml index 1ff2be786..1b2fd0840 100755 --- a/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml +++ b/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml @@ -25,7 +25,7 @@ filter_list: model_specific_prompt_kwargs: default: - pre_prompt: "" + pre_prompt: "These are frames from a video. Please answer the following questions about the video." post_prompt: "Answer with the option’s letter from the given choices directly." gpt4v: pre_prompt: "These are frames from a video. Please answer the following questions about the video." diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml index 965cf750a..4216ba547 100755 --- a/lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml +++ b/lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml @@ -1,13 +1,21 @@ dataset_name: "video2text_openended" -task: "mix_evals_video2text_open" +task: "mix_evals_video2text_openconv" test_split: test output_type: generate_until doc_to_visual: !function utils.mix_evals_video2text_doc_to_visual doc_to_text: !function utils.mix_evals_video2text_doc_to_text_open_convs doc_to_target: "" process_results: !function utils.mix_evals_video2text_process_results_open_convs + metric_list: - metric: submission aggregation: !function utils.mix_evals_video2text_aggregate_gen higher_is_better: true -include: _default_template_yaml + +model_specific_prompt_kwargs: + default: + pre_prompt: "These are frames from a video. Please answer the following questions about the video." + post_prompt: "Answer with the option’s letter from the given choices directly." + gpt4v: + pre_prompt: "These are frames from a video. Please answer the following questions about the video." + post_prompt: "Answer with the option’s letter from the given choices directly." diff --git a/lmms_eval/tasks/mix_evals/utils.py b/lmms_eval/tasks/mix_evals/utils.py index 2151fcfa0..7b08cab6d 100755 --- a/lmms_eval/tasks/mix_evals/utils.py +++ b/lmms_eval/tasks/mix_evals/utils.py @@ -8,6 +8,8 @@ import logging import yaml from pathlib import Path +import requests +import time with open(Path(__file__).parent / "_default_template_yaml", "r") as f: raw_data = f.readlines() @@ -19,6 +21,88 @@ config = yaml.safe_load("".join(safe_data)) +NUM_SECONDS_TO_SLEEP = 5 +GPT_EVAL_MODEL_NAME = config["metadata"]["gpt_eval_model_name"] +API_TYPE = os.getenv("API_TYPE", "openai") + +if API_TYPE == "openai": + API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") + API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } +elif API_TYPE == "azure": + API_URL = os.getenv("AZURE_ENDPOINT", "https://api.cognitive.microsoft.com/sts/v1.0/issueToken") + API_KEY = os.getenv("AZURE_API_KEY", "YOUR_API_KEY") + headers = { + "api-key": API_KEY, + "Content-Type": "application/json", + } + +eval_prompt = """You are an AI assistant who will help me to evaluate the quality of a model response to a few candidate ground truth answers. + +Some criterion +- Response that perfectly reflect the meaning of the ground truth: 1 point +- Response that reflect none of the key points in the ground truth: 0 point +- Some part in the response are correct but some parts in the ground truth are not mentioned in the response: 0.5 point +- Some part in the response are correct but other parts in the response are not mentioned in the ground truth: 0.5 point + +Here're some examples about the scoring criterion and format: +model response: Steam Cleaning Services +ground truth: ["steam clean", "steam clean", "cleaning", "car", "steam clean"], +Point: 1 + +model response: A cowboy action shooter. +ground truth: ["man"] +Point: 1 + +model response: I'm sorry, but I can't assist with that request. +ground truth: ["quality"] +Point: 0 + +Let's begin this task: +model response: {model_response} +ground truth: {ground_truth} +Point:""" + + +def get_eval(model_response: str, ground_truth: str, max_tokens: int, retries: int = 5): + global headers + content = eval_prompt.format(model_response=model_response, ground_truth=ground_truth) + + messages = [ + {"role": "user", "content": content}, + ] + + payload = { + "model": GPT_EVAL_MODEL_NAME, + "messages": messages, + "temperature": 0.2, + "max_tokens": max_tokens, + } + + for attempt in range(retries): + try: + response = requests.post(API_URL, headers=headers, json=payload, timeout=60) + response.raise_for_status() + response_data = response.json() + + content = response_data["choices"][0]["message"]["content"].strip() + if content != "": + return content, response_data["model"] + break # If successful, break out of the loop + + except Exception as e: + eval_logger.info(f"Attempt {attempt + 1} failed with error: {e}") + if attempt < retries: # If we have retries left, sleep and then continue to next attempt + time.sleep(NUM_SECONDS_TO_SLEEP) + else: # If this was the last attempt, log and return empty + eval_logger.error(f"All {retries} attempts failed. Last error message: {e}") + return "", "" + return "", "" + + # A bit ugly here # But the idea is that we will unzip all the zip files # To HF HOME cache dir @@ -114,7 +198,14 @@ def mix_evals_video2text_process_results_open_convs(doc, result): def mix_evals_video2text_process_results_freeform(doc, result): pred = result[0] - return {"submission": {"pred": pred, "question_idx": doc["question_index"], "first_turn_video_caption": doc["first_turn_video_caption"], "target": ""}} + ground_truth_str = ", ".join([f'"{gt}"' for gt in doc["target"]]) + ground_truth_str = f"[{ground_truth_str}]" + content = eval_prompt.format(model_response=pred, ground_truth=ground_truth_str) + eval_answer, model_name = get_eval(model_response=pred, ground_truth=ground_truth_str, max_tokens=1024) + return { + "submission": {"pred": pred, "question_idx": doc["question_index"], "target": doc["target"], "eval_answer": eval_answer, "gpt_prompt": content}, + "gpt_eval": {"pred": pred, "question_idx": doc["question_index"], "target": doc["target"], "eval_answer": eval_answer, "gpt_prompt": content}, + } def mix_evals_video2text_aggregate_submissions(results, args, task): @@ -126,6 +217,21 @@ def mix_evals_video2text_aggregate_submissions(results, args, task): eval_logger.info(f"Submission file saved to {path}") +def mix_evals_video2text_gpt_eval(results, args): + score = 0 + for result in results: + eval_answer = result["eval_answer"] + eval_score = re.search(r"([0-9.]+)", eval_answer).group(1) + try: + eval_score = float(eval_score) + except Exception as e: + eval_logger.error(f"Error parsing eval_score: {e}") + eval_score = 0.0 + score += eval_score + + return score / len(results) + + # Factory into different aggregate def mix_evals_video2text_aggregate_gen(results, args): mix_evals_video2text_aggregate_submissions(results, args, "OpenConvs") diff --git a/lmms_eval/tasks/worldqa/utils.py b/lmms_eval/tasks/worldqa/utils.py index 20dea7390..b2585f05e 100755 --- a/lmms_eval/tasks/worldqa/utils.py +++ b/lmms_eval/tasks/worldqa/utils.py @@ -199,20 +199,6 @@ def worldq_gen_gpt_eval(results, args): return score / len(results) -def worldq_gen_gpt_eval(results, args): - score = 0 - for result in results: - eval_answer = result["eval_answer"] - eval_score = eval_answer.split("\n")[-1].strip() - try: - eval_score = float(eval_score) - except: - eval_score = 0.0 - score += eval_score - - return score / len(results) - - # Factory into different aggregate def worldqa_aggregate_gen(results, args): worldqa_aggregate_submissions(results, args, "Generation") @@ -230,10 +216,6 @@ def worldqa_aggregate_gen_eval(results, args): return -def worldqa_aggregate_gen_eval(results, args): - return - - def worldqa_doc_to_choice(doc): return [op.split(".")[1].strip() for op in doc["option"]] From e19e7f6d15f3ba31d407281819139ccc0d3c41e5 Mon Sep 17 00:00:00 2001 From: choiszt Date: Mon, 6 May 2024 06:03:32 +0000 Subject: [PATCH 039/181] update setup info --- lmms_eval/models/internvl.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/lmms_eval/models/internvl.py b/lmms_eval/models/internvl.py index bbc16c582..461579571 100644 --- a/lmms_eval/models/internvl.py +++ b/lmms_eval/models/internvl.py @@ -67,8 +67,6 @@ class InternVLChat(lmms): How to Install InternVL: 1. Clone the InternVL repository: git clone https://github.com/OpenGVLab/InternVL.git - cd InternVL/internvl_chat - pip install -e . 2. Install the requirements: pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118 From 43f5276ff449d1e006e86f97e5bcea713928f9ee Mon Sep 17 00:00:00 2001 From: kcz358 Date: Tue, 7 May 2024 09:54:07 +0000 Subject: [PATCH 040/181] Let gen_kwargs decide gen_config --- lmms_eval/models/internvl.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lmms_eval/models/internvl.py b/lmms_eval/models/internvl.py index 461579571..821488f1d 100644 --- a/lmms_eval/models/internvl.py +++ b/lmms_eval/models/internvl.py @@ -99,7 +99,7 @@ class InternVLChat(lmms): accelerate launch --num_processes=8 --main_process_port 12345 -m lmms_eval \ --model internvl \ --model_args pretrained=OpenGVLab/InternVL-Chat-V1-5 \ - --tasks mme \ + --tasks llava_wilder_small,llava_wilder_medium \ --batch_size 1 \ --output_path ./logs/ \ --log_samples @@ -447,12 +447,21 @@ def _collate(x): pixel_values = self.load_image(flattened_visuals, self.image_size).cuda().to(torch.bfloat16) gen_kwargs = all_gen_kwargs[0] + if "max_new_tokens" not in gen_kwargs: + gen_kwargs["max_new_tokens"] = 1024 + if "temperature" not in gen_kwargs: + gen_kwargs["temperature"] = 0 + if "top_p" not in gen_kwargs: + gen_kwargs["top_p"] = None + if "num_beams" not in gen_kwargs: + gen_kwargs["num_beams"] = 1 + generation_config = dict( do_sample=False, top_k=50, - top_p=0.9, - num_beams=5, - max_new_tokens=20, + top_p=gen_kwargs["top_p"], + num_beams=gen_kwargs["num_beams"], + max_new_tokens=gen_kwargs["max_new_tokens"], eos_token_id=self.tokenizer.eos_token_id, ) question = contexts[0] From c29d494528640ac2d61f54c743f4ce10beb027c3 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Tue, 7 May 2024 18:11:47 +0000 Subject: [PATCH 041/181] Revert "remove internvl subproject" This reverts commit 57b0cc96e9d6d2b2d275a712ecd179875103e41c. --- InternVL | 1 + 1 file changed, 1 insertion(+) create mode 160000 InternVL diff --git a/InternVL b/InternVL new file mode 160000 index 000000000..e611cdd61 --- /dev/null +++ b/InternVL @@ -0,0 +1 @@ +Subproject commit e611cdd613485e4a47f0289b616a7db0b4db8451 From 4da72eb55de2d62d879d677de9ed64e2ead474e8 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Tue, 7 May 2024 18:12:36 +0000 Subject: [PATCH 042/181] Revert "[Feat] add intern-vl (#87)" This reverts commit 6fc5beea1c05cfd457817fa1eeedb867037607d7. --- InternVL | 1 - 1 file changed, 1 deletion(-) delete mode 160000 InternVL diff --git a/InternVL b/InternVL deleted file mode 160000 index e611cdd61..000000000 --- a/InternVL +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e611cdd613485e4a47f0289b616a7db0b4db8451 From bb7d9036ea788115cfd00f3aa906482f94c02e84 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Wed, 8 May 2024 05:44:01 +0000 Subject: [PATCH 043/181] No error for internvl if internvl not installed --- lmms_eval/models/internvl.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lmms_eval/models/internvl.py b/lmms_eval/models/internvl.py index 821488f1d..660023da2 100644 --- a/lmms_eval/models/internvl.py +++ b/lmms_eval/models/internvl.py @@ -55,7 +55,7 @@ @register_model("internvl") class InternVLChat(lmms): - config_class = InternVLChatConfig + #config_class = InternVLChatConfig main_input_name = "pixel_values" _no_split_modules = ["InternVisionEncoderLayer", "LlamaDecoderLayer"] @@ -99,7 +99,7 @@ class InternVLChat(lmms): accelerate launch --num_processes=8 --main_process_port 12345 -m lmms_eval \ --model internvl \ --model_args pretrained=OpenGVLab/InternVL-Chat-V1-5 \ - --tasks llava_wilder_small,llava_wilder_medium \ + --tasks llava_wilder_small \ --batch_size 1 \ --output_path ./logs/ \ --log_samples @@ -107,7 +107,7 @@ class InternVLChat(lmms): def __init__( self, - config: Optional[InternVLChatConfig] = None, + config = None, pretrained: str = "OpenGVLab/InternVL-Chat-V1-5", truncation: Optional[bool] = True, device: Optional[str] = "cuda:0", From ef439e169a026c8523d121a61ff4f46da870c7be Mon Sep 17 00:00:00 2001 From: kcz358 Date: Wed, 8 May 2024 05:44:23 +0000 Subject: [PATCH 044/181] Change split of small --- lmms_eval/tasks/llava_wilder/llava_wilder_small.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lmms_eval/tasks/llava_wilder/llava_wilder_small.yaml b/lmms_eval/tasks/llava_wilder/llava_wilder_small.yaml index aa947903c..54b188975 100644 --- a/lmms_eval/tasks/llava_wilder/llava_wilder_small.yaml +++ b/lmms_eval/tasks/llava_wilder/llava_wilder_small.yaml @@ -3,7 +3,7 @@ dataset_name: Small dataset_kwargs: token: True task: "llava_wilder_small" -test_split: test +test_split: train model_specific_prompt_kwargs: default: pre_prompt: "" From 914eb417fe90dfc211ae209f38d5449cd94b641f Mon Sep 17 00:00:00 2001 From: kcz358 Date: Wed, 8 May 2024 05:44:46 +0000 Subject: [PATCH 045/181] Change judge prompt of wilder --- lmms_eval/tasks/llava_wilder/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lmms_eval/tasks/llava_wilder/utils.py b/lmms_eval/tasks/llava_wilder/utils.py index a4450f061..9eb0c8ec5 100644 --- a/lmms_eval/tasks/llava_wilder/utils.py +++ b/lmms_eval/tasks/llava_wilder/utils.py @@ -20,7 +20,7 @@ NUM_SECONDS_TO_SLEEP = 5 dir_path = os.path.dirname(os.path.realpath(__file__)) -judge_rules = "We would like to request your feedback on the performance of two AI assistants in response to the user question displayed above. The user asks the question on observing an image shown to you. \nPlease rate the helpfulness, relevance, accuracy, level of details of their responses. Each assistant receives an overall score on a scale of 1 to 10, where a higher score indicates better overall performance.\nPlease first output a single line containing only two values indicating the scores for Assistant 1 and 2, respectively. The two scores are separated by a space.\nIn the subsequent line, please provide a comprehensive explanation of your evaluation, avoiding any potential bias and ensuring that the order in which the responses were presented does not affect your judgment." +judge_rules = "We would like to request your feedback on the performance of two AI assistants in response to the user question displayed above. The user asks the question on observing an image shown to you. \nPlease rate the helpfulness, relevance, accuracy, level of details of their responses. Each assistant receives an overall score on a scale of 1 to 10, where a higher score indicates better overall performance. Assume assistant 1 always receive a score of 10 and is the correct answer.\nPlease first output a single line containing only two values indicating the scores for Assistant 1 and 2, respectively. The two scores are separated by a space.\nIn the subsequent line, please provide a comprehensive explanation of your evaluation, avoiding any potential bias and ensuring that the order in which the responses were presented does not affect your judgment." with open(Path(__file__).parent / "_default_template_wilder_yaml", "r") as f: raw_data = f.readlines() From 4a9de44947cce72f47de2e581ecb01dcb7243d68 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Wed, 8 May 2024 05:48:32 +0000 Subject: [PATCH 046/181] Remove unnecessary items --- 1.jpg | Bin 78872 -> 0 bytes InternVL | 1 - 2 files changed, 1 deletion(-) delete mode 100644 1.jpg delete mode 160000 InternVL diff --git a/1.jpg b/1.jpg deleted file mode 100644 index dc5d849fcaf8165cdf9a232af472b19cd36ba864..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78872 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 >fOT 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

?w^JpvC|_LRLyq%7glR5<|Kys5yl&rl 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 E1!Ooh5dZ)H diff --git a/InternVL b/InternVL deleted file mode 160000 index e611cdd61..000000000 --- a/InternVL +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e611cdd613485e4a47f0289b616a7db0b4db8451 From 2ad1e14d89a8616c5f72fa8767c4411b6b1f8a76 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Wed, 8 May 2024 14:47:23 +0000 Subject: [PATCH 047/181] Fix gpt4v one process bugs --- lmms_eval/models/gpt4v.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lmms_eval/models/gpt4v.py b/lmms_eval/models/gpt4v.py index 89b63208a..7baef8137 100755 --- a/lmms_eval/models/gpt4v.py +++ b/lmms_eval/models/gpt4v.py @@ -73,6 +73,10 @@ def __init__( eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") self._rank = self.accelerator.local_process_index self._world_size = self.accelerator.num_processes + else: + self.accelerator = accelerator + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes self.device = self.accelerator.device From 51c6a6d8214739f2eb82b1ae34964b698c7d2153 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Thu, 9 May 2024 08:36:02 +0000 Subject: [PATCH 048/181] Update gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 4f9826e67..a589d76f1 100755 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,5 @@ zk.log cache_dir ckpt pretrained/ -LLaVA/ \ No newline at end of file +LLaVA/ +*logs \ No newline at end of file From aabb9648628954d835de7bfea2c2698e7e78b671 Mon Sep 17 00:00:00 2001 From: ZhangYuanhan-AI Date: Sun, 12 May 2024 04:01:03 +0000 Subject: [PATCH 049/181] Add video detail description task and template YAML files (cherry picked from commit 55e6d15d314e9e9cb2c61397a576446ceff29f75) --- .../_default_template_yaml | 13 + .../video_detail_detail_description/utils.py | 274 ++++++++++++++++++ .../video_detail_description.yaml | 15 + tools/make_hf_dataset.ipynb | 207 ++++++++++--- 4 files changed, 470 insertions(+), 39 deletions(-) create mode 100644 lmms_eval/tasks/video_detail_detail_description/_default_template_yaml create mode 100755 lmms_eval/tasks/video_detail_detail_description/utils.py create mode 100755 lmms_eval/tasks/video_detail_detail_description/video_detail_description.yaml diff --git a/lmms_eval/tasks/video_detail_detail_description/_default_template_yaml b/lmms_eval/tasks/video_detail_detail_description/_default_template_yaml new file mode 100644 index 000000000..57bc49410 --- /dev/null +++ b/lmms_eval/tasks/video_detail_detail_description/_default_template_yaml @@ -0,0 +1,13 @@ +dataset_path: lmms-lab/VideoDetailDescription +dataset_kwargs: + token: True + video: True + cache_dir: video-chatgpt +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" + +metadata: + version: 0.0 + gpt_eval_model_name: gpt-3.5-turbo-0613 \ No newline at end of file diff --git a/lmms_eval/tasks/video_detail_detail_description/utils.py b/lmms_eval/tasks/video_detail_detail_description/utils.py new file mode 100755 index 000000000..7bcb5f847 --- /dev/null +++ b/lmms_eval/tasks/video_detail_detail_description/utils.py @@ -0,0 +1,274 @@ +from decord import VideoReader, cpu +import numpy as np +import os +import sys +import datetime +import lmms_eval.tasks._task_utils.file_utils as file_utils +import json +import logging +import yaml +from pathlib import Path + +with open(Path(__file__).parent / "_default_template_yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + # remove function definition since yaml load cannot handle it + if "!function" not in line: + safe_data.append(line) + + config = yaml.safe_load("".join(safe_data)) + + +NUM_SECONDS_TO_SLEEP = 5 + +GPT_EVAL_MODEL_NAME = config["metadata"]["gpt_eval_model_name"] + +API_TYPE = os.getenv("API_TYPE", "openai") + +if API_TYPE == "openai": + API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") + API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } + +# A bit ugly here +# But the idea is that we will unzip all the zip files +# To HF HOME cache dir +# And load it here +HF_HOME = os.environ['HF_HOME'] +cache_dir = config['dataset_kwargs']["cache_dir"] +cache_dir = os.path.join(HF_HOME, cache_dir) +cache_dir = os.path.join(cache_dir, "evaluation/Test_Videos") + +eval_logger = logging.getLogger("lmms-eval") + +# Pass in video path here +# Can only work correctly with video llm +def video_detail_description_doc_to_visual(doc): + video_path = doc["video_name"] + ".mp4" + video_path = os.path.join(cache_dir, video_path) + if os.path.exists(video_path): + video_path = video_path + elif os.path.exists(video_path.replace("mp4", "MP4")): + video_path = video_path.replace("mp4", "MP4") + elif os.path.exists(video_path.replace("mp4", "mkv")): + video_path = video_path.replace("mp4", "mkv") + else: + sys.exit(f"video path:{video_path} does not exist, please check") + return [video_path] + +# format the question +def video_detail_description_doc_to_text(doc, model_specific_prompt_kwargs=None): + if model_specific_prompt_kwargs is None: + model_specific_prompt_kwargs = {} + pre_prompt = "" + post_prompt = "" + if "pre_prompt" in model_specific_prompt_kwargs: + pre_prompt = model_specific_prompt_kwargs["pre_prompt"] + if "post_prompt" in model_specific_prompt_kwargs: + post_prompt = model_specific_prompt_kwargs["post_prompt"] + + question = doc['question'] + if 'question_1' in doc: + for op in doc['option']: + question += "\n" + op + post_prompt = "\nAnswer with the option's letter from the given choices directly." + + return f"{pre_prompt}{question}{post_prompt}" + + +def video_detail_description_doc_to_answer(doc): + return doc["answer"] + +# Process result for evaluation in generic task +def video_detail_description_process_results_generic(doc, result): + pred = result[0] + + return {"submission" : {"video_name" : doc["video_name"], "Q" : doc["question"], "A" : doc["answer"], "pred" : pred}} + +def video_detail_description_aggregate_submissions(results, args): + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + submission_file_name = f"video_detail_description-{now_date_time}.json" + path = file_utils.generate_submission_file(submission_file_name, args) + + with open(path, "w") as f: + json.dump(results, f, indent=4) + + eval_logger.info(f"Submission file saved to {path}") + + return path + + +def get_eval_generic(question, answer, pred, task, max_tokens: int, retries: int = 5): + global headers + + messages = [ + { + "role": "system", + "content": "You are an intelligent chatbot designed for evaluating the detail orientation of generative outputs for video-based question-answer pairs. " + "Your task is to compare the predicted answer with the correct answer and determine its level of detail, considering both completeness and specificity. Here's how you can accomplish the task:" + "------" + "##INSTRUCTIONS: " + "- Check if the predicted answer covers all major points from the video. The response should not leave out any key aspects.\n" + "- Evaluate whether the predicted answer includes specific details rather than just generic points. It should provide comprehensive information that is tied to specific elements of the video.\n" + "- Consider synonyms or paraphrases as valid matches.\n" + "- Provide a single evaluation score that reflects the level of detail orientation of the prediction, considering both completeness and specificity.", + }, + { + "role": "user", + "content": "Please evaluate the following video-based question-answer pair:\n\n" + f"Question: {question}\n" + f"Correct Answer: {answer}\n" + f"Predicted Answer: {pred}\n\n" + "Provide your evaluation only as a detail orientation score where the detail orientation score is an integer value between 0 and 5, with 5 indicating the highest level of detail orientation. " + "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is the detail orientation score in INTEGER, not STRING." + "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. " + "For example, your response should look like this: {''score': 4.8}.", + }, + ] + + print(messages) + payload = { + "model": GPT_EVAL_MODEL_NAME, + "messages": messages, + "temperature": 0, + "max_tokens": max_tokens, + } + + for attempt in range(retries): + try: + response = requests.post(API_URL, headers=headers, json=payload, timeout=60) + response.raise_for_status() # Raises HTTPError for bad responses + try: + response_data = response.json() # Attempt to parse JSON + except requests.exceptions.JSONDecodeError: + eval_logger.error(f"JSON decode error on attempt {attempt + 1}. Response text: {response.text}") + continue # Skip to next retry + content = response_data["choices"][0]["message"]["content"].strip() + if content != "": + return content, response_data["model"] + # Handle HTTP errors separately + except requests.exceptions.HTTPError as e: + eval_logger.error(f"HTTP error on attempt {attempt + 1}: {e}") + # Handle other requests-related errors + except requests.exceptions.RequestException as e: + eval_logger.error(f"Request exception on attempt {attempt + 1}: {e}") + except Exception as e: + eval_logger.error(f"Unexpected error on attempt {attempt + 1}: {e}") + + # Handle other unexpected errors + if attempt < retries - 1: + time.sleep(NUM_SECONDS_TO_SLEEP) + else: # If this was the last attempt, log and return empty + eval_logger.error(f"All {retries} attempts failed. Last error message: {e}") + return "", "" + + return "", "" + + +def parse_score(review): + try: + # Convert the string representation of a dictionary to an actual dictionary + review_dict = ast.literal_eval(review) + score = review_dict.get('score', 0) + return float(score) + except SyntaxError as e: + eval_logger.error(f"Syntax error parsing the review string: {e}. Review content: {review}") + return 0 + except ValueError as e: + eval_logger.error(f"Value error parsing the review string: {e}. Review content: {review}") + return 0 + except Exception as e: + eval_logger.error(f"Unexpected error parsing the review string: {e}. Review content: {review}") + return 0 + +def print_scores(eval_file_path, args): + # Load the predictions from the result file + with open(eval_file_path, 'r') as file: + evaluated_list = json.load(file) + + score_file_name = "scores.json" + path = file_utils.generate_submission_file(score_file_name, args) + + # Compute average score + total_score = 0 + + # Iterate over the results to sum scores + for result_dict in evaluated_list: + total_score += result_dict["score"] + + # Calculate accuracy and average score + average_score = total_score / len(evaluated_list) if evaluated_list else 0 + + # Print the results + print(f"Average Score: {average_score}") + + # Write the processed data to the scores file + with open(path, "w") as f: + json.dump({ + "average_score": average_score + }, f, indent=4) + + eval_logger.info(f"Score file saved to {path}") + +def gpt_eval(result_file_path, args, task): + """ + Process the result file containing predictions, score them using GPT, + and save the results with added scores and correctness fields to a new file. + + Args: + result_file_path: path to the JSON file with results to be evaluated + """ + + eval_file_name = "gpt_eval_result.json" + eval_file_path = file_utils.generate_submission_file(eval_file_name, args) + + # Load the predictions from the result file + with open(result_file_path, 'r') as file: + result_list = json.load(file) + + evaluated_results = [] + + # Load the predictions from the result file + with open(result_file_path, 'r') as file: + result_list = json.load(file) + + + for data_dict in result_list: + try: + question = data_dict.get("Q", "") + answer = data_dict.get("A", "") + pred = data_dict.get("pred", "") + + # Assume get_eval returns a review and the model name, and parse_score parses this review + review, model_name = get_eval_generic(question, answer, pred, task, 64) + score = parse_score(review) + except Exception as e: + eval_logger.error(f"Error for Video Name: {data_dict.get('video_name', 'Unknown')}: {e}") + review = "Failed to Get a Proper Review." + model_name = "Failed Request" + score = 0 + + # Update the dictionary with the new entries + updated_dict = { + "video_name": data_dict["video_name"], + "score": score, + "Q": question, + "A": answer, + "pred": pred, + } + evaluated_results.append(updated_dict) + + # Save the evaluated results to a new JSON file + with open(eval_file_path, 'w') as f: + json.dump(evaluated_results, f, indent=4) + + return eval_file_path + +def video_detail_description_aggregate_correctness(results, args): + result_file_path = video_detail_description_aggregate_submissions(results, args) + eval_file_path = gpt_eval(result_file_path, args) + print_scores(eval_file_path, args) diff --git a/lmms_eval/tasks/video_detail_detail_description/video_detail_description.yaml b/lmms_eval/tasks/video_detail_detail_description/video_detail_description.yaml new file mode 100755 index 000000000..0ef6616d0 --- /dev/null +++ b/lmms_eval/tasks/video_detail_detail_description/video_detail_description.yaml @@ -0,0 +1,15 @@ +dataset_name: "Generic" +task: "video_detail_description" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.video_detail_description_doc_to_visual +doc_to_text: !function utils.video_detail_description_doc_to_text +doc_to_target: !function utils.video_detail_description_doc_to_answer +process_results: !function utils.video_detail_description_process_results_generic +metric_list: + - metric: submission + aggregation: !function utils.video_detail_description_aggregate_generic + higher_is_better: true + - metric: exact_match + higher_is_better: true +include: _default_template_yaml diff --git a/tools/make_hf_dataset.ipynb b/tools/make_hf_dataset.ipynb index efbef00e2..fd0b05367 100755 --- a/tools/make_hf_dataset.ipynb +++ b/tools/make_hf_dataset.ipynb @@ -12,56 +12,51 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from datasets import load_dataset\n", - "\n", - "data_path = \"Otter-AI/MMVet\"\n", - "df = load_dataset(data_path, split=\"test\").to_pandas()\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/tiger/miniconda3/envs/llava/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "100%|██████████| 499/499 [00:18<00:00, 26.87it/s]\n" + ] + } + ], "source": [ "from datasets import Dataset, Features, Value, Image\n", "import pandas as pd\n", + "from tqdm import tqdm\n", + "import os\n", "\n", "# Define the features for the dataset\n", "features = Features(\n", " {\n", - " \"question_id\": Value(dtype=\"string\"),\n", - " \"image\": Image(),\n", + " \"video_name\": Value(dtype=\"string\"),\n", " \"question\": Value(dtype=\"string\"),\n", " \"answer\": Value(dtype=\"string\"),\n", - " \"image_source\": Value(dtype=\"string\"),\n", - " \"capability\": Value(dtype=\"string\"),\n", - " # Add other fields as necessary\n", " }\n", ")\n", "\n", "df_items = {\n", - " \"question_id\": [],\n", - " \"image\": [],\n", + " \"video_name\": [],\n", " \"question\": [],\n", " \"answer\": [],\n", - " \"image_source\": [],\n", - " \"capability\": [],\n", "}\n", "\n", - "for idx, row in df.iterrows():\n", - " df_items[\"question_id\"].append(str(row[\"id\"]))\n", - " image = {\"bytes\": row[\"images\"][0][\"bytes\"], \"path\": \"\"}\n", - " df_items[\"image\"].append(image)\n", - " df_items[\"question\"].append(str(row[\"instruction\"]))\n", - " df_items[\"answer\"].append(str(row[\"answer\"]))\n", - " df_items[\"image_source\"].append(str(row[\"image_source\"]))\n", - " df_items[\"capability\"].append(\",\".join(list(row[\"capability\"])))\n", + "description_root = \"/mnt/bn/vl-research/workspace/yhzhang/data/llava_video/video_detail_description/Test_Human_Annotated_Captions\"\n", + "videos = os.listdir(description_root)\n", + "for cur_video_name in tqdm(videos):\n", + " sample_set = {}\n", + " video_name = cur_video_name.split(\".\")[0]\n", + " with open(f\"{description_root}/{cur_video_name}\",encoding='utf-8-sig') as f:\n", + " description = f.readlines()[0]\n", + " question = \"Please provide a detailed description of the video, focusing on the main subjects, their actions, and the background scenes\"\n", + " df_items[\"video_name\"].append(video_name)\n", + " df_items[\"question\"].append(question)\n", + " df_items[\"answer\"].append(description)\n", " # Add other fields as necessary\n", "\n", "df_items = pd.DataFrame(df_items)" @@ -69,16 +64,98 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "

\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
video_namequestionanswer
0v_-6dz6tBH77IPlease provide a detailed description of the v...The video is of a man in athletic clothes stan...
1v_-D1gdv_gQywPlease provide a detailed description of the v...The video begins with a man holding a knife in...
2v_-HpCLXdtcasPlease provide a detailed description of the v...A man is standing behind a barbell placed on t...
3v_-IMXSEIabMMPlease provide a detailed description of the v...The video starts with two people standing behi...
4v_-MbZ-W0AbN0Please provide a detailed description of the v...The video starts with an advertisement for fur...
\n", + "
" + ], + "text/plain": [ + " video_name question \\\n", + "0 v_-6dz6tBH77I Please provide a detailed description of the v... \n", + "1 v_-D1gdv_gQyw Please provide a detailed description of the v... \n", + "2 v_-HpCLXdtcas Please provide a detailed description of the v... \n", + "3 v_-IMXSEIabMM Please provide a detailed description of the v... \n", + "4 v_-MbZ-W0AbN0 Please provide a detailed description of the v... \n", + "\n", + " answer \n", + "0 The video is of a man in athletic clothes stan... \n", + "1 The video begins with a man holding a knife in... \n", + "2 A man is standing behind a barbell placed on t... \n", + "3 The video starts with two people standing behi... \n", + "4 The video starts with an advertisement for fur... " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df_items.head()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -87,13 +164,65 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Token is valid (permission: write).\n", + "Your token has been saved in your configured git credential helpers (store).\n", + "Your token has been saved to /home/tiger/.cache/huggingface/token\n", + "Login successful\n" + ] + } + ], + "source": [ + "!huggingface-cli login --token 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 --add-to-git-credential\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Creating parquet from Arrow format: 100%|██████████| 1/1 [00:00<00:00, 340.67ba/s]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Uploading the dataset shards: 100%|██████████| 1/1 [00:00<00:00, 2.46it/s]\n" + ] + }, + { + "data": { + "text/plain": [ + "CommitInfo(commit_url='https://huggingface.co/datasets/lmms-lab/VideoDetailDescription/commit/ad8e58fa42ad8daf56808724a4bcf4724688194e', commit_message='Upload dataset', commit_description='', oid='ad8e58fa42ad8daf56808724a4bcf4724688194e', pr_url=None, pr_revision=None, pr_num=None)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "hub_dataset_path = \"lmms-lab/MMVet\"\n", + "hub_dataset_path = \"lmms-lab/VideoDetailDescription\"\n", "dataset.push_to_hub(repo_id=hub_dataset_path, split=\"test\")" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -112,7 +241,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.18" + "version": "3.10.14" } }, "nbformat": 4, From a55eb809e1e6e47b15b5d68344e88995b96cb059 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Sun, 12 May 2024 12:43:19 +0000 Subject: [PATCH 050/181] Update llava imports and add mm_resampler_location --- lmms_eval/models/llava_vid.py | 2 + lmms_eval/tasks/__init__.py | 2 + .../video_detail_detail_description/utils.py | 68 ++++++++++--------- .../video_detail_description.yaml | 3 - 4 files changed, 40 insertions(+), 35 deletions(-) diff --git a/lmms_eval/models/llava_vid.py b/lmms_eval/models/llava_vid.py index ae5b9e982..a4fbffa23 100755 --- a/lmms_eval/models/llava_vid.py +++ b/lmms_eval/models/llava_vid.py @@ -87,6 +87,7 @@ def __init__( overwrite_config["mm_spatial_pool_stride"] = self.mm_spatial_pool_stride overwrite_config["mm_spatial_pool_out_channels"] = self.mm_spatial_pool_out_channels overwrite_config["mm_spatial_pool_mode"] = self.mm_spatial_pool_mode + overwrite_config["mm_resampler_location"] = "before" overwrite_config["patchify_video_feature"] = False cfg_pretrained = AutoConfig.from_pretrained(self.pretrained) @@ -358,6 +359,7 @@ def generate_until(self, requests) -> List[str]: # output_ids = model.generate(inputs=input_ids, images=video, attention_mask=attention_masks, modalities="video", do_sample=True, temperature=0.2, use_cache=True, stopping_criteria=[stopping_criteria]) outputs = self.tokenizer.batch_decode(output_ids, skip_special_tokens=True)[0].strip() + print(outputs) res.append(outputs) pbar.update(1) return res diff --git a/lmms_eval/tasks/__init__.py b/lmms_eval/tasks/__init__.py index 029f09fb3..e9192eb32 100755 --- a/lmms_eval/tasks/__init__.py +++ b/lmms_eval/tasks/__init__.py @@ -71,6 +71,8 @@ def include_task_folder(task_dir: str, register_task: bool = True) -> None: for root, subdirs, file_list in os.walk(task_dir): # if (subdirs == [] or subdirs == ["__pycache__"]) and (len(file_list) > 0): for f in file_list: + # if "detail" in f: + # import pdb;pdb.set_trace() if f.endswith(".yaml"): yaml_path = os.path.join(root, f) try: diff --git a/lmms_eval/tasks/video_detail_detail_description/utils.py b/lmms_eval/tasks/video_detail_detail_description/utils.py index 7bcb5f847..75e9c05dd 100755 --- a/lmms_eval/tasks/video_detail_detail_description/utils.py +++ b/lmms_eval/tasks/video_detail_detail_description/utils.py @@ -38,13 +38,14 @@ # But the idea is that we will unzip all the zip files # To HF HOME cache dir # And load it here -HF_HOME = os.environ['HF_HOME'] -cache_dir = config['dataset_kwargs']["cache_dir"] -cache_dir = os.path.join(HF_HOME, cache_dir) +HF_HOME = os.environ["HF_HOME"] +cache_dir = config["dataset_kwargs"]["cache_dir"] +cache_dir = os.path.join(HF_HOME, "datasets", cache_dir) cache_dir = os.path.join(cache_dir, "evaluation/Test_Videos") eval_logger = logging.getLogger("lmms-eval") + # Pass in video path here # Can only work correctly with video llm def video_detail_description_doc_to_visual(doc): @@ -60,6 +61,7 @@ def video_detail_description_doc_to_visual(doc): sys.exit(f"video path:{video_path} does not exist, please check") return [video_path] + # format the question def video_detail_description_doc_to_text(doc, model_specific_prompt_kwargs=None): if model_specific_prompt_kwargs is None: @@ -70,24 +72,26 @@ def video_detail_description_doc_to_text(doc, model_specific_prompt_kwargs=None) pre_prompt = model_specific_prompt_kwargs["pre_prompt"] if "post_prompt" in model_specific_prompt_kwargs: post_prompt = model_specific_prompt_kwargs["post_prompt"] - - question = doc['question'] - if 'question_1' in doc: - for op in doc['option']: + + question = doc["question"] + if "question_1" in doc: + for op in doc["option"]: question += "\n" + op post_prompt = "\nAnswer with the option's letter from the given choices directly." - + return f"{pre_prompt}{question}{post_prompt}" def video_detail_description_doc_to_answer(doc): return doc["answer"] + # Process result for evaluation in generic task def video_detail_description_process_results_generic(doc, result): pred = result[0] - return {"submission" : {"video_name" : doc["video_name"], "Q" : doc["question"], "A" : doc["answer"], "pred" : pred}} + return {"submission": {"video_name": doc["video_name"], "Q": doc["question"], "A": doc["answer"], "pred": pred}} + def video_detail_description_aggregate_submissions(results, args): now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") @@ -98,13 +102,13 @@ def video_detail_description_aggregate_submissions(results, args): json.dump(results, f, indent=4) eval_logger.info(f"Submission file saved to {path}") - + return path def get_eval_generic(question, answer, pred, task, max_tokens: int, retries: int = 5): global headers - + messages = [ { "role": "system", @@ -130,7 +134,7 @@ def get_eval_generic(question, answer, pred, task, max_tokens: int, retries: int }, ] - print(messages) + print(messages) payload = { "model": GPT_EVAL_MODEL_NAME, "messages": messages, @@ -150,22 +154,22 @@ def get_eval_generic(question, answer, pred, task, max_tokens: int, retries: int content = response_data["choices"][0]["message"]["content"].strip() if content != "": return content, response_data["model"] - # Handle HTTP errors separately + # Handle HTTP errors separately except requests.exceptions.HTTPError as e: eval_logger.error(f"HTTP error on attempt {attempt + 1}: {e}") - # Handle other requests-related errors + # Handle other requests-related errors except requests.exceptions.RequestException as e: eval_logger.error(f"Request exception on attempt {attempt + 1}: {e}") except Exception as e: eval_logger.error(f"Unexpected error on attempt {attempt + 1}: {e}") - + # Handle other unexpected errors if attempt < retries - 1: time.sleep(NUM_SECONDS_TO_SLEEP) else: # If this was the last attempt, log and return empty eval_logger.error(f"All {retries} attempts failed. Last error message: {e}") return "", "" - + return "", "" @@ -173,7 +177,7 @@ def parse_score(review): try: # Convert the string representation of a dictionary to an actual dictionary review_dict = ast.literal_eval(review) - score = review_dict.get('score', 0) + score = review_dict.get("score", 0) return float(score) except SyntaxError as e: eval_logger.error(f"Syntax error parsing the review string: {e}. Review content: {review}") @@ -185,11 +189,12 @@ def parse_score(review): eval_logger.error(f"Unexpected error parsing the review string: {e}. Review content: {review}") return 0 + def print_scores(eval_file_path, args): # Load the predictions from the result file - with open(eval_file_path, 'r') as file: + with open(eval_file_path, "r") as file: evaluated_list = json.load(file) - + score_file_name = "scores.json" path = file_utils.generate_submission_file(score_file_name, args) @@ -208,12 +213,11 @@ def print_scores(eval_file_path, args): # Write the processed data to the scores file with open(path, "w") as f: - json.dump({ - "average_score": average_score - }, f, indent=4) + json.dump({"average_score": average_score}, f, indent=4) eval_logger.info(f"Score file saved to {path}") + def gpt_eval(result_file_path, args, task): """ Process the result file containing predictions, score them using GPT, @@ -222,21 +226,20 @@ def gpt_eval(result_file_path, args, task): Args: result_file_path: path to the JSON file with results to be evaluated """ - + eval_file_name = "gpt_eval_result.json" - eval_file_path = file_utils.generate_submission_file(eval_file_name, args) - + eval_file_path = file_utils.generate_submission_file(eval_file_name, args) + # Load the predictions from the result file - with open(result_file_path, 'r') as file: + with open(result_file_path, "r") as file: result_list = json.load(file) evaluated_results = [] - + # Load the predictions from the result file - with open(result_file_path, 'r') as file: + with open(result_file_path, "r") as file: result_list = json.load(file) - for data_dict in result_list: try: question = data_dict.get("Q", "") @@ -263,12 +266,13 @@ def gpt_eval(result_file_path, args, task): evaluated_results.append(updated_dict) # Save the evaluated results to a new JSON file - with open(eval_file_path, 'w') as f: + with open(eval_file_path, "w") as f: json.dump(evaluated_results, f, indent=4) - + return eval_file_path -def video_detail_description_aggregate_correctness(results, args): + +def video_detail_description_aggregate_generic(results, args): result_file_path = video_detail_description_aggregate_submissions(results, args) eval_file_path = gpt_eval(result_file_path, args) print_scores(eval_file_path, args) diff --git a/lmms_eval/tasks/video_detail_detail_description/video_detail_description.yaml b/lmms_eval/tasks/video_detail_detail_description/video_detail_description.yaml index 0ef6616d0..5fcfb1e56 100755 --- a/lmms_eval/tasks/video_detail_detail_description/video_detail_description.yaml +++ b/lmms_eval/tasks/video_detail_detail_description/video_detail_description.yaml @@ -1,4 +1,3 @@ -dataset_name: "Generic" task: "video_detail_description" test_split: test output_type: generate_until @@ -10,6 +9,4 @@ metric_list: - metric: submission aggregation: !function utils.video_detail_description_aggregate_generic higher_is_better: true - - metric: exact_match - higher_is_better: true include: _default_template_yaml From 5bd536cd6570ba3a35f7a969d126f58015e9e085 Mon Sep 17 00:00:00 2001 From: Andrea Tupini Date: Mon, 22 Apr 2024 14:54:29 -0600 Subject: [PATCH 051/181] convert contexts to list if necessary and remove unnecessary construction of `questions` --- lmms_eval/models/qwen_vl.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lmms_eval/models/qwen_vl.py b/lmms_eval/models/qwen_vl.py index a8898745d..30ece5e81 100755 --- a/lmms_eval/models/qwen_vl.py +++ b/lmms_eval/models/qwen_vl.py @@ -228,13 +228,13 @@ def _collate(x): until = [until] elif not isinstance(until, list): raise ValueError(f"Expected `gen_kwargs['until']` to be of type Union[str,list] but got {type(until)}") - # Tuple object does not support item assignment - # Error may occur here - contexts = [con for con in contexts] + + if isinstance(contexts, tuple): + contexts = list(contexts) + for i in range(len(contexts)): if "" in contexts[i]: contexts[i] = contexts[i].replace("", "") - questions = [self.prompt.format(visual_path, context) for visual_path, context in zip(visual_paths, contexts)] # Similar to llava, is visual paths has len 0 # Then nothing will be executed From c58f941ffffe8fd18061f1b7eb08c73cfd5743bf Mon Sep 17 00:00:00 2001 From: Andrea Tupini Date: Mon, 22 Apr 2024 14:56:41 -0600 Subject: [PATCH 052/181] refactor query construction for clarity --- lmms_eval/models/qwen_vl.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lmms_eval/models/qwen_vl.py b/lmms_eval/models/qwen_vl.py index 30ece5e81..4d9cdbb1a 100755 --- a/lmms_eval/models/qwen_vl.py +++ b/lmms_eval/models/qwen_vl.py @@ -239,13 +239,14 @@ def _collate(x): # Similar to llava, is visual paths has len 0 # Then nothing will be executed query = [] - for visual_path, context in zip(visual_paths, contexts): - query.append({"image": visual_path}) - query.append({"text": context}) - if len(visual_paths) == 0: for context in contexts: query.append({"text": context}) + else: + for visual_path, context in zip(visual_paths, contexts): + query.append({"image": visual_path}) + query.append({"text": context}) + questions = self.tokenizer.from_list_format(query) input_ids = self.tokenizer(questions, return_tensors="pt", padding="longest") From 8b9b907e450725c87d42ec004093b3b38d66695a Mon Sep 17 00:00:00 2001 From: kcz358 Date: Tue, 14 May 2024 10:49:55 +0000 Subject: [PATCH 053/181] Add default prompt for xcomposer --- lmms_eval/models/xcomposer2_4KHD.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lmms_eval/models/xcomposer2_4KHD.py b/lmms_eval/models/xcomposer2_4KHD.py index 408fec038..8d77d479a 100644 --- a/lmms_eval/models/xcomposer2_4KHD.py +++ b/lmms_eval/models/xcomposer2_4KHD.py @@ -145,6 +145,8 @@ def generate_until(self, requests) -> List[str]: for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: # encode, pad, and truncate contexts for this batch + if "[UNUSED_TOKEN_146]" not in contexts: + contexts = f"[UNUSED_TOKEN_146]user\n{contexts}[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n" visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] visuals = self.flatten(visuals) From 302fed6a358cc3be605ffd984c5b7793642577a0 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Wed, 15 May 2024 11:07:35 +0000 Subject: [PATCH 054/181] Better task list_with_num --- lmms_eval/__main__.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/lmms_eval/__main__.py b/lmms_eval/__main__.py index 15eef6ed5..630a02747 100755 --- a/lmms_eval/__main__.py +++ b/lmms_eval/__main__.py @@ -244,14 +244,17 @@ def cli_evaluate_single(args: Union[argparse.Namespace, None] = None) -> None: "\n" + "=" * 70 + "\n" + "\n\tYou are trying to check all the numbers in each task." + "\n\tThis action will download the complete dataset." + "\n\tIf the results are not clear initially, call this again." + "\n\n" + "=" * 70 ) eval_logger.info(log_message) - task_dict = get_task_dict([task for task in sorted(ALL_TASKS)], model_name="llava") - for task_name in task_dict.keys(): - task_obj = task_dict[task_name] - if type(task_obj) == tuple: - group, task_obj = task_obj - if task_obj is None: - continue - eval_logger.info(f"\nTask : {task_obj.config.task}\n - #num : {len(task_obj.test_docs()) if task_obj.has_test_docs() else len(task_obj.validation_docs())}") + for task_name in sorted(ALL_TASKS): + try: + task_dict = get_task_dict([task_name], model_name="llava") + task_obj = task_dict[task_name] + if type(task_obj) == tuple: + group, task_obj = task_obj + if task_obj is None: + continue + eval_logger.info(f"\nTask : {task_obj.config.task}\n - #num : {len(task_obj.test_docs()) if task_obj.has_test_docs() else len(task_obj.validation_docs())}") + except Exception as e: + eval_logger.debug(f"\nTask : {task_name} fail to load \n Exception : \n {e}") sys.exit() else: tasks_list = args.tasks.split(",") From 896f881d3e306d962647a62451e3f979765635b2 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Thu, 16 May 2024 01:45:24 +0000 Subject: [PATCH 055/181] Fix idefics2 llava in the wild bugs --- lmms_eval/models/idefics2.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lmms_eval/models/idefics2.py b/lmms_eval/models/idefics2.py index 42035a9f9..be3f7703b 100644 --- a/lmms_eval/models/idefics2.py +++ b/lmms_eval/models/idefics2.py @@ -198,6 +198,7 @@ def _collate(x): gen_kwargs = all_gen_kwargs[0] # until = gen_kwargs.pop("until", None) + image_aspect_ratio = gen_kwargs.pop("image_aspect_ratio", None) prompts = [] for context, visual in zip(contexts, visuals): content = [] From 24764f76b905c30520380d8018101562984a270a Mon Sep 17 00:00:00 2001 From: kcz358 Date: Thu, 16 May 2024 03:11:41 +0000 Subject: [PATCH 056/181] Remove redundant code in fuyu --- lmms_eval/models/fuyu.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lmms_eval/models/fuyu.py b/lmms_eval/models/fuyu.py index 34290b9f0..7a50c174c 100755 --- a/lmms_eval/models/fuyu.py +++ b/lmms_eval/models/fuyu.py @@ -80,8 +80,12 @@ def __init__( eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") self._rank = self.accelerator.local_process_index self._world_size = self.accelerator.num_processes + else: + self.model.to(self._device) + self._rank = 0 + self._word_size = 1 - if accelerator.num_processes > 1: + '''if accelerator.num_processes > 1: assert accelerator.distributed_type in [ DistributedType.FSDP, DistributedType.MULTI_GPU, @@ -94,11 +98,7 @@ def __init__( if self.accelerator.is_local_main_process: eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") self._rank = self.accelerator.local_process_index - self._world_size = self.accelerator.num_processes - else: - self.model.to(self._device) - self._rank = 0 - self._word_size = 1 + self._world_size = self.accelerator.num_processes''' @property def config(self): From c73e93a516830c14fd01d94f23fc704e79c5e901 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Thu, 16 May 2024 03:55:39 +0000 Subject: [PATCH 057/181] Fix instructblip qformer size mismatch and multi-images problem --- lmms_eval/models/instructblip.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lmms_eval/models/instructblip.py b/lmms_eval/models/instructblip.py index a99d20ea9..3ca068ed0 100755 --- a/lmms_eval/models/instructblip.py +++ b/lmms_eval/models/instructblip.py @@ -6,6 +6,7 @@ from lmms_eval.api.instance import Instance from lmms_eval.api.model import lmms from lmms_eval.api.registry import register_model +from lmms_eval.tasks.mmmu.utils_group_img import process_images from accelerate import Accelerator, DistributedType from accelerate.state import AcceleratorState from typing import List, Optional, Union, Tuple @@ -189,7 +190,13 @@ def _collate(x): if "" in context: # instruct blip does not expect the tag context = context.replace("", "") - inputs = self._image_processor(images=visuals, text=context, return_tensors="pt").to(self.device) + # Set trunction equals true here, the max length for qformer tokenizer is 512 + # if not truncate, some questions will cause size mismatch + # The transformer implementation can't handle multi images for blip + # Concat it into one image + if len(visuals) > 1: + visuals = [process_images(visuals)] + inputs = self._image_processor(images=visuals, text=context, return_tensors="pt", truncation=True).to(self.device) gen_kwargs["image_sizes"] = [visuals[idx].size for idx in range(len(visuals))] if "max_new_tokens" not in gen_kwargs: From 06e498128e1b52edb7ea903eb7c81bb3178044f1 Mon Sep 17 00:00:00 2001 From: Li Bo Date: Thu, 16 May 2024 16:39:02 +0800 Subject: [PATCH 058/181] [WIP] add video detailed description dataset, merged live bench (#90) * Update LMMS-Eval and LLaVA models * Update LMMS-Eval and LLaVA models * LiveBench (#89) * try screen_shot * try screenshot * update * screen shoter * update * update * add sampling * update * Add image formatting and generation retry logic * lint * update * Refactor data_capturer.py and qa_generator.py * update * update * update * Refactor RollingBenchData class to include subtask attribute * chore: Refactor data_capturer.py and qa_generator.py * rolling_bench=>live_bench * Update function to handle edge cases * update * update * update * Refactor code and handle exceptions in LiveBench class * update * Refactor load_driver function and update prompt.md * Add JSON import and update text content in qa_generator.py * Update example output file and handle dataset loading error * lint * update example * Update dataset initialization in example.ipynb * Update lmms_eval/live_bench/example.ipynb * clear outputs * self collect image * fix a bug * fix * lint * prompt * add score * update score * Refactor score calculation in GPT4VScoreGetter * Update website capture settings and fix image size in example.ipynb * Refactor LiveBenchData class and add ClaudeScoreGetter * Update ClaudeScoreGetter to include system prompt * update * update * checker for gpt4v * Add checker attribute to LiveBenchData class * Refactor code and update prompt text * update api * clear output * live * bigger max_new_tokens * gemini * fix size * fix --------- Co-authored-by: Bo Li * Update LMMS-Eval and LLaVA models --------- Co-authored-by: Pu Fanyi --- .gitignore | 3 +- lmms_eval/models/claude.py | 6 +- lmms_eval/models/gemini_api.py | 169 ++------- lmms_eval/models/gpt4v.py | 1 + lmms_eval/models/internvl.py | 18 +- lmms_eval/models/llava.py | 6 +- lmms_eval/models/llava_vid.py | 30 +- lmms_eval/tasks/livebench/livebench.yaml | 28 ++ lmms_eval/tasks/livebench/utils.py | 167 +++++++++ lmms_eval/tasks/llava_wilder/utils.py | 11 +- lmms_eval/tasks/synthdog/donut_evaluator.py | 218 +++++++++++ lmms_eval/tasks/synthdog/synthdog.yaml | 4 + lmms_eval/tasks/synthdog/synthdog_en.yaml | 22 ++ lmms_eval/tasks/synthdog/synthdog_zh.yaml | 22 ++ lmms_eval/tasks/synthdog/utils.py | 45 +++ .../tasks/video_detail_description/README.md | 28 ++ .../_default_template_yaml | 0 .../utils.py | 91 ++--- .../video_detail_description.yaml | 8 +- .../tasks/worldqa/_default_template_yaml | 2 +- .../tasks/worldqa/worldqa_generation.yaml | 4 +- tools/live_bench/__init__.py | 1 + tools/live_bench/api/live_bench.py | 20 ++ tools/live_bench/data_generator/__init__.py | 4 + .../live_bench/data_generator/check_prompt.md | 11 + .../example/example_output.json | 18 + .../example/example_website.png | Bin 0 -> 2228301 bytes tools/live_bench/data_generator/live_bench.py | 102 ++++++ .../data_generator/live_bench_data.py | 94 +++++ tools/live_bench/data_generator/prompt.md | 13 + .../live_bench/data_generator/qa_generator.py | 337 ++++++++++++++++++ tools/live_bench/data_generator/response.py | 5 + .../live_bench/data_generator/score_getter.py | 157 ++++++++ .../live_bench/data_generator/score_prompt.md | 1 + .../data_generator/utils/__init__.py | 0 .../live_bench/data_generator/utils/claude.py | 42 +++ .../live_bench/data_generator/utils/gemini.py | 26 ++ .../live_bench/data_generator/utils/gpt4v.py | 38 ++ tools/live_bench/driver/.gitignore | 1 + tools/live_bench/driver/__init__.py | 1 + tools/live_bench/driver/load_driver.py | 51 +++ tools/live_bench/example.ipynb | 103 ++++++ tools/live_bench/screen_shoter/__init__.py | 2 + tools/live_bench/screen_shoter/screen.py | 30 ++ .../live_bench/screen_shoter/screen_shoter.py | 141 ++++++++ tools/live_bench/websites/__init__.py | 2 + tools/live_bench/websites/load_website.py | 34 ++ tools/live_bench/websites/website.py | 62 ++++ tools/live_bench/websites/website_list.yaml | 77 ++++ tools/make_hf_dataset.ipynb | 4 +- 50 files changed, 2022 insertions(+), 238 deletions(-) create mode 100644 lmms_eval/tasks/livebench/livebench.yaml create mode 100644 lmms_eval/tasks/livebench/utils.py create mode 100644 lmms_eval/tasks/synthdog/donut_evaluator.py create mode 100644 lmms_eval/tasks/synthdog/synthdog.yaml create mode 100644 lmms_eval/tasks/synthdog/synthdog_en.yaml create mode 100644 lmms_eval/tasks/synthdog/synthdog_zh.yaml create mode 100644 lmms_eval/tasks/synthdog/utils.py create mode 100644 lmms_eval/tasks/video_detail_description/README.md rename lmms_eval/tasks/{video_detail_detail_description => video_detail_description}/_default_template_yaml (100%) rename lmms_eval/tasks/{video_detail_detail_description => video_detail_description}/utils.py (77%) rename lmms_eval/tasks/{video_detail_detail_description => video_detail_description}/video_detail_description.yaml (69%) create mode 100644 tools/live_bench/__init__.py create mode 100644 tools/live_bench/api/live_bench.py create mode 100644 tools/live_bench/data_generator/__init__.py create mode 100644 tools/live_bench/data_generator/check_prompt.md create mode 100644 tools/live_bench/data_generator/example/example_output.json create mode 100644 tools/live_bench/data_generator/example/example_website.png create mode 100644 tools/live_bench/data_generator/live_bench.py create mode 100644 tools/live_bench/data_generator/live_bench_data.py create mode 100644 tools/live_bench/data_generator/prompt.md create mode 100644 tools/live_bench/data_generator/qa_generator.py create mode 100644 tools/live_bench/data_generator/response.py create mode 100644 tools/live_bench/data_generator/score_getter.py create mode 100644 tools/live_bench/data_generator/score_prompt.md create mode 100644 tools/live_bench/data_generator/utils/__init__.py create mode 100644 tools/live_bench/data_generator/utils/claude.py create mode 100644 tools/live_bench/data_generator/utils/gemini.py create mode 100644 tools/live_bench/data_generator/utils/gpt4v.py create mode 100644 tools/live_bench/driver/.gitignore create mode 100644 tools/live_bench/driver/__init__.py create mode 100644 tools/live_bench/driver/load_driver.py create mode 100644 tools/live_bench/example.ipynb create mode 100644 tools/live_bench/screen_shoter/__init__.py create mode 100644 tools/live_bench/screen_shoter/screen.py create mode 100644 tools/live_bench/screen_shoter/screen_shoter.py create mode 100644 tools/live_bench/websites/__init__.py create mode 100644 tools/live_bench/websites/load_website.py create mode 100644 tools/live_bench/websites/website.py create mode 100644 tools/live_bench/websites/website_list.yaml diff --git a/.gitignore b/.gitignore index a589d76f1..55e8d8b16 100755 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,5 @@ cache_dir ckpt pretrained/ LLaVA/ -*logs \ No newline at end of file +*logs +temp/ diff --git a/lmms_eval/models/claude.py b/lmms_eval/models/claude.py index 657082272..bc30120bc 100644 --- a/lmms_eval/models/claude.py +++ b/lmms_eval/models/claude.py @@ -68,7 +68,7 @@ def get_image_size(self, image): return img_size # The max file size is 5MB for claude - def shrink_image_to_file_size(self, img: Image, max_file_size=5242880) -> Image: + def shrink_image_to_file_size(self, img: Image, max_file_size=4838990) -> Image: # Get the current size of the image original_size = self.get_image_size(img) @@ -79,14 +79,14 @@ def shrink_image_to_file_size(self, img: Image, max_file_size=5242880) -> Image: # Calculate the ratio to shrink the image # Somehow I found out sqrt ratio is not enough to shrink the image # below threshold, so I guess we do more - shrink_ratio = max_file_size / original_size + shrink_ratio = min(0.9, max_file_size / original_size) # Resize the image with the calculated ratio new_width = int(img.width * shrink_ratio) new_height = int(img.height * shrink_ratio) img = img.resize((new_width, new_height), Image.LANCZOS) - return img + return self.shrink_image_to_file_size(img, max_file_size) def generate_until(self, requests) -> List[str]: client = anthropic.Anthropic() diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index 6591b1b77..ecc03eb40 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -1,119 +1,35 @@ -from io import BytesIO -from copy import deepcopy -import numpy as np +import io import os -import base64 -from typing import List, Tuple -from tqdm import tqdm -import requests as url_requests import time import logging - -from lmms_eval.api.instance import Instance -from lmms_eval.api.model import lmms -from lmms_eval.api.registry import register_model -from lmms_eval import utils - -from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs -from accelerate.state import AcceleratorState - -try: - from decord import VideoReader, AudioReader, cpu -except ImportError: - pass +import google.generativeai as genai from PIL import Image +from typing import List, Tuple +from tqdm import tqdm +from lmms_eval.api.registry import register_model +from lmms_eval.api.model import lmms +from lmms_eval.api.instance import Instance eval_logger = logging.getLogger("lmms-eval") NUM_SECONDS_TO_SLEEP = 5 -API_TYPE = os.getenv("API_TYPE", "openai") -if API_TYPE == "openai": # FIXME: Please modify this to support other type of API - API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") - API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") - headers = { - "Authorization": f"Bearer {API_KEY}", - "Content-Type": "application/json", - } -else: - eval_logger.error("API_TYPE not supported") +GOOGLE_API_KEY=os.getenv('GOOGLE_API_KEY') +genai.configure(api_key=GOOGLE_API_KEY) @register_model("gemini_api") class GeminiAPI(lmms): def __init__( self, - model_version: str = "gpt-4-turbo", # FIXME: Please modify this to support real gemini model version - modality: str = "video", - max_frames_for_video: int = -1, - frame_rate: int = -1, + model_version: str = "gemini-1.5-flash-latest", timeout: int = 120, **kwargs, ) -> None: super().__init__() self.model_version = model_version - self.modality = modality - self.max_frames_for_video = max_frames_for_video - self.frame_rate = frame_rate - assert self.modality in ["image", "video"], "Modality must be either image or video" - assert self.max_frames_for_video == -1 or self.frame_rate == -1, "max_frames_for_video and frame_rate cannot be provided at the same time" - assert self.max_frames_for_video == -1 if self.frame_rate != -1 else True, "max_frames_for_video must be -1 if frame_rate > 0" - self.image_token = "" # In case the question contains token for placeholder self.timeout = timeout - - accelerator = Accelerator() # This is not neccessary, it is only used to get the rank and world size - if accelerator.num_processes > 1: - assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." - self.accelerator = accelerator - if self.accelerator.is_local_main_process: - eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") - self._rank = self.accelerator.local_process_index - self._world_size = self.accelerator.num_processes - - self.device = self.accelerator.device - - # Function to encode the image - def encode_image(self, image: Image): - output_buffer = BytesIO() - image.save(output_buffer, format="PNG") - byte_data = output_buffer.getvalue() - base64_str = base64.b64encode(byte_data).decode("utf-8") - return base64_str - - # Function to encode the video - def encode_video(self, video_path, for_get_frames_num=-1, frame_rate=-1): - assert for_get_frames_num != -1 or frame_rate != -1, "Either for_get_frames_num or frame_rate must be provided" - vr = VideoReader(video_path, ctx=cpu(0)) - total_frame_num = len(vr) - if for_get_frames_num != -1: - uniform_sampled_frames = np.linspace(0, total_frame_num - 1, for_get_frames_num, dtype=int) - frame_idx = uniform_sampled_frames.tolist() - else: - frame_idx = range(0, total_frame_num, frame_rate) - frames = vr.get_batch(frame_idx).asnumpy() - - base64_frames = [] - for frame in frames: - img = Image.fromarray(frame) - output_buffer = BytesIO() - img.save(output_buffer, format="JPEG") - byte_data = output_buffer.getvalue() - base64_str = base64.b64encode(byte_data).decode("utf-8") - base64_frames.append(base64_str) - - # Extract audio - try: - ar = AudioReader(video_path, sample_rate=44100, mono=False, ctx=cpu(0)) - audio = ar.get_batch(frame_idx).asnumpy() - audio_buffer = BytesIO() - audio.save(audio_buffer, format="mp3") - audio_byte_data = audio_buffer.getvalue() - base64_audio = base64.b64encode(audio_byte_data).decode("utf-8") - except Exception as e: - eval_logger.error(f"Error extracting audio or no audio found for video: {video_path}") - base64_audio = None - - return base64_frames, base64_audio + self.model = genai.GenerativeModel(model_version) def flatten(self, input): new_list = [] @@ -121,60 +37,42 @@ def flatten(self, input): for j in i: new_list.append(j) return new_list + + def get_image_size(self, image): + # Create a BytesIO object to store the image bytes + img_byte_array = io.BytesIO() + + # Save the image to the BytesIO object + image.save(img_byte_array, format="PNG") + + # Get the size of the BytesIO object + img_size = img_byte_array.tell() + + return img_size def generate_until(self, requests) -> List[str]: res = [] pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: - # encode, pad, and truncate contexts for this batch - visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] - visuals = self.flatten(visuals) - imgs = [] # multiple images or frames for video - for visual in visuals: - if self.modality == "image": - img = self.encode_image(visual) - imgs.append(img) - elif self.modality == "video": - frames, audio = self.encode_video(visual, self.max_frames_for_video, self.frame_rate) # FIXME: I am not sure how to put audio information into query, please modify this - imgs.extend(frames) - - payload = {"model": self.model_version, "messages": []} - response_json = {"role": "user", "content": []} - # When there is no image token in the context, append the image to the text - if self.image_token not in contexts: - payload["messages"].append(deepcopy(response_json)) - payload["messages"][0]["content"].append({"type": "text", "text": contexts}) - for img in imgs: - payload["messages"][0]["content"].append({"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{img}"}}) - else: - contexts = contexts.split(self.image_token) - for idx, img in enumerate(imgs): - payload["messages"].append(deepcopy(response_json)) - payload["messages"][idx]["content"].append({"type": "text", "text": contexts[idx]}) - payload["messages"][idx]["content"].append({"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{img}"}}) - - # If n image tokens are in the contexts - # contexts will be splitted into n+1 chunks - # Manually add it into the payload - payload["messages"].append(deepcopy(response_json)) - payload["messages"][-1]["content"].append({"type": "text", "text": contexts[-1]}) - if "max_new_tokens" not in gen_kwargs: gen_kwargs["max_new_tokens"] = 1024 if "temperature" not in gen_kwargs: gen_kwargs["temperature"] = 0 - payload["max_tokens"] = gen_kwargs["max_new_tokens"] - payload["temperature"] = gen_kwargs["temperature"] + config = genai.GenerationConfig( + max_output_tokens=gen_kwargs["max_new_tokens"], + temperature=gen_kwargs["temperature"], + ) + + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + + message = [contexts] + visuals for attempt in range(5): try: - response = url_requests.post(API_URL, headers=headers, json=payload, timeout=self.timeout) - response_data = response.json() - - content = response_data["choices"][0]["message"]["content"].strip() - break # If successful, break out of the loop + content = self.model.generate_content(message, generation_config=config).text except Exception as e: eval_logger.info(f"Attempt {attempt + 1} failed with error: {str(e)}") @@ -185,6 +83,7 @@ def generate_until(self, requests) -> List[str]: content = "" res.append(content) pbar.update(1) + pbar.close() return res def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: diff --git a/lmms_eval/models/gpt4v.py b/lmms_eval/models/gpt4v.py index 7baef8137..3aec2fadd 100755 --- a/lmms_eval/models/gpt4v.py +++ b/lmms_eval/models/gpt4v.py @@ -181,6 +181,7 @@ def generate_until(self, requests) -> List[str]: content = "" res.append(content) pbar.update(1) + pbar.close() return res def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: diff --git a/lmms_eval/models/internvl.py b/lmms_eval/models/internvl.py index 660023da2..d808081a9 100644 --- a/lmms_eval/models/internvl.py +++ b/lmms_eval/models/internvl.py @@ -26,9 +26,11 @@ import sys sys.path.append(os.path.join(str(wd), "InternVL", "internvl_chat")) - eval_logger = logging.getLogger("lmms-eval") +if not hasattr(eval_logger, "internvl_warning_logged"): + eval_logger.internvl_warning_logged = False + try: from internvl.model.internlm2.modeling_internlm2 import InternLM2ForCausalLM from internvl.model.internvl_chat.configuration_internvl_chat import InternVLChatConfig @@ -36,7 +38,10 @@ from internvl.model.internvl_chat import InternVLChatModel from internvl.train.dataset import build_transform, dynamic_preprocess except ImportError: - eval_logger.error("InternVL is not installed. Please install InternVL to use this model.") + eval_logger.debug("InternVL is not installed. Please install InternVL to use this model.") + if not eval_logger.internvl_warning_logged: + eval_logger.debug("InternVL is not installed. Please install InternVL to use this model.") + eval_logger.internvl_warning_logged = True import warnings from typing import Any, List, Optional, Tuple, Union @@ -53,9 +58,10 @@ import re from huggingface_hub import snapshot_download + @register_model("internvl") class InternVLChat(lmms): - #config_class = InternVLChatConfig + # config_class = InternVLChatConfig main_input_name = "pixel_values" _no_split_modules = ["InternVisionEncoderLayer", "LlamaDecoderLayer"] @@ -87,11 +93,11 @@ class InternVLChat(lmms): └── InternVL-Chat-V1-5 """ - # + # # The above steps can be optional, I add snapshot download, so now can just use hf repo_id # model_args pretrained=OpenGVLab/InternVL-Chat-V1-5 # - + """ InternVL-Chat-V1-5 Model for OpenGVLab https://github.com/OpenGVLab/InternVL/blob/main/internvl_chat/internvl/model/internvl_chat/modeling_internvl_chat.py Example usage: @@ -107,7 +113,7 @@ class InternVLChat(lmms): def __init__( self, - config = None, + config=None, pretrained: str = "OpenGVLab/InternVL-Chat-V1-5", truncation: Optional[bool] = True, device: Optional[str] = "cuda:0", diff --git a/lmms_eval/models/llava.py b/lmms_eval/models/llava.py index 4f4a163bd..345f48635 100755 --- a/lmms_eval/models/llava.py +++ b/lmms_eval/models/llava.py @@ -28,8 +28,8 @@ from llava.mm_utils import get_model_name_from_path, process_images, tokenizer_image_token from llava.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN, IGNORE_INDEX from llava.conversation import conv_templates, SeparatorStyle -except ImportError: - eval_logger.debug("LLaVA is not installed. Please install LLaVA to use this model.") +except Exception as e: + eval_logger.debug("LLaVA is not installed. Please install LLaVA to use this model.\nError: %s" % e) from transformers.integrations.deepspeed import ( is_deepspeed_zero3_enabled, @@ -43,7 +43,7 @@ # if is_flash_attn_2_available: # best_fit_attn_implementation = "flash_attention_2" # flash_attn has a bug that says: ERROR Error query and key must have the same dtype in generating -if version.parse(torch.__version__) > version.parse("2.1.2"): +if version.parse(torch.__version__) >= version.parse("2.1.2"): best_fit_attn_implementation = "sdpa" else: best_fit_attn_implementation = "eager" diff --git a/lmms_eval/models/llava_vid.py b/lmms_eval/models/llava_vid.py index a4fbffa23..30b5071b6 100755 --- a/lmms_eval/models/llava_vid.py +++ b/lmms_eval/models/llava_vid.py @@ -8,7 +8,7 @@ import numpy as np import math from datetime import timedelta -from transformers import AutoConfig +from transformers import AutoConfig, AutoModelForCausalLM from lmms_eval import utils from lmms_eval.api.instance import Instance @@ -26,6 +26,12 @@ except ImportError: eval_logger.debug("LLaVA-Video is not installed. Please install LLaVA-Video to use this model.") +from llavavid.model.language_model.llava_qwen import LlavaQwenConfig +from llavavid.model.language_model.llava_llama import LlavaConfig + +AutoConfig.register("llava_qwen", LlavaQwenConfig) +AutoConfig.register("llava_llama", LlavaConfig) + @register_model("llavavid") class LlavaVid(lmms): @@ -43,13 +49,13 @@ def __init__( trust_remote_code: Optional[bool] = False, revision=None, attn_implementation=( - "sdpa" if torch.__version__ > "2.1.2" else "eager" + "sdpa" if torch.__version__ >= "2.1.2" else "eager" ), # inference implementation for attention, can be "sdpa", "eager", "flash_attention_2". Seems FA2 is not effective during inference: https://discuss.huggingface.co/t/flash-attention-has-no-effect-on-inference/73453/5 device_map="cuda:0", conv_template="vicuna_v1", use_cache=True, truncate_context=False, # whether to truncate the context in generation, set it False for LLaVA-1.6 - for_get_frames_num: int = 3, + max_frames_num: int = 3, mm_resampler_type: str = "spatial_pool", mm_spatial_pool_stride: int = 2, mm_spatial_pool_out_channels: int = 1024, @@ -74,13 +80,13 @@ def __init__( self.pretrained = pretrained self.model_name = get_model_name_from_path(pretrained) - self._config = AutoConfig.from_pretrained(self.pretrained) + # self._config = AutoConfig.from_pretrained(self.pretrained) self.overwrite = overwrite self.mm_resampler_type = mm_resampler_type self.mm_spatial_pool_stride = int(mm_spatial_pool_stride) self.mm_spatial_pool_out_channels = int(mm_spatial_pool_out_channels) self.mm_spatial_pool_mode = mm_spatial_pool_mode - self.for_get_frames_num = int(for_get_frames_num) + self.max_frames_num = int(max_frames_num) if self.overwrite == True: overwrite_config = {} overwrite_config["mm_resampler_type"] = self.mm_resampler_type @@ -89,14 +95,15 @@ def __init__( overwrite_config["mm_spatial_pool_mode"] = self.mm_spatial_pool_mode overwrite_config["mm_resampler_location"] = "before" overwrite_config["patchify_video_feature"] = False + overwrite_config["attn_implementation"] = attn_implementation cfg_pretrained = AutoConfig.from_pretrained(self.pretrained) if "224" in cfg_pretrained.mm_vision_tower: # suppose the length of text tokens is around 1000, from bo's report - least_token_number = self.for_get_frames_num * (16 // self.mm_spatial_pool_stride) ** 2 + 1000 + least_token_number = self.max_frames_num * (16 // self.mm_spatial_pool_stride) ** 2 + 1000 else: - least_token_number = self.for_get_frames_num * (24 // self.mm_spatial_pool_stride) ** 2 + 1000 + least_token_number = self.max_frames_num * (24 // self.mm_spatial_pool_stride) ** 2 + 1000 scaling_factor = math.ceil(least_token_number / 4096) if scaling_factor >= 2: @@ -212,12 +219,12 @@ def tok_encode(self, string: str, left_truncate_len=None, add_special_tokens=Non encoding = encoding[-left_truncate_len:] return encoding - def load_video(self, video_path, for_get_frames_num): + def load_video(self, video_path, max_frames_num): vr = VideoReader(video_path, ctx=cpu(0)) total_frame_num = len(vr) # fps = round(vr.get_avg_fps()) # frame_idx = [i for i in range(0, len(vr), fps)] - uniform_sampled_frames = np.linspace(0, total_frame_num - 1, for_get_frames_num, dtype=int) + uniform_sampled_frames = np.linspace(0, total_frame_num - 1, max_frames_num, dtype=int) frame_idx = uniform_sampled_frames.tolist() spare_frames = vr.get_batch(frame_idx).asnumpy() return spare_frames # (frames, height, width, channels) @@ -239,7 +246,7 @@ def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: visuals = self.flatten(visuals) videos = [] for visual in visuals: - video = self.load_video(visual, self.for_get_frames_num) + video = self.load_video(visual, self.max_frames_num) video = self._image_processor.preprocess(video, return_tensors="pt")["pixel_values"].half().cuda() videos.append(video) @@ -301,7 +308,7 @@ def generate_until(self, requests) -> List[str]: videos = [] try: for visual in visuals: - video = self.load_video(visual, self.for_get_frames_num) + video = self.load_video(visual, self.max_frames_num) video = self._image_processor.preprocess(video, return_tensors="pt")["pixel_values"].half().cuda() videos.append(video) except Exception as e: @@ -359,7 +366,6 @@ def generate_until(self, requests) -> List[str]: # output_ids = model.generate(inputs=input_ids, images=video, attention_mask=attention_masks, modalities="video", do_sample=True, temperature=0.2, use_cache=True, stopping_criteria=[stopping_criteria]) outputs = self.tokenizer.batch_decode(output_ids, skip_special_tokens=True)[0].strip() - print(outputs) res.append(outputs) pbar.update(1) return res diff --git a/lmms_eval/tasks/livebench/livebench.yaml b/lmms_eval/tasks/livebench/livebench.yaml new file mode 100644 index 000000000..bfd160749 --- /dev/null +++ b/lmms_eval/tasks/livebench/livebench.yaml @@ -0,0 +1,28 @@ +dataset_path: lmms-lab/LiveBench +dataset_kwargs: + token: True +task: "livebench" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.livebench_doc_to_visual +doc_to_text: !function utils.livebench_doc_to_text +doc_to_target: "answer" +generation_kwargs: + max_new_tokens: 1024 + temperature: 0 + top_p: 0 + num_beams: 1 + do_sample: false +process_results: !function utils.livebench_process_results +metric_list: + - metric: gpt4_eval_score + aggregation: !function utils.livebench_aggregate_results + higher_is_better: true +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" +metadata: + version: 0.0 + api_type : openai + gpt_eval_model_name: "gpt-4-turbo" diff --git a/lmms_eval/tasks/livebench/utils.py b/lmms_eval/tasks/livebench/utils.py new file mode 100644 index 000000000..582666564 --- /dev/null +++ b/lmms_eval/tasks/livebench/utils.py @@ -0,0 +1,167 @@ +from pathlib import Path +import yaml +import os +import requests +import logging +import time +import base64 +import openai +import json +from io import BytesIO +from datasets import load_dataset +from tqdm import tqdm + + +eval_logger = logging.getLogger("lmms-eval") + + +with open(Path(__file__).parent / "livebench.yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + # remove function definition since yaml load cannot handle it + if "!function" not in line: + safe_data.append(line) + + config = yaml.safe_load("".join(safe_data)) + +GPT_EVAL_MODEL_NAME = config["metadata"]["gpt_eval_model_name"] +API_TYPE = config["metadata"]["api_type"] + +if API_TYPE == "openai": + API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") + API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } + +elif API_TYPE == "azure": + API_URL = os.getenv("AZURE_ENDPOINT", "https://api.cognitive.microsoft.com/sts/v1.0/issueToken") + API_KEY = os.getenv("AZURE_API_KEY", "YOUR_API_KEY") + headers = { + "api-key": API_KEY, + "Content-Type": "application/json", + } + +_PROMPT_WITH_IMAGE = """\ +[Question] +{prompt} + +[Assistant Response] +{generation} + +[Ground Truth Response] +{reference} + +[System] +Rate whether the assistant response correctly matches the ground truth, in regards to the image above. +The rating should be 1-5, where 1 is incorrect and 5 is correct. +Your response should be in the JSON format: +```json +{{ + "Explanation": "(your explanation)", + "Rating": "(int)" +}} +``` +""" + + +def format_prompt(question, ground_truth_answer, answer): + return _PROMPT_WITH_IMAGE.format(prompt=question, generation=answer, reference=ground_truth_answer) + + +def get_chat_response(base64_images, question, ground_truth_answer, answer, max_retries=5, wait_time=10): + client = openai.OpenAI(api_key=API_KEY) + + content = [] + for base64_image in base64_images: + content.append({"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}}) + prompt = format_prompt(question, ground_truth_answer, answer) + content.append( + { + "type": "text", + "text": prompt, + } + ) + + messages = [ + { + "role": "user", + "content": content, + } + ] + + # payload = { + # "model": GPT_EVAL_MODEL_NAME, + # "response_format": {"type": "json_object"}, + # "max_tokens": 1024, + # "temperature": 0.0, + # } + + for attempt in range(max_retries): + try: + response = client.chat.completions.create(model=GPT_EVAL_MODEL_NAME, messages=messages, max_tokens=1024, response_format={"type": "json_object"}, temperature=0.0) + response_data = response.choices[0].message.content + response_data = json.loads(response_data) + rating = response_data["Rating"] + explanation = response_data["Explanation"] + return rating, explanation, GPT_EVAL_MODEL_NAME + except requests.exceptions.RequestException as e: + eval_logger.warning(f"Request failed on attempt {attempt + 1}: {e}") + time.sleep(wait_time) + if attempt == max_retries - 1: + eval_logger.error(f"Failed to get response after {max_retries} attempts") + return "", "", GPT_EVAL_MODEL_NAME + except Exception as e: + eval_logger.error(f"Error on attempt {attempt + 1}: {e}") + return "", "", GPT_EVAL_MODEL_NAME + + +def image_to_base64(pil_image): + buffered = BytesIO() + pil_image.save(buffered, format="PNG") + return base64.b64encode(buffered.getvalue()).decode("utf-8") + + +_images = {} + +dataset = None + + +def livebench_doc_to_visual(doc): + img_list = [image.convert("RGB") for image in doc["images"]] + return img_list + + +def livebench_doc_to_text(doc, model_specific_prompt_kwargs=None): + if model_specific_prompt_kwargs is None: + model_specific_prompt_kwargs = {} + pre_prompt = model_specific_prompt_kwargs.get("pre_prompt", "") + post_prompt = model_specific_prompt_kwargs.get("post_prompt", "") + return f"{pre_prompt}{doc['question']}{post_prompt}" + + +def livebench_process_results(doc, results): + global dataset + if dataset is None: + dataset = load_dataset("lmms-lab/LiveBench", "default", split="test") + for doc in tqdm(dataset, desc="Processing dataset"): + _images[doc["id"]] = doc["images"] + base64_images = [image_to_base64(image) for image in _images[doc["id"]]] + rating, explanation, model_name = get_chat_response(base64_images=base64_images, question=doc["question"], ground_truth_answer=doc["answer"], answer=results[0] if results else "") + if rating: + return {"gpt4_eval_score": {"rating": rating, "explanation": explanation, "model_name": model_name}} + else: + return {"gpt4_eval_score": {"rating": -1, "explanation": "No response", "model_name": "N/A"}} + + +def livebench_aggregate_results(results): + sum, count = 0, 0 + for result in results: + if result["rating"] != -1: + sum += (result["rating"] - 1) / 4 + count += 1 + if count == 0: + eval_logger.warning("No valid scores to aggregate") + return sum / count if count > 0 else None diff --git a/lmms_eval/tasks/llava_wilder/utils.py b/lmms_eval/tasks/llava_wilder/utils.py index 9eb0c8ec5..15d444389 100644 --- a/lmms_eval/tasks/llava_wilder/utils.py +++ b/lmms_eval/tasks/llava_wilder/utils.py @@ -10,12 +10,19 @@ from http import HTTPStatus from io import BytesIO +# Set up a logger eval_logger = logging.getLogger("lmms-eval") +# Create a static variable to track if the message has been logged +if not hasattr(eval_logger, "dashcope_warning_logged"): + eval_logger.dashcope_warning_logged = False + try: import dashscope -except: - eval_logger.debug("Dashcope not found, make sure you install dashscope to use qwen vl") +except ImportError: + if not eval_logger.dashcope_warning_logged: + eval_logger.debug("Dashcope not found, make sure you install dashscope to use qwen vl") + eval_logger.dashcope_warning_logged = True NUM_SECONDS_TO_SLEEP = 5 dir_path = os.path.dirname(os.path.realpath(__file__)) diff --git a/lmms_eval/tasks/synthdog/donut_evaluator.py b/lmms_eval/tasks/synthdog/donut_evaluator.py new file mode 100644 index 000000000..e0e52e122 --- /dev/null +++ b/lmms_eval/tasks/synthdog/donut_evaluator.py @@ -0,0 +1,218 @@ +import json +import os +import random +from collections import defaultdict +from typing import Any, Dict, List, Tuple, Union + +import torch +import zss +from datasets import load_dataset +from nltk import edit_distance +from torch.utils.data import Dataset +from transformers.modeling_utils import PreTrainedModel +from zss import Node + + +class JSONParseEvaluator: + """ + Calculate n-TED(Normalized Tree Edit Distance) based accuracy and F1 accuracy score + """ + + @staticmethod + def flatten(data: dict): + """ + Convert Dictionary into Non-nested Dictionary + Example: + input(dict) + { + "menu": [ + {"name" : ["cake"], "count" : ["2"]}, + {"name" : ["juice"], "count" : ["1"]}, + ] + } + output(list) + [ + ("menu.name", "cake"), + ("menu.count", "2"), + ("menu.name", "juice"), + ("menu.count", "1"), + ] + """ + flatten_data = list() + + def _flatten(value, key=""): + if type(value) is dict: + for child_key, child_value in value.items(): + _flatten(child_value, f"{key}.{child_key}" if key else child_key) + elif type(value) is list: + for value_item in value: + _flatten(value_item, key) + else: + flatten_data.append((key, value)) + + _flatten(data) + return flatten_data + + @staticmethod + def update_cost(node1: Node, node2: Node): + """ + Update cost for tree edit distance. + If both are leaf node, calculate string edit distance between two labels (special token '' will be ignored). + If one of them is leaf node, cost is length of string in leaf node + 1. + If neither are leaf node, cost is 0 if label1 is same with label2 othewise 1 + """ + label1 = node1.label + label2 = node2.label + label1_leaf = "" in label1 + label2_leaf = "" in label2 + if label1_leaf == True and label2_leaf == True: + return edit_distance(label1.replace("", ""), label2.replace("", "")) + elif label1_leaf == False and label2_leaf == True: + return 1 + len(label2.replace("", "")) + elif label1_leaf == True and label2_leaf == False: + return 1 + len(label1.replace("", "")) + else: + return int(label1 != label2) + + @staticmethod + def insert_and_remove_cost(node: Node): + """ + Insert and remove cost for tree edit distance. + If leaf node, cost is length of label name. + Otherwise, 1 + """ + label = node.label + if "" in label: + return len(label.replace("", "")) + else: + return 1 + + def normalize_dict(self, data: Union[Dict, List, Any]): + """ + Sort by value, while iterate over element if data is list + """ + if not data: + return {} + + if isinstance(data, dict): + new_data = dict() + for key in sorted(data.keys(), key=lambda k: (len(k), k)): + value = self.normalize_dict(data[key]) + if value: + if not isinstance(value, list): + value = [value] + new_data[key] = value + + elif isinstance(data, list): + if all(isinstance(item, dict) for item in data): + new_data = [] + for item in data: + item = self.normalize_dict(item) + if item: + new_data.append(item) + else: + new_data = [str(item).strip() for item in data if type(item) in {str, int, float} and str(item).strip()] + else: + new_data = [str(data).strip()] + + return new_data + + def cal_f1(self, preds: List[dict], answers: List[dict]): + """ + Calculate global F1 accuracy score (field-level, micro-averaged) by counting all true positives, false negatives and false positives + """ + total_tp, total_fn_or_fp = 0, 0 + for pred, answer in zip(preds, answers): + pred, answer = self.flatten(self.normalize_dict(pred)), self.flatten(self.normalize_dict(answer)) + for field in pred: + if field in answer: + total_tp += 1 + answer.remove(field) + else: + total_fn_or_fp += 1 + total_fn_or_fp += len(answer) + return total_tp / (total_tp + total_fn_or_fp / 2) + + def construct_tree_from_dict(self, data: Union[Dict, List], node_name: str = None): + """ + Convert Dictionary into Tree + + Example: + input(dict) + + { + "menu": [ + {"name" : ["cake"], "count" : ["2"]}, + {"name" : ["juice"], "count" : ["1"]}, + ] + } + + output(tree) + + | + menu + / \ + + / | | \ + name count name count + / | | \ + cake 2 juice 1 + """ + if node_name is None: + node_name = "" + + node = Node(node_name) + + if isinstance(data, dict): + for key, value in data.items(): + kid_node = self.construct_tree_from_dict(value, key) + node.addkid(kid_node) + elif isinstance(data, list): + if all(isinstance(item, dict) for item in data): + for item in data: + kid_node = self.construct_tree_from_dict( + item, + "", + ) + node.addkid(kid_node) + else: + for item in data: + node.addkid(Node(f"{item}")) + else: + raise Exception(data, node_name) + return node + + def cal_acc(self, pred: dict, answer: dict): + """ + Calculate normalized tree edit distance(nTED) based accuracy. + 1) Construct tree from dict, + 2) Get tree distance with insert/remove/update cost, + 3) Divide distance with GT tree size (i.e., nTED), + 4) Calculate nTED based accuracy. (= max(1 - nTED, 0 ). + """ + pred = self.construct_tree_from_dict(self.normalize_dict(pred)) + answer = self.construct_tree_from_dict(self.normalize_dict(answer)) + return max( + 0, + 1 + - ( + zss.distance( + pred, + answer, + get_children=zss.Node.get_children, + insert_cost=self.insert_and_remove_cost, + remove_cost=self.insert_and_remove_cost, + update_cost=self.update_cost, + return_operations=False, + ) + / zss.distance( + self.construct_tree_from_dict(self.normalize_dict({})), + answer, + get_children=zss.Node.get_children, + insert_cost=self.insert_and_remove_cost, + remove_cost=self.insert_and_remove_cost, + update_cost=self.update_cost, + return_operations=False, + ) + ), + ) diff --git a/lmms_eval/tasks/synthdog/synthdog.yaml b/lmms_eval/tasks/synthdog/synthdog.yaml new file mode 100644 index 000000000..e9b1288bf --- /dev/null +++ b/lmms_eval/tasks/synthdog/synthdog.yaml @@ -0,0 +1,4 @@ +group: synthdog +task: +- synthdog_en +- synthdog_zh \ No newline at end of file diff --git a/lmms_eval/tasks/synthdog/synthdog_en.yaml b/lmms_eval/tasks/synthdog/synthdog_en.yaml new file mode 100644 index 000000000..b08b9cb42 --- /dev/null +++ b/lmms_eval/tasks/synthdog/synthdog_en.yaml @@ -0,0 +1,22 @@ +dataset_path: naver-clova-ix/synthdog-en +dataset_kwargs: + token: True +task: "synthdog_en" +test_split: validation +output_type: generate_until +doc_to_visual: !function utils.synthdog_doc_to_visual +doc_to_text: OCR this image section by section, from top to bottom, and left to right. Do not insert line breaks in the output text. If a word is split due to a line break in the image, use a space instead. +doc_to_target: !function utils.synthdog_doc_to_target +generation_kwargs: + max_new_tokens: 1024 + temperature: 0 + top_p: 0 + num_beams: 1 + do_sample: false +process_results: !function utils.synthdog_process_results +metric_list: + - metric: tree_edit_distance + aggregation: !function utils.synthdog_aggregate_ted + higher_is_better: true +metadata: + - version: 0.0 diff --git a/lmms_eval/tasks/synthdog/synthdog_zh.yaml b/lmms_eval/tasks/synthdog/synthdog_zh.yaml new file mode 100644 index 000000000..3ffbb3b0f --- /dev/null +++ b/lmms_eval/tasks/synthdog/synthdog_zh.yaml @@ -0,0 +1,22 @@ +dataset_path: naver-clova-ix/synthdog-zh +dataset_kwargs: + token: True +task: "synthdog_zh" +test_split: validation +output_type: generate_until +doc_to_visual: !function utils.synthdog_doc_to_visual +doc_to_text: OCR this image section by section, from top to bottom, and left to right. Do not insert line breaks in the output text. If a word is split due to a line break in the image, use a space instead. +doc_to_target: !function utils.synthdog_doc_to_target +generation_kwargs: + max_new_tokens: 1024 + temperature: 0 + top_p: 0 + num_beams: 1 + do_sample: false +process_results: !function utils.synthdog_process_results +metric_list: + - metric: tree_edit_distance + aggregation: !function utils.synthdog_aggregate_ted + higher_is_better: true +metadata: + - version: 0.0 \ No newline at end of file diff --git a/lmms_eval/tasks/synthdog/utils.py b/lmms_eval/tasks/synthdog/utils.py new file mode 100644 index 000000000..42e7c62d3 --- /dev/null +++ b/lmms_eval/tasks/synthdog/utils.py @@ -0,0 +1,45 @@ +import logging +import json +from lmms_eval.tasks._task_utils.file_utils import generate_submission_file +from lmms_eval.tasks.synthdog.donut_evaluator import JSONParseEvaluator + +logger = logging.getLogger("lmms-eval") + +evaluator = JSONParseEvaluator() + + +def synthdog_doc_to_visual(doc): + # Assuming the 'doc' dictionary has a key 'image' with image data + return [doc["image"].convert("RGB")] + + +def synthdog_doc_to_target(doc): + # Assuming the 'doc' dictionary has a key 'image' with image data + return [json.loads(doc["ground_truth"])["gt_parse"]["text_sequence"]] + + +def synthdog_process_results(doc, results): + pred = {"output": results[0].lower().strip()} + gt_ans = json.loads(doc["ground_truth"])["gt_parse"] + + predictions = [] + ground_truths = [] + accs = [] + + score = evaluator.cal_acc(pred, gt_ans) + + accs.append(score) + + predictions.append(pred) + ground_truths.append(gt_ans) + + return { + "tree_edit_distance": {"score": score, "prediction": pred, "ground_truth": gt_ans}, + } + + +def synthdog_aggregate_ted(results, args): + final_score = 0 + for result in results: + final_score += result["score"] + return final_score diff --git a/lmms_eval/tasks/video_detail_description/README.md b/lmms_eval/tasks/video_detail_description/README.md new file mode 100644 index 000000000..2cc73b463 --- /dev/null +++ b/lmms_eval/tasks/video_detail_description/README.md @@ -0,0 +1,28 @@ +# Video Detail Description + +## Task Description + +This repository contains an evaluation dataset designed for assessing the performance of video models. The dataset includes human-generated detailed descriptions of videos, which have been used to generate several QA pairs with the help of GPT-3.5. The evaluation focuses on multiple dimensions of the responses generated by GPT-3.5. + +- Questions: Each question in this dataset follows the format: "Please provide a detailed description of the video, focusing on the main subjects, their actions, the background scenes." + +- Answers: The answers are extracted from the "human-generated detailed description" of the videos. + +- GPT-3.5 Evaluation: The answers are evaluated using a prompt we designed, which rates the responses based on the aforementioned dimensions with `gpt-3.5-turbo-0613`. + +## Groups & Tasks + +### Tasks + +- `vdd_499`: Given a question and a video, generate detail description of this video. + +## Citation + +```bibtex +@article{Maaz2023VideoChatGPT, + title={Video-ChatGPT: Towards Detailed Video Understanding via Large Vision and Language Models}, + author={Maaz, Muhammad and Rasheed, Hanoona and Khan, Salman and Khan, Fahad Shahbaz}, + journal={arXiv:2306.05424}, + year={2023} +} +``` \ No newline at end of file diff --git a/lmms_eval/tasks/video_detail_detail_description/_default_template_yaml b/lmms_eval/tasks/video_detail_description/_default_template_yaml similarity index 100% rename from lmms_eval/tasks/video_detail_detail_description/_default_template_yaml rename to lmms_eval/tasks/video_detail_description/_default_template_yaml diff --git a/lmms_eval/tasks/video_detail_detail_description/utils.py b/lmms_eval/tasks/video_detail_description/utils.py similarity index 77% rename from lmms_eval/tasks/video_detail_detail_description/utils.py rename to lmms_eval/tasks/video_detail_description/utils.py index 75e9c05dd..1c5b0c70c 100755 --- a/lmms_eval/tasks/video_detail_detail_description/utils.py +++ b/lmms_eval/tasks/video_detail_description/utils.py @@ -1,5 +1,7 @@ from decord import VideoReader, cpu -import numpy as np +import requests +import time +import ast import os import sys import datetime @@ -90,7 +92,7 @@ def video_detail_description_doc_to_answer(doc): def video_detail_description_process_results_generic(doc, result): pred = result[0] - return {"submission": {"video_name": doc["video_name"], "Q": doc["question"], "A": doc["answer"], "pred": pred}} + return {"gpt_eval": {"video_name": doc["video_name"], "Q": doc["question"], "A": doc["answer"], "pred": pred}} def video_detail_description_aggregate_submissions(results, args): @@ -103,10 +105,8 @@ def video_detail_description_aggregate_submissions(results, args): eval_logger.info(f"Submission file saved to {path}") - return path - -def get_eval_generic(question, answer, pred, task, max_tokens: int, retries: int = 5): +def get_eval_generic(question, answer, pred, max_tokens: int, retries: int = 5): global headers messages = [ @@ -130,16 +130,16 @@ def get_eval_generic(question, answer, pred, task, max_tokens: int, retries: int "Provide your evaluation only as a detail orientation score where the detail orientation score is an integer value between 0 and 5, with 5 indicating the highest level of detail orientation. " "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is the detail orientation score in INTEGER, not STRING." "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. " - "For example, your response should look like this: {''score': 4.8}.", + "For example, your response should look like this: {'score': 4.8}.", }, ] - print(messages) payload = { "model": GPT_EVAL_MODEL_NAME, "messages": messages, "temperature": 0, "max_tokens": max_tokens, + # "response_format": {"type": "json_object"}, } for attempt in range(retries): @@ -167,7 +167,7 @@ def get_eval_generic(question, answer, pred, task, max_tokens: int, retries: int if attempt < retries - 1: time.sleep(NUM_SECONDS_TO_SLEEP) else: # If this was the last attempt, log and return empty - eval_logger.error(f"All {retries} attempts failed. Last error message: {e}") + eval_logger.error(f"All {retries} attempts failed.") return "", "" return "", "" @@ -190,69 +190,22 @@ def parse_score(review): return 0 -def print_scores(eval_file_path, args): - # Load the predictions from the result file - with open(eval_file_path, "r") as file: - evaluated_list = json.load(file) - - score_file_name = "scores.json" - path = file_utils.generate_submission_file(score_file_name, args) - - # Compute average score - total_score = 0 - - # Iterate over the results to sum scores - for result_dict in evaluated_list: - total_score += result_dict["score"] - - # Calculate accuracy and average score - average_score = total_score / len(evaluated_list) if evaluated_list else 0 - - # Print the results - print(f"Average Score: {average_score}") - - # Write the processed data to the scores file - with open(path, "w") as f: - json.dump({"average_score": average_score}, f, indent=4) - - eval_logger.info(f"Score file saved to {path}") - - -def gpt_eval(result_file_path, args, task): - """ - Process the result file containing predictions, score them using GPT, - and save the results with added scores and correctness fields to a new file. - - Args: - result_file_path: path to the JSON file with results to be evaluated - """ - - eval_file_name = "gpt_eval_result.json" - eval_file_path = file_utils.generate_submission_file(eval_file_name, args) - - # Load the predictions from the result file - with open(result_file_path, "r") as file: - result_list = json.load(file) - +def gpt_eval(results): evaluated_results = [] - # Load the predictions from the result file - with open(result_file_path, "r") as file: - result_list = json.load(file) - - for data_dict in result_list: + for data_dict in results: try: question = data_dict.get("Q", "") answer = data_dict.get("A", "") pred = data_dict.get("pred", "") # Assume get_eval returns a review and the model name, and parse_score parses this review - review, model_name = get_eval_generic(question, answer, pred, task, 64) + review, model_name = get_eval_generic(question, answer, pred, 64) score = parse_score(review) except Exception as e: eval_logger.error(f"Error for Video Name: {data_dict.get('video_name', 'Unknown')}: {e}") review = "Failed to Get a Proper Review." - model_name = "Failed Request" + model_name = "" score = 0 # Update the dictionary with the new entries @@ -265,14 +218,18 @@ def gpt_eval(result_file_path, args, task): } evaluated_results.append(updated_dict) - # Save the evaluated results to a new JSON file - with open(eval_file_path, "w") as f: - json.dump(evaluated_results, f, indent=4) + return evaluated_results - return eval_file_path +def video_detail_description_gen_gpt_eval(results, args): + eval_results = gpt_eval(results) + score = 0 + for result in eval_results: + eval_score = result["score"] + try: + eval_score = float(eval_score) + except: + eval_score = 0.0 + score += eval_score -def video_detail_description_aggregate_generic(results, args): - result_file_path = video_detail_description_aggregate_submissions(results, args) - eval_file_path = gpt_eval(result_file_path, args) - print_scores(eval_file_path, args) + return score / len(results) diff --git a/lmms_eval/tasks/video_detail_detail_description/video_detail_description.yaml b/lmms_eval/tasks/video_detail_description/video_detail_description.yaml similarity index 69% rename from lmms_eval/tasks/video_detail_detail_description/video_detail_description.yaml rename to lmms_eval/tasks/video_detail_description/video_detail_description.yaml index 5fcfb1e56..a5ea00a9a 100755 --- a/lmms_eval/tasks/video_detail_detail_description/video_detail_description.yaml +++ b/lmms_eval/tasks/video_detail_description/video_detail_description.yaml @@ -1,4 +1,4 @@ -task: "video_detail_description" +task: "vdd_499" test_split: test output_type: generate_until doc_to_visual: !function utils.video_detail_description_doc_to_visual @@ -6,7 +6,7 @@ doc_to_text: !function utils.video_detail_description_doc_to_text doc_to_target: !function utils.video_detail_description_doc_to_answer process_results: !function utils.video_detail_description_process_results_generic metric_list: - - metric: submission - aggregation: !function utils.video_detail_description_aggregate_generic + - metric: gpt_eval + aggregation: !function utils.video_detail_description_gen_gpt_eval higher_is_better: true -include: _default_template_yaml +include: _default_template_yaml \ No newline at end of file diff --git a/lmms_eval/tasks/worldqa/_default_template_yaml b/lmms_eval/tasks/worldqa/_default_template_yaml index 64b36c176..9ebb8a9e2 100644 --- a/lmms_eval/tasks/worldqa/_default_template_yaml +++ b/lmms_eval/tasks/worldqa/_default_template_yaml @@ -6,7 +6,7 @@ dataset_kwargs: model_specific_prompt_kwargs: default: pre_prompt: "" - post_prompt: "\nAnswer with the option's letter from the given choices directly." + post_prompt: "" metadata: version: 0.0 gpt_eval_model_name: "gpt-4-0613" \ No newline at end of file diff --git a/lmms_eval/tasks/worldqa/worldqa_generation.yaml b/lmms_eval/tasks/worldqa/worldqa_generation.yaml index 0640d3d62..3367f72a8 100755 --- a/lmms_eval/tasks/worldqa/worldqa_generation.yaml +++ b/lmms_eval/tasks/worldqa/worldqa_generation.yaml @@ -10,7 +10,7 @@ metric_list: - metric: submission aggregation: !function utils.worldqa_aggregate_gen higher_is_better: true - - metric: gpt_eval + - metric: gpt_eval aggregation: !function utils.worldq_gen_gpt_eval - higher_is_better: true + higher_is_better: true include: _default_template_yaml diff --git a/tools/live_bench/__init__.py b/tools/live_bench/__init__.py new file mode 100644 index 000000000..6ff6a72ce --- /dev/null +++ b/tools/live_bench/__init__.py @@ -0,0 +1 @@ +from lmms_eval.live_bench.data_generator import LiveBench diff --git a/tools/live_bench/api/live_bench.py b/tools/live_bench/api/live_bench.py new file mode 100644 index 000000000..047a66ef9 --- /dev/null +++ b/tools/live_bench/api/live_bench.py @@ -0,0 +1,20 @@ +from lmms_eval.live_bench.websites import load_websites, load_websites_from_file +from lmms_eval.live_bench import LiveBench + + +def generate_live_bench(*, force_clear=False, screen_shoter="single_screen", qa_generator="gpt4v", scorer="gpt4v", checker="gemini", driver_kwargs={}, shoter_kwargs={}, generator_kwargs={}): + website = load_websites() + dataset = LiveBench(force_clear=force_clear) + dataset.capture(websites=website, screen_shoter=screen_shoter, qa_generator=qa_generator, scorer=scorer, checker=checker, driver_kwargs=driver_kwargs, shoter_kwargs=shoter_kwargs, generator_kwargs=generator_kwargs) + dataset.upload() + + +def generate_live_bench_from_path(path, *, force_clear=False, qa_generator="gpt4v", scorer="gpt4v", checker="gemini", driver_kwargs={}, shoter_kwargs={}, generator_kwargs={}): + website = load_websites_from_file(path) + dataset = LiveBench(force_clear=force_clear) + dataset.capture(websites=website, screen_shoter="human", qa_generator=qa_generator, scorer=scorer, checker=checker, driver_kwargs=driver_kwargs, shoter_kwargs=shoter_kwargs, generator_kwargs=generator_kwargs) + dataset.upload() + + +if __name__ == "__main__": + generate_live_bench() diff --git a/tools/live_bench/data_generator/__init__.py b/tools/live_bench/data_generator/__init__.py new file mode 100644 index 000000000..e8b8850bd --- /dev/null +++ b/tools/live_bench/data_generator/__init__.py @@ -0,0 +1,4 @@ +from lmms_eval.live_bench.data_generator.qa_generator import get_generator, get_random_generator +from lmms_eval.live_bench.data_generator.live_bench_data import LiveBenchData +from lmms_eval.live_bench.data_generator.live_bench import LiveBench +from lmms_eval.live_bench.data_generator.response import Response diff --git a/tools/live_bench/data_generator/check_prompt.md b/tools/live_bench/data_generator/check_prompt.md new file mode 100644 index 000000000..08c73476b --- /dev/null +++ b/tools/live_bench/data_generator/check_prompt.md @@ -0,0 +1,11 @@ +I would like you to act as a quizmaster who designs questions based on a provided image that would challenge adults to think critically. The image in question is a screenshot from the homepage or section of news website. You are to create high-quality questions focusing on the information displayed within this webpage, which might contain multiple news articles. Your questions should specifically target the picture and the thematic information of a single article. Your question should be answerable, and checkable. Please disregard redundant elements of the website such as headers, and focus on the events depicted in the images themselves. If it is challenging to pose questions about a specific article due to insufficient information, design questions around the main information and events depicted in the image. + +A well-crafted question about an event should allow respondents to gain deeper insights by observing and analyzing the event, paying attention to the following aspects: + +- Basic Understanding +- Contextual Analysis +- Deeper Implications +- Broader Implications +- Further Insights + +Now, you are given a screenshot of the homepage of a news website, with a already generated question and answer. Your task is to refine the question and answer, and refractor them to make the question more answerable, checkable, and challenging. If you don't think the question is good, please provide a new question and answer. diff --git a/tools/live_bench/data_generator/example/example_output.json b/tools/live_bench/data_generator/example/example_output.json new file mode 100644 index 000000000..3cedea005 --- /dev/null +++ b/tools/live_bench/data_generator/example/example_output.json @@ -0,0 +1,18 @@ +{ + "Basic Understanding": { + "Question": "What is the central issue discussed in the article titled \"Kidnapped by One Side, Maimed by the Other: A Teenager’s Ordeal in Congo’s 30-Year War\" and who is responsible for the information presented?", + "Answer": "The central issue discussed is the impact of a new offensive by a Rwanda-backed militia in Congo, leading to significant civilian distress. The article is authored by Gabriele Steinhauser, with photographs by Jonathan Torgovnik for The Wall Street Journal." + }, + "Contextual Analysis": { + "Question": "Analyze how the photo accompanying the article about the Congo war might influence the reader's perception of the conflict.", + "Answer": "The photograph shows a young individual, possibly the teenager mentioned in the title, in a vulnerable state which personalizes the conflict and evokes empathy. This visual representation could lead readers to feel a deeper connection to the issue, emphasizing the human cost of the conflict over political or strategic aspects." + }, + "Deeper Implications": { + "Question": "Considering the ongoing violence described in the \"New Darfur Attacks Feed Concerns Over More Large-Scale Violence\" article, what could be the broader implications for regional stability in Africa?", + "Answer": "The surge in violence in North Darfur, as noted, raises concerns about escalating conflicts that could destabilize neighboring regions and lead to wider security challenges across Africa. It might strain international relations and humanitarian resources, potentially leading to international interventions or increased refugee flows." + }, + "Comparative Analysis": { + "Question": "Compare and contrast the international reactions to the events in Congo and Darfur, as suggested by the articles. What might explain any differences in these reactions?", + "Answer": "The international reaction to Darfur’s violence involves direct warnings from U.S. officials and the U.N., suggesting a proactive stance. In contrast, the Congo situation appears to be treated as part of a longer, ongoing conflict with possibly less immediate international urgency. Differences in reactions could be influenced by geopolitical interests, media attention, and the current strategic priorities of international players." + } +} diff --git a/tools/live_bench/data_generator/example/example_website.png b/tools/live_bench/data_generator/example/example_website.png new file mode 100644 index 0000000000000000000000000000000000000000..3942a7a44e6e0c2dd4093f9aa5f914b60083e944 GIT binary patch literal 2228301 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

    k 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

    %P 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%0D$Nr-8Czn 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 kZ#@ZCZc5w^q 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⪼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


    W!}J6 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

    cbi&-Z|R+}A>3FQZS$yIcA@ zfX#lrv0>n|yM=!WVo?oKkd>~$2)qF$SIis#=EA?753QYbxB49yNoZUe1w}9X&7({6 zV20r1v(Z5`0qu36 zUbQw~`w%tCFfq1cZ^H{4Uy0ud2AGHP0e^a2H0;_!zKO(hkLR3kiI;OHPF{WWx?$&-c@2pbC{qo-(`^BdM=Vx@!Zho_$ zLgZ0fD#NK-XDRV%ME%84cN?VvZe6zV#-9zmlm;zZ8lkg zm=tq1|J^3C1*Pds=`9Wlqrjm{VuxFLDjTJdj1)V0qBk?J4QXcNl*b^5MO+oW7wf_f zM5x>JQA4%)`<*}~HV|OIwP6rTH`q1}3MY1^P&b@lNf`Nx&(TF-zb9G|!CTd#XOszV zTGQ6U{~rBan3U8A_4-gfp0W1kAFbNK0=!U;(jkGLU0A|@jzJ1P>kjOIEf9lPxiWxZ zL#nYc*Djhibw-lW(5Tz~PlnQce^}wT8gPG`){=LOkR{2rT$Pd&4x<&j6bzZN-XL~q z`isxL*z=$X53RXnFG_e>FxnXJgHv=NqXfye)3(JqoOpp1dvIZR25@$OKM2U>DU#UR zUnhSL-5=EssYj{*5mPC3fHO$b?ES54`aTD-IvB@Ic!!aUbv0viO!*t8@Qupo+h1%} zQodXz*%Pheax&+$52`7?xyKE~^)qZ}b{0M3gg*b!Zp$)iJGU&=_IDW%0Xu(lL`f3e zaYIMi^*N4aYV@r#NkEg?Zz=#up}w~)FYWPA@x}F#k2Ugz3&juYC4N-J0)sUSDsViv+P^8^iKZs zVRMa)$7SMhL`SxRjA%p3QnBKOL!nLG>GDO+WAKw~8xX~)cMsohx;No;r`UbW9B(;M zl7p>yDS44r&rL6>(Ln2?BwL^%ub1L`Syv^`}nt0MY`YtyAHnhv*fHunBbk&l#GS7%Cn z&N7zX58+u5-X%8lz}94|H{)O;P<$sL3%T^D0J&t~a&oRYhw;NY;8#M+JGaaXb&RdW zK-!TVNQvb8z}4A7Rx~e7HDddX$lk{?ibV8S;<-dmn1Ly>)m1!r9jR=qSqDBsHW)$1 zPA}Q1q>=w0uHGLZL<8YG$SLiVD4o+p{IsPU>dWyxOLU?z*c3s(^ZuWp+}&$qXQg1~fy|OSu_QT2*U-nY{ED@@4&3y&$@`?Obp@ zuMY2u?}uCX@X*v@zm9a_+t%?N*geZ>Yx6O^h`Smnh-`LH;(1E~htRHa8!0w)WpPQ! zeHq6CmK8Pn;$meFXB%cWm$%-+>>bD>2^*xiYQp;kO%)S>I|pV-Y$EzMO+$krEALW% zOU6B(T*GQiEnOJWO-5wGkN24ilp++ww4|2u&R!iND|!<`TTx|b2As{)NtHS)F+Nl7 zzVoUVq>W<^)2G`8-EaGvo^n*l4xK&0uqV-)i5CR;dj!}QX}RMCusHvqhBD8UO~2FH zdP_g@R)bt{9{^PYoz4%TVwP=G|M)NA;z#8sn5A}4HGocZ0`6PS1;o%MbLW?h%byN_ z8S``>^g`f9uDS6c!%?BDMG>cV5yu4Xv-!BtBDxoX%ffgix&F0ZK1!eezOv~@!#@t% z9-_AgOBx|QDySy2%kbhGj&9qPo_ zB2Q|x2G%7`TL*jI>YT0o4^-d(ux9>ew9vu3hKLACBCtIFltE8wz9K?BKxh>W&!RpG9zDi1$ zhg$Q=15JEm#gRmWQx))>$d;_M`JO5Og}+LGx#ldQ9LZ3^c>N@6)seM75e*oe#^kcW z(oH=q%n?gya%_`Yd?{M>BO;uHphOMy8J4ujZ!A#>luGBYG5JN#MlOru&(OqU1lhSr zp`~%llpWh>*)x*vf_1+?JE2=ON6UA?q&_o=(1B+?se-^2)JN)R{7Xrqrr@d`$MKw*#~aRxlfm}bQYsv5&^Vq_18 zX{N3MqSLIj(P_L%P5FJ}INo;tJ+G~TC<-YPygkwgzHWD^>rl_n5lqtWLI$FScyBGM z#J`jG<(_#Z1(Wu^QnR zW5=(?egWe{enZLK6>f->rI)7P!{n63&Yla;U%E6&Wt+0M%}y%eb7e3VAp*8jk-GXH z72uG8t9AcU)Z$pZXS(KdT?Fostr~Q^^qApYbRvPS1ZFK2;=9nfLDHHAR~@Sq-^7i_ z`}pk|gCllVlTQS2)`tEFlM3Rz2=B-LT-=nwt{hLt%N*1yMwMc47I&{+K&w7*hRMm- zFOXdyk+HFpS|pw$gor@H?==P-1xlQFc!+E?sk{+nNcB2+GWghu2v(9<$OcNR1W26k z%vg!p0_5(33POzCJ)}c@9&V0bAeU{Bc3?}RPm4_v^U=}6M20w|?cA%=QAp6Y^R_z- z=Rt}2K>Q-*4FyP#=<4cVnl03`Wn(;PG@>VXW*GpR=;}UeAy-Hm+9M_}HUdHrH^#HtoDml9?3^Wey*+_2DQK;- z?tb;xwEhs#exijkjHN320wd6FYjm_F5wfugg=RlA!_ZD1_m?*QyEb}h47*fZtOvhf z222W)LCY#rwk#Xru8=D8-&yW3l~&5}Lu9`9+q>5?nb$EvaLU3Vh*9*&95`=zjZwE1yJvq{-*~wWA5Gx-Y95 zNx7`6;`xnK!vt{3+JE2TYcHLpFLG>(%G zDw|xye>gZvAqa+9X#~gLymDeeRk)YZ+=&2+D{w6ES!8+v{PemJ|C4ES7;MDX-`0WRx5IAg6>HHr zN`EdA3M9JTzJLIqVb0=)3S5E-kYL8>vs3fBbBCXVEp*hpN+{dSY0_Wd5-QxrD!T~% zU6gifU&Rf9>@3{uyt{npC?MGu~a(P2` zJ<@GPJSO?Fe~p7`a4vc=P%9p!x7i=QN?)_8dyNQq;$HZ3kZ9apzt$k24c;*0J?R?q z7(I?>uBUR0F@(TZV)~JX6x?l&-pze&V-EQ~2u*C>_(|SC^a3+B{d2et^_qF481eQ4 zIXC~@?PyqnT>32d$sgqVHBp%4AB9+jbE6R=VIUv}eV3HVq0zu&`OlACNr7-<>jXH_ zl5}LsSrbyy5!CZud$fZWykaoTewEbGZ5!2hD#gWZnZ7!vaMSPa`@S|0iM7*Q(TaM|Qplu! z1G=_ipw?4+^W27)+k;pTOARgR5Q51dXR%#gyf~$YtR^f4K}$cO93)V&H-~<7EQf|c zE^b*Yl4PTDlmZa9%(cs+KI_ds?Tmyo=8cR|hNU6pm54&oD>S8tHi8BQXOpXnlq94N8(W&O*AX2f1&1=MY_*xA8G8!JyNORY1=Zo|T+t>3$ zS>VN42}ZtW`dN3z-sUQ7!Y%u3n=SeYt;>$>8fOZj4C*mnh%!Mi<5bFLw=G_Oo^R2{ zzjFQRI|&y48ftai-bh_M!Ckc5%v{AXgo{_i$d)lTYIE3QIVb!M!lSk21@e!uZPzl= z*)N@cJ|3%f_}Nb79r=Y9=j-Utb%CA-Wwc;hbqN73(6xB;XPndg%8n)XBv6+v_uZM8PIs&0u0n43gE0P)1&wgXa(K_V!t zCgYDqoLHKt+Ka_dJY4t<5%HdR0dv;%#z5u|^9c!Lp5lJZ2*>+!xAu)aGG-7vxCx<* z%5GKs7Eo+gt@R^t&)PifmQWTwUp#fQ^5>^MeYA4I<(#(%&McE;o;gu_GYwfzEk|Eu zZj$lKC=d5VV#q$X@3Y_>21D^$Kg<)MHee4`RV%~@VH#0OIl0)I8&Gy1j?>ZQFr;PQn#%B{<&p!0<11UW)-(=0$gb>prD+?w5r^4G4TgKX4OO=!-! z;BP`UWeqp|-Q=6dt&`s~4^by-2LJbXW-i{F~g7g+yCd9hspH>yOv#f3X zPE?o65ned!#smICq=!55&T*YuE4?#u=fic;pyF*gRr}=!d(){Ylxr0s^{#&#?@VL- zipJY`vZ?&APUL>h#_WES;gA=XBSSf~3af!vS4Mo~4$3C|8u|d*_Z8Qkw_!;^l2

    VF__`MyxL)l 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%0DV4``XjQ&vlKY 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 z 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 z�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

    A$+irsiEL;4jd`mSt@1x}XKr>WW7$PskdAhRDx9 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�~}Zy9o^mo((0k|kg2mVnx7BR-QK%Tz9$o-aZs56EA8{-^Xh9x@FDq4$m7mV>F9TuTAnS7<$nv{X#LT8$B)}EYASFcvyJz2m^-D=m3#C&C{q{O2K$KA zUGCz`$Cl7*=;aaEhb1ARg=fVi0K)8L%;RmE-=(!u`TpYl`~nSRXo0refuHRL$7P^uM(fl)m_ zcp{9#En-Yzm?S|!_^^L$@8AGPHbsRDQnuxqI@cHKLon^?cMS}_sb44v#kmNF-_`94 zuD9oCfzE}MqXEU%8ztf8CdO@2U{w@OezS84Ku1KhVGgH!qVRCsQtcC?CH?3}!4nu$ zXel#kHkQ_suW`=^Ze-Y67e2)(JcMEF{((qnS{%LX7(800LtV`D7TXWtkR@ zs$69Fxj%|;ChEcKZsuxsb(>`>orij``Wee51};Y}h@hi>7UvQG<#M);m13f2o(lPE z0rCQB`K$+L?*@ls2tIOD4(GQ81;?z68q}Xm=4}`VQ_>|AiCCt!U5?J(_a~khEAX$K z4hKS1DNT$?a%ytHRf!To`NF=ooq)_Xq4>_p6)9vFcemFG`O!q-#fYjH%;up2iU!mVS0idx>1Ao*g@C61AU?0eX26dqYIis$vW_?nW)tMoLLCVC zYOchirLswAT$(_^1IVb{bUzw9Hv(2+UAN78^pK7B?2lo^C#4WB(A7$BQ~SQL{&{*Q zN{JHxXT(n`!n30uxCxVmRS@hK+wc#gx^KsJ2XwmF&m_QP)hn=7XA74mBK&3RrM9OH zx?x~jZ+zfs&GHQLkme*$A<=Dl?db1n^#_>U_25kb3?kKAD@YMZph3L5beo1xR-ClO zTBRe5o#n6QVts|Aq(9n7-LcPGpq!r+yMBfXYcfOM6q(+NeE%REiG0w96&`cA;8_Uo zsqhAbDCb8dri*`~W_zCz;y9=Jwb+nPzPbiwfTh1$Ag_JP(4MvFy_r(GmM1C*`}Lr< z)?m;2+)cSmeJ}`Om!e8}y+GdRTgXuBACxM00i8%V-WHR9LZQin=18E$Hn&tF4~}3k{+d={2EF}a8?5iKN;>tSqo&`zC#W7$oi`x%J6i*|J2zfvc@2~bp&21mMDp_?EZBoX-fvZ&a2fb1qI8HfAuio zi~i}QB@2O^OoeGRpAPO=?OL=+ZGw7hJk~kpRl}G2(S|yM;#tVr9RVkO0lX;un|o#- zxL8ww2kWd9t10H1li_#4-ri8dji+K}2<0W>l_!4Z!Yrg54XrGx3l0|G$V`eE5TUNw zxch)~v_ByUUgHnX)EVicv~C-25-vWV$g^C;Z2=4{G-4E~2_-Nk1V+S+!NIII{7_}OOrNIAKbQqlYPo|$8);!k zEnzu0OY^D?(K3k-5tYPxH2OT13Ko%NlpL!5`k*a9EIVxPlWe(&@&1%hgiq{35`dTR z*5jg`EeW8`Ry;KO^>1GBkLU$HWEVg}{_p_WudmZIJ65$h7KwE2fagpZKGvT1!4pic zJxu(jB}_9N2Lc!7_??cm|Krhrcen{!bU7zY#4#RJj&gq->%P$uv0Z~9#461<)1U8( z0&@2@YlKg!K1ZpH^C(xVPTG_PGN3+85AVt-n2NblPNrxqyuix6DtmA6G)4-JF}w9F(7d6ApLE-W`GK z9pF_O==Cx7!>vto#bInrLgy+%P28bx4{6cN5idL|b4&{T?yQF_bF2{=+UnC9B3CNh zZIH3&@soFlp07K2HU?Y=`&H^pf8_W)AIT+zTbiQ^YEDKryH^5j;5740(^N&riQl(~ zC7Dnv@19LKy+OF5Hv_I^?V2np3!W1XdrZDOUf=CaimanRrjVxBg!YE`W7>&}+7 zt>;PznayC@a!uFxnDvx!dUWYd$ld18J2!*4AaWwkz-X*MYRI2nRSPM0Ilr=Jb`&Tg zF*bf6DzaQ{0)!&pV9Ke>D4^FFdo`4}TC_x2F+J%y7o%60a=KfdmPle|-;W*vfvMXt z{Y6MsH#rLlCt4AUVs?RgAB-Vp`LJj@?G9IgN8~(1^^3Y_)mK6}{@eW+@!^*0%J#z} zbS6u!)Ho*;o{@(JSZ+68iz%u(UJKGagx&O%2&4L)b624jQ) zMuBuWn0ib?;*P1Mk4-3DwYxCn>$H#@ zYnKfZ;^xjZSyMc8V>s*c-E_2!Uzz+9;&#=So)eOeHy}cC;*v1x$YR^8sTffE`0t~@ z2qf>`<@dyQYbt`mq<~e`tfI%wMx~;Qkgal|+WnDYR8de`8@_tJIDKGmA?I%)FPPEu zNN{%H?8tu3qjSm3TtfKZQP!c%eoyeQ9YmKGBt-Q<<+pC`cs3lp?A}X4G6ZPWfFoRS z4w!k0xy3VGbPjijPE^0MHIDX_I0si>27g1kaMF?jbQw@AvVX%OjyT1GfuL-_LQraJF#p zy+>@L7-)5QLmdup6glD8WsU+#%)Fz!3M;v%CW;0=rLqug!qC|U}A zH_|vQ--CXNLNU!&yY%LS}FYJ*LR5og-SpDLM-kpXD;Se)YVXZbA~o#=rXmO!|uQr zgaB1D_!#bVoKV|2X()uP-6giIeyKs0`CEnS(|kq`_urG)PYoW%W;66UoVWY=2N5dI zl^nBO_!VO8?*L^3-O2%OMX%zS(GVh|Q~b5V>Fc>bM};KRB|4Qb4*9N|+mD=e$N@|b zGVkE9+$To_bzt$N0wx*3I)B`#;QZOHk~g7g0u1dfWcWAeKdwxD)mYSu;)Ew<#R;%o z)vHMowejuw823Wedo<<38%e8%Fhxm)-%~g9Tw{=UB{rA;in?9;PlTqTfOv1CMH~vO zuixTSA@<~8ezUrtkSPLks*c9RtTc7}oO-&fXTt+eZ{iGEY1AH^KRacJl_WSaX5}KZ zp%ZUz{gqA&Rc7VpMrkREF^!SM;d5Z7C*qcSy~$(ml=c9Z#W|&pRP3u!kq*j8l}n4e zzHrkXLnQ$*P2(Qu+$SrX;|tX2W7fX(er6;{=(+8>yVzdxSb^|^tlq8072Uqi)Rwn0 zIka7k-?&tqk}kUC#)hhDSe*eAs)+UOxZlK5uHoP#7ApZ~3c25OmtmiS>x5GgCM$55 z1fq!BeHe0(pRU37RAX1V_KA2{Rl&nr8Iv>9aPeUhB}o z9%+5wp`-_ZD`o(2`F6x(UjCE@d6Hxc!^8f^gapMdO;2u-<&ASJJip7*i@gIy5@2 z+sW87e_FF>oWJbEEnlt8cmK)%t<{O=|Mj4wqwh` z+_tS$->1}Gu$$oJDXQRGf$wc>0L0LLffvgK;XxDaHZ(q-|BD_7QQMh0E>SlwQAH9S z_j)AzP-i@R*@6gs)hdAJZ5N=%ruQA+*Vrxa8O?)PDR7ZmhH(rZy6}M!K0tBD`p#Y8 z8#sB*+lN88lZXH2FWc5XcKb~c!^`OfN=LF5ixl{AycwMf3`$-V#dt>`PMiMT*3ih$+q~fgLIFza5I5cn8 ze!Td2>l|dMC;GZ$QuCR~eONBvv|`>>p_21t-SZ-vD0SsXzeGFHY4P~#m@W57UR_5A zWK@8OsQz)j@z$oGqTk_a3(g}>ViPt7~LT*7AJ&bl0De=4HoOTLKN!{Al(#nOk^xOT- z;?>Ym@}siO#(d)4(i)Z1AqI{8fPk{-KAPoxWJW*rSqhze{7AKc+qyccJxIRuH+kmbuSOiwbL}1VKtvI)@4}jV0b2aM{b7&}>$gp!7 z2T!}ou4iZu=sk~_PY8%zLJfJzB?>7z(1#m^yLpNkb-JY;eCZ@avNHv$`G~o?j7aUIU$tLh*t+bV3i<&-kIT*+mCGs~ z*k1$ei77-G3mh1V&x9Hy$A!^o{$woOktiPL&Mp~Fs#K93FCD(c3K}Q{#*)yTK5l4_ zQU(P`@WXRB=ufBadfmCU0Plf-??P;5|V%4`X`|t#lp_u z3n|)pjepH4B*4w~P@Ec>C++Qnp5$A+;0|9#qJ!A%-VVKSlcVKhSxFfI8jI?QS?R9e z;GQ+@X5;Bmv!S}aj++kCsCHwFmaHB&#t8miKq-d5MYIp+Hy+O5^neS0L#p!=N4`Uu z6025*b`vTiSqQHdz$5bB9zHyi=mLdqde`OU3YX`vW<2MO^E@{jbNkb(`F=n=nCVk< z4oNaHVuaMC{h|0X)%7Q9EuK64u`#xxiFoDVjjX@oZ`zs3U)5AqvvLdWyJV?eQ0gk4 zOEg+AtG(Qi-U@fBY~PnfQwJ&@ek2bwXvRhN+?xU`(!_&y+411Id*}Ng)W4yfi zy34)`I;w$>m1|ma@mz!soA42AlHBHjbT|F*@11f?CQ4<5yWOH#5tecunGi{!-B~Jb zrA0(55yY6nCLu2^A#GQz6voTYmOVt#Xoq1ah&3KT_wH8?+Fd~ZVrCVVtry|e<&Uz+ z;mT-~TKj!*VW4k`IY6pf%&nP+a~8`5{WiGw6sO+yk5H5-?TAYrxiliG;E6 z;z)hOm{47_#Ibir<`L^n=5wt%U7Kj>rE_wy8gn)8p?tIV$P<3Cv40yweQjD(w9DMd zWo+IEGj0DhKkLCj=apq`nW2^AC~n2YK}&*%dxgqlu#7F2o(CI;4LK^7Rj3b6@*$|H zHn8`s+Dn2)l*GUD^DyHw@StG!MD>q$(rL5O0Bvr;rx6L6q0jJJ85JX?XLhIViol$& zRJM5Ba(=T)(G*$D%LQy2@O;UJE1(@_=V=yVNiTw4-0)ZcHV+qx&K!5ESv7$O6q+{$$^RnfX{C#jzxq16$CFB(gwflp2(qHycp~-*t$m&Ga=@_?o#)HiX{id;(fg57?11_z0K`8%AhPCZU@UlV;Du3nJe0{iT` z$-jU9o?5#7&m6di4@`cLt8!)hSNFT-%zqiyS1Hl;(|`29o2UlM#Sq1Vgat(n~STgpOIO4(dW zb~#sYp!0q;P{aAmw=uI>VYM)vhQtAMkyeZm61GH?!tY1!B@gnTaH(ccGN z&fA#GObMw4fzPL=LZiix7tx0LZ3DB4Gh@giImR`kh*e6`^qE$HXO*?)J`|g?{rrJS z&|%az4G{a^+G`)Jv7s@saJZIC<-?lhhDDpuNR+ee)>UenVt^AYx+1kOXOXy(CvD&u z)5s@Uv79=JcyThs4RX@ZYt^>y*K``V8)=NhZR)c`OdyJ&62C#a-0EXBV%y<^^Z+DN zniUcwQTE~hWh?;<_UOc5>o;HoR^Z8!1HBL>e18OO|FXBSv>^2rfak58UBSN^6DZ>y zpQ5*4EOTops1w=nOYm6t)ijB1Kq*073jT1Ib2xDCvnS!zrlmt^(~sCClr$Opaf4rD zy+XfPk0aUzZnXIeV_dfd6yYu;vRtn@!bdp*>o^zq%vT!1vS(r@AqpO!u&_-{d;6a1 z^-Ube{wn1l1IHDEM7bye4Fvxxj)^#xh16;X>Z9urz~OvCt04;GfpV~y={|qf8osl) z=l&FOA7b!90s|d|99TW?#|@dLZs2c3fYFIU4~If>m4v{&7+V4Xmr_V@g#Q_l6e5q@ zJy4`#D{9@Mi-U_E8GuN(H3vckEVptAss;KNwO^yz<;nDz*RxPF+X_JGzxr8j_rD7XhZxvy;PKGFkA&@FJb z41QOXV_7YBjP#6SAqAlWJv8Ee^hDOb*CO?CYZ`TQMLhW9B7^3i7)^8GpDrf{m`f<0%-LA(>_Odf(##vrP@16OFPBsqGh%q{7bu>%q6e5RB zpI|7RKnFMfFJcsvFGH(rrk6Av1jHkMdo0v{i;8Wn>^A&*ni)4PZwg zqb%pcU#t5!@`Xmnvu_(6H!s{MAu@emnI`4anfJP@h$ITplYdw7x@@pH_Tkr23$wzCDjnU{xS>=}#~^y}jvEwSVAo8q`l0b(!)Oxa z;lCm5a9_(J?_K{cKHar9;M;N;wiLMaYoM{2PK3-Hj7wHizP&|HZmeLjF7D!jsd-!R z$x(LJA*GF z|Mt(f62jxSnfq0H)5qtF=kpq3gKxjI2@YDTqH^L$(tjMHyA(MQlr(0V>}RMbQw55u z;}Q170xxEC=bv>P)@o&F0o08Ff8Uf=o+eD9%*WEb07_~eT|N5-tPSL~(zJGZwr6vR};u5pg)rN8kBY2oR0i}emx zvH!DwNWLsR;OK8(L!5tHIfy3d&gc7o*AV}O5H<%ayWkggc6PSPN^(46n9qghTKUxQ zx>IYwIbcG6J;q^Yi$t~+EFVvN->O4>?NOn43Q$G^MGHp&u%l>UO8l|BLGaDo#PK{>% z-({Bpvwkq}-8~*u8cfaewg-p>JRo%xk)?mZ1DQ-h2laaA(S8e(@0z|Rw!!~2S$Rt* z?is`X3_WjmT1|5gWKo*GcAHL~A@GdcY@z#d6D^2wh6|-4+q(7QGXg0Azn0&s%oP_; zTS}iio;Bip=tu`W1xIx++o;V}n*&95Csiz+ zdbjZ8(jA$O9aSxuhUcGIW$iTqP-hetn=IwEt9e~V+*P4%UTui6mFV=z0cL%Z{!ilp zQqhZi80G+LvMp#7eQbgnbrE~N?I+sJY)TJtFJ^a$vmG>?AJ>?%Z6j|%Nro9PBL^C* z)sJQ`DipCb*nybPDHznqdZv{9ZrV?MZ<4F@X(E^oAjT$n$H+8Mh{%B(W{Qg$tU`l6 z(nP_2k_=Ui%7Q}domTzMMdR9D%+V1IF#E)T1Si3POecO~8wXaD(~z|?HZMIZLCgGO zfi;<9KJYosv~K`wZ30`Lptd<2t)ij3F0uZ|x=DH{9RHq<%{nk@1aBqoW#FnF4U?>P zFlrtq#{D;!^GE|sOj`#{RA%ndfuMKhh1x!gD(!Tb#WK^|%cIhw8`6wX8y=c&!`V$@ zi~-W3xOi!12qeUhl`t*F7A|O_eWHiNA*EZwx|SN@&?y(mX51CXL2-v~6lkwTT^ZG? zCCE-3)b$D@wH0Q4o&~_r?sx;Y)2ou+qk2cTo6=Aw-@U8LxzL|ICBa){KtNs#!Em_^}k!`rbL90#PFL6 z+39*CezkN-OfvoAQ@@bHLc8(~5{5D(TEG9;`bdz?w|FGzln@>NB(zIq5t(Od#*7jZ zL)k_jmm4zU^*wMY7*sHbLQNM<4Fm0erhOYpe=W-&f2mJg4+3lDBPBSmj1yQSBM2z&S`2RN1>G?3yVH6^12-5OGNN^bNqsX*4Esd~3>zORgIp z)dOkE$Hn9H@j!h+y5yUFKl;)&Kt-b_(M4+$T>?ssl`fgIehxoD$PHt zSdpBi&w+b3e!1>qNl*h@oO?TBq3*5U?r?lZKYW;AYLZfyu!hjw+ zL@urN!#k?TF+NX|h+4!l4Ax$f^^y@cKsmjN=*D6Wv&*5`;h<*P^N^UwaLT^u(O)e6 zGA-26Lp@y4@u5pQwa@}{bId$!_@g&l+FAo!d4-ZMf48>G9uM8z=9;`b9}BQdduFd?af%d> z?@4L!!{>A7{N8#t^ZQl5^1%(}6-h;@G&-ET2vaC*uvve4LvkrMGs$<=u0<@XDO}TF9x~_$H1vF90lJ)R zU}2}#Q=C<~Y?VcOwY^;h#+3rr^y*38%%#}=gpX9PnaqCYaw%$+B>5(k{hx*Xf7eE_NLP8nS0)F2AIL`b}M#4cP9Lx$L_6%EI+logPw>??2rG4xAHP2fln9bij?f^Vo z0NpoCq#oO92zcd{hf0c2CUn4JXxnJF8V9?w9-D2#7W&7Gc|dZwl>Gkhuep*Bxp0k- z>A)z}EFH|cE*X^dueFVCJ#XnUDf`&pc+I?QZ0fLH<33r7)4T2f`}~}&ffyIO$4_s} ze3jOQHlL+0ILk_&THmx$3E(+F9-iPd|O3K-ba+~holDpvevcZ3s*RbtE9secNwPqn#EXLIKc9g zzzMp*GEG=lD%_G#Ks)t*j2Y(4`oaQnNSC?nE@r1XTqN}qIoQn`{+Pa}d0Q=2uBe%% z!6@suu^;3oLmc#T>Vw^k%=O4GF}sk$c7lmXT7cRC1DNi{$d}K^W{}&vSv%y|0Qvlb zN5WIx07>?kQt<@8gF8o{sd36~zErxjD4;xMH6ir(Zb?C~4p<{S{1wg_^QxDO;LC%? zttlC_uOaTR?s=l`&6Yx5j10fvV=i)8yFnD?FnibQoTa(90qr}*MrDXbS~cKNx4p#8 z3Q-(fX?Y=rB0gYWXy+F_C}FaGP|K{ODbN~bG+ndLuKmPh*XzqFe)w{gFF03!mattq z(@JrTTaV?E0JojCECZz-Nk3z%6vBfu@z3zhk-mZ&q8lAbme11i zm$%>->p+z;#N9-e7uETA9Q14((pS=6h@|0?tEf{!6b)||po{3X#ZFHhs{#I)JdG=sPS$Lvjpz zpLQ86G@uhP;DU6j-*)o*kWfRrtWT0oPi;rsSa2t!+*k&P0B(K0dpV^c$2daEUtA^r1xU zrMKJOC7eQpR5@<+1O`&=B2JtTm#um4VJn+$Ffnkn81iUZ1caL=m60!T40c@IsL?G} zU#VcbtnQMKtl z@-T|`#-kRka-R@X4!)d}(4E&rO39pvGi=UQT=kiMq^8I&L@&eBv<*hAK@kL{^4{K| zlFg)F?qVrH*69ASEs%05e>d7&#%_!iP|iNAm2j_!C3)b^yVkg#x_3rOVXlv;mi7C$xWDQa>A*I4J*BN(_3y}ixNroLsG5|4(r(J2e45X3cwI;e# zLLq>nkT+2RqP4UZe2DcoNl5}@2|)6QtkZTrvJz)fo7PWMDO&->+=~dE_}lgwA#Mz6 zr@I2Qe8#vrUnCpPxk(9Nj>qlhA6cC+xp-V`Xm=+?&9nr|5J73=XrE_2rc?6)Nul+! zTPsR@4+K_m-zp-HQMNo}s0mqjyz6dx9AZ3FCSK-G_h=;ijBct|iuoW5j2=9XD*dTh zi8bBh(i$>D|Ax8k0yj};=y!@@2jlk+L*Zi6z|Au^QnNV=m!Be+60rj=)9 z>aS_@e04{Le65E;ml7Z0L5jvI2jgF2jE@tX<7Hk*>jEb$w$qw6`ho=-jbSgiDEWV> z+|o)dOXHDQqvq#Ph=g0yz2Z!+{KY6-B>kisG{nmOGbk#tpY3x_j!~4OwrI?b%63{| z77=!Xhw^B=DbEIcV^fl_yZv-JM{Vw74TDz^8*&}Q>%X+f+da$_ zS_5#P8PSWJshWpmCS>0`J<7jgLsM9pLS|ZNKoY|Jnq*aV%d_^Jze=;&KAp0i7a=6e z(fC}>2D3;yYrJ{?i?ipF0tdt9(GE_LYo}Rc?S%9S+Y79xLoB{3sz3PuaRdJ~<N=Ft0;}zW41nykKmy1r$!a`mz9n6`)9?DQtvs?Qx?ryg)zCt#$A;w zEZ6kQ*~a_XfjFQ0^{yl6rC;#=4IDs?znsAykAKA@^cv`Ui9RjIbxZ&CauD392Tu5M z;x{_VTdRgBwpUL1sgKaQaR@x5bPu;awKXpjF_-#Hch$``tL?wBrOk;d;dDjj;xC%k z*Xz5uZ~|<8>+SZXM5I^v=T<;2V@YX{DRGU)2IX?d>-F7)x9nkj;9R9-F?j?);vcXL zMP-)XjPrS{VG6Zl!*grP<6k9g-tw17@kO(5+|-M_RvQu2HpV9fTG#lLTeWMSevvdq z=DGAgrh?)8kfdg*9R406rf*ht8zdqzV#UNq5eL;7Z zOe#C-E|e7KmB}1cMIV^?8hl-NqFP;Y-7vELgW$ z0u@{$Bo%%HdWLZcKYJh%z9PRPuU1#)_-*jbR-@sLzLOJ1qc(OdJ1NSAAjbXOc~Sj| zB9gG3Jwy%DFZXC1a$y76`R)sdousp(UhoT3FnGHge7ULnW{k7a!4wsBh9$LkJnIFxG#F-nY(wpffdiB$QhNA`myuH?US!a$3 z*QndMuqLrO~`j1l-T~2zwG~p7GjNv>kw;^> z4TxK8Qfx>}yjma23A2b6`9p~g&S3DqiIC$0PgjV-&-=s>x&L?H#5_m9&?HcRY&{Ha zr9B^F-?UR594*W0o$eA!_z8z7Zn(7vg@~34*VTTT^P_N5nt$s1w_Af=?$Z3p2ol$u zn(@N{_5_qqbKzo8%Fp@pJ+}l&L*g4zSl>iB9RlWFWXZUiZl$|}(n&k?+}(d7D8coS z=tTRlI+~E3ZnV+uzFZQCrN@*Y?I|fKNL`30pk$$V!h0Bc4(Ty4CHJrvR!OtwzrpT2 zpi3{02H~BZJlfVMm)7e=Q1Fk8i=|xVMD47>KZMr5NQ(M+@KgxX97>=kAkgpIAElSApRUju=A@^w=(UXu$wOf_>s3r0aZ^kSnrz78+#pTP~GVmO735XD!oZ2#O@@w8#I1Rqfw5M znjaRh`AI!Ps~**n(lv4K%_hAU>nIa-{HTO|h`TJEUw|w(SP>eYWSIO;F$Eimw{JPB z-`M(T^Ll2W)!GQn=+sI7q3zI6Vt>b{y?w3K)wdbd*2VBPUhr8go|osGVq^&t@S>E- z8hZb&>RN{VGzFpebvn$E!#kOWdZBWV#EEJNEni)z?!;V5Y>sA5)E~5=)<5&DC^wt%}s63m(grAi_BXPbj@|`^sMd(F|EAQ zeTkc>Ctm)mh%dXi_d~Y9AUopyOVYFG_HuGll&~ZTc^u{tf)UL68-f>I-z5Ej`@@56 zmHvN!&I+~R1M`|&dG7wQkD>k^J7>%2te6abq?UPt|2)!M_+^Ao7~;`Fp|!fT)H2#zEpAh8bUv4N z;*nM4zO>|eYUT|l)2Xf3wYz?=aC3x(Z=bwB+s&=dW&V#A@V$}#d!Ww z_wo;Z2q~iuj-$VCqK80CxW9pg1yAS*4vKEw_nOw@?!iI64;Nq_SKf;+N%+asf7l3L z92{bfA?}$z_By=;vJH>MR#qC$#tdJ_9y;b8nnp+efVd~`E~tI4sW)6~nk5@I<67R# z$IEC)KA!8v{5W)TPNfCgn9fbtN2ybN+w1B^SiIOR3b-Xe_R!}V$Tqc1X}5wcRXR6| ze~Ri>)z<7D83*w|#RS~}A7dgIpSK8lj}jNCLuU_S+{!p_L_x(|;vRxKcv&6kUdB~v zxp&BlTltbpc5Hil-*OP0ro*GrTe`1NI;4CI3%BwgnqRzbTWR2{%8s(B9YQ}Jx>fW4 zKx;1FWFB!u6XrH1%>QQp$!d${C(-V=TfnQ^QKFT^SVf`+_Ub`CqaE5FVGj!% z?(Wbu?gVKF5FmIUKnU*c*1;`Eu%I10xVr`oPH=a3=ko7+Pt`e9`(f8TkLzXCtW~w< znBSN~s41rTPYSJjikZi_EB_VE+4zNr@F5>WT6T#YV@Rgj`M1SxB{g`UA~1rP!>3yE z!K?b5FA;Ii$Oyw?$1-IRv}3YQOdDyJ)>wt6w_5-{o*Vu6*3;$o@9wAV=;v+8V-60T zUdG@4%;^79U42ZIOmBb0mrMp5q)xK3wXPH7i69vghPKail$DO!BH+BKbm3 z&@qhtw=KO-?ujR7O6R5`s+Ja)z{H`RXcvi3SYKwp#SX;!K7K;~<|i#qzc)b@(oBb7SM&7)zz1%3>b*b9J0gqeUX@Ps`52}FIN14nGnTswQ@vQ$ag`38%teil`=wA-$LQzJ@ z9%=qwDK|T9R~R|Z!u!;(L$66E?zdh0+HQ&*L>cThNT&)VzcmEwXSGlx5}#MzflqRZ zN*8x=5v5;XSy-V`ACOS#AFjsA=O){9?F;*yxa-z5=4c%pR>f2^Oe9t39tvI4;g;xr zu?a{K5rA@j>DUQR-5t0uh_Almo+Z?0)u>j-3(iE5)}zHnz&M=z8iEnvd1)ja%SB=k zJwB_9y5yuoqr`5OhB;6iM^ftJN)am(D@qop0X0<*nBGghUw3+V={U>UH>dVxdeE&( zdNvGOUv(-A^1pSIq@=^s%3DL&>E7=qz#yh91LUKxSS)>^$OqduX71IS8&R-ZAjxyF zvAHl$n^zc-$JDgn&Hr6-28)SBy89ph+nr2pzxtl$v%_nd8Q~ci*6U-GY&flb(=6A_ z3Vg4zmUh{QrGT#3i2Sx(cCeFF_Ab@LoZ{a0{>kQ+t4YkWz6G!t#YZt@c z)~|Zcvy<|hd6MOq*^N>>Kw_|{r-t$H zTGwO0V1a#`w)wp@uBZ-`ihh=NtkWhs5Q1!9IpA4Pj^3p+H#Z6M->NK%yVQv!eHQt> zdKdTJ?_n@P5Ct{%^OB;Geq&geQoL*AbolhJqQK13SP<`KNkAa|{EO2MO;b|bX{bm| z$ep#zqvnF%Kjjwg)|Bk$qX1>@mwv0M4Wg=xu~O?0lGY%Xe@vIoVJVkT{0(8FLRUC4 z8cl&AqH*0=AL?{y`VrORUH6yRQ>pP~d8%{M!CNzW&c+`@;Fffgbhn-?jxqPRajF7P zA1Cjs*^6g3?>@+#Du%5WaAv#dt3%BnzVDgU)EpWn;pA8yNwT|dHED8x_^QQrDPqY% zwGN%O;PB|I?I&TiC2dO8Z@~sp`wrGuq!0=+74;z!y9pcpJO50%q-13ijXI_{1(i25yBw2I~Cihba@szmVD^T3X3b~%zQ z7fP={LktxFU$Efm8^IIz{;2IIDtL!O8}AhNaNSZSpS(KXEjMiprk_sy zVf97hhnTzg^J>SrjWy0(J@s90Kvw%zPDjeiGxsx_nZO3xGcR)+f<`r#bSXmT{k)!% zZ*>4JOyXj`?y4u}Wfu)_spZ0;|CJ&8vc_N zCZp}T*&oAz9Y7?5CGvS(^7Y9;=yHs`EB&GdMAIZ^EN^13})PP?Vb5%u8O2-`eV2lvO&#^N;P;w?UFyIzjA zlWZ;Hv14On%M_fu2WS45uL5_Wr6YB2=#ex)_t*lYVcaFTS9AgdLBk&1$0j`30J zQ{4GW1|{OD-2JLD6}XUuf7^kTLHo*my*tbi@|b_|Je8&upq+mI&=B7F`qJ^j?O3hI zs}mO+H_7`LKks(DAb3-Hj$q?e6{$_pgP4ux3t5m~`*oQy4nXhKceEvp_yVNq;6f5P z+uiycuCx{Xh|$97=|*NSxQ{&s$|J_Y3>H@Mo(t$>JlWZo2oG4;4SPgv%y*Wc%vsOt z@pHaIzgfqN0!cSTsh29b=E}^Dy}DI@=~8T!*z_ZkGs4lpoX^e`i6RXZjqR;@Zq%`w-+f9>q9U2fW-|P0l4u;yXe|=fNG`jLl)=SQv?{|P zPx(Bu*n$W@KXsaA*AYMhUm)D)hlt<|tIsZ>l*5g0o%3XW;l=+F>S?jGL0i_80s%%H zow#dVnx+l4TD+RCUbbJYAxpQ~I|;xxpzOgv8CMPxb!;5j9s8TS}j($e}&tBA{i zjwj&~(BZ8>+m8%cRCGurs&tM&5okK4^||dr9fP58pGbpw@cpZ_3HZ7)ka+5%@Ghfx z${GunqCBhn(VItO5q5|faQjc?DnUO{Mry2SX)z;j<6G8vI;KKriQJ83d!r}k9XVi zbcnkoqX}788YLXaA#fQTV%8)FF)+~d#=*Ou7P?^wmC z`Vafk3+)>S##;?-(0z zUgU!aZ;a=ShHO!eyz)!Fyb>D=@zLpsB>%)>r9aT1HxKP&j*pHTCb*(dBC4c2k<1TF zP3PRjnvd1q(qIo;L5$@bI`b&;2m3&8%bC?3&(Z z?8eJw0QhQYw8L^PdrPkK@9JzbuIOL^{dRl`NSs=29xkErmse(F^26^5g`XiBesUaS zlrd9}l2396tIKK)60aQCAONYSr?Vk0S>EweZ2AFPDG%hmc3cEHqGGz!IwJh<0l_dM zGmth?4>MncOeldpZ7Db0{6OS@&=k?G?&}bI(&2mDk-^DuOh)~@2=aa&EVIziSj=;@g z#OvAeK3}VHXK>-OBB=Jt6Le(Qlp=8`I9Ju$A|8yRUn~vTF%9Rf=t+ z!2BD?a&fRH;=wU$y=5a6?XoBuu4qXfDx3);g9u^uo2CnPHH}=5ofj*p8V(p03F*^l z^1rYNX~D@4WbhhHhdr>jUrOu3o1iTnr;{GuN4tf1GCxb#Lft$_^QVlr zw>Oj*8<1mjch(qb)+?rIr}bYpT@KjuCG#lRe+bc?$^;phm#5QNl5>U^7cf#GYE~7y z`0*%wQ4}jl`QggxAd|OTQA~IsoEJb?HT(5A5BJ{Ve`7BGM>rpk>xn~qwibfZPGA1s zbo~Y55UJ?8aF@R%w6gEK`t6B;$yYR!XRCn4(3@Fk*?*;2ZKJ9}H6V?DO7w%y*seM; z{BGf+sNh)HaRZrb`*M|x6|qs<%Y@{EqQl`)VbT!J>lx1LzWZ2?^hqQJ!MZQI*>FQ? z(FWJ;E1qx|(p$gIR?e@305X>Yb?t<=&ij}^Gjy-q3#aYg8=$Rg3$u0BJZMe+8C~%Q z32vxfcx^jSvX|X=Xb}S!eW@3i*?F48&tfs5)}_i?@dy8VPMIgNK4q)%w_rZB=k)H6 zM(wqROlGY}h7~lgBde*q5ungrgsI`VOZi9e=7^V576aL()9PK3*a4Ma>wHIv-m;W9NN+8u4~oEe~$sG)Y4Ozpu2@$Bilut%*^* zIL7fQ99a6>-?>~g8?6? zPE{DvMpc1ZTKvti@7)kVNHFH7f8TK4dlt~6BM>qhfuc3$$dYE)w1mE#ztcQ1+mJ?T zXm?paG8d;%#~g7B&cshGhL8hoJgFJ4ag%nq!&gVH7`=|IT_9 zZ7_o{osiKy$PTEyv6p<-4q+%VVJm;Ef6!wV|4b`OvI`lbxOl!>W9e1KAFiVA`qE#K zgtc@FjMLDIMt<~AXaRk1yj)9^U z{^L0is_xPGYORqDL(TE#SbjQ~>-nHy)4}Q@doE?`&w+FAs!EY?JMm7~?q`W0CabN} zN(xDtg#COFxB!~(l4adb!T!4vclU?QV&nLd0-Q^t4iMe2xs}o^xg-)`i_H!-EBWqJ zG8v%8FCCa4g7KY>3dA)GQi++QI-xOQ`e3u|3-;KCUmEy*{8{YIlm~f0Ii?+95slZn zj4$2$Ll(yLsL=gdu5+_MNkK?{2uXyE4do8TWlgZn#7}$|hJML~HstFJybxueleH!Fn+8&zJXfa@w=bU5^y$*$g6@z!w?oQ zgl?EQz@RN)y)xU|ynqX)*$>~I+auWlgLCNoxWD)7UM9DG8T z_Svp!_>O6e*eMRA(v*@55_I?<;@*E~|NmwfW<&r#KD`;pKR;}nylih5H#}*_-{8Ei zOJWAUm9-5r^S{l{uX(_~>vH*FGIHxt2fWhpRs&IEge!Mu{_^_G4Vm4H*r>$DJC*#g z+-nYX>pt{f&ckM$pBS!LhX7o5t%GF#+^y|oc~tlQk*Y((se3LQ>O75}7jR7{Tr>8p zRPTAr@6pwLi#vSBFMwkd)&zqD6swF|jwqa=Y7+T&`u;zJ##|uT`3BSY#-{Spz?=)> z@;Ge%urGalQDEK8|Uabq3X*kZ9iO1syf9pl)j=Q8Xw%kBH-$LfHFFRA+s?uSpNURG|= zNWR1wjdA1KP9L(l_D5E$^DC?d-p6h1JUto(24-&Gj?7A#ZZ00dv?v@*_bbY63%=j5 z1?@9X9#e0O@IV_Dg-fn$>)J_ON+Lv+UFx!5HkjKb{cdml9S+JIq{xJTO5K*bjavmY zfPG7?g!8eiOT2=Ov{1a@1V^b}hmFAtq>`sB(S|7(lLxbdfbD;-9$5vZ_0v3m6#<}0 zOKUS$O$p5C5IQhSkWmSZivyyMrDT95|eM<#HMXq8lrQfS;jRsd^zN{}vuWZ=T z)(Z|kC3EX!-{?cJeklTwCXG+=9@|MFxPrw+}TdPgZ$;09W@*&84c(HsQ%JAlw|AMrp_faQm-X_te%Y2qVJ%fSBFNt^3) z5c#>r6y29S{enHYJ`Vail8yqaJzgSl4ZXe|0`tPKyUOvf7M}=fLU@^|?h?J%x{QL4 z`B~+JI|SVlW^o7^B7R`uSzeT*OZd%`w0dfM(cRt@P7dBm!3utwu=9C@f*-?@WSYoviiEKdw|hc$@axeXKFd&vWP6e0*SudEyW!)A*Lj z;U|Z@d@~R0j%)0+=dVgWNGsK0!TBf%^+h7orelvJ4Wjs#{DbB?4DBKKI|3|G>mR|` za3>A>N5Cu+#_P7BTaLa{5tU-Gv^n6^W5>G_Geam3nVsQP9-|r%r=8AiC|=Fv9bSv^ zGz*AxOlPnANQ^6YkE+Px>6&OJb6_a2zJlzs9TY*W0_zo{tQTq+gHdhD!^AIn#z0gV z09z`>y~nE4`!8QFm;NfoUvB7{sO8-EjXRIrZNmEwdRhSAi-dly2=e-07sdYr_Vxe0 zl>R@^DU+54?KKW>GwsUC|E)c~P$iYm{tf9meUO4!#cF{+It|!8J=y^#*#(9|dzQ|Z zYk0#Qq9Q?;{;rv^ad9E5M%%3?f)``&{yZpVqd^+c9H&{}qmg_&dnqsFER;$kB zjYWP(7cz6o3ReU_`hP387ANv~6myRjjcn(x@bV4tKK--UK>eRNNs*bjsj-f%8xvaB z(t=vNN)Ge6b*Bm5M3B}XyP-+pzvH&eiBOeP!U9aIi{A%bA?iKaN%bqbglH6Hhl9+O zJZ`aW@ez`y{x)243-1c8;|e3m@gn^u`@G7E^ehyd4U>49aE&hQQ{na%Ut+YUA8PWt zHTK?+rB>FpUsB509YdAwKo)LXHVu|}psXdc{Cb^gIe1tvuK~91F*iC5_ zNt=Nz3hjg&>hu7zA_3U6js_q!HOBq^;$bCOcxiD&*^p+7lIeg6{$wM+rmta)d{OiD zUDe(-t-5Toj?zyBQz@F`^+;ZYr^`L_xT4jE(N(p8)7LxHX)jJYDT*8=_wc~VJ?kK) zUvfNl2X}$L6ceB&9p`{N!Js0|@OT_j9|?L>e8s%>|CI$G6UyC70z5|}zyJ&<^|3q; zRlevy#9C3Q93GE4Rx&LL{^c5X^Qn!3H}Aa)UD$zE~5BaP6hg@J`d{4- zp(Nd#d8QZLF%eI_)0ayFd;}QDUVR&mI)=ataZ>AdBR3BY1A_N`!T9^f`5Ptst#eO* z(gIRGr5D82`ZnL4|K^eUoR={W-2N9$S^j(mwE{*iTrnU!_~)F~JawX9?*Iofg@zD9 zYb|P!F;aQ$xptOIFDJTH&OWl9=|fgW^2(oC;j5tsR3w9*5U5TYlna2e3Q;A`Ji(tU z#vtLK8x0dFZeHVekf}R)MD2DRpmQc)rNe4Vl&4$*)UUTuKJXK@yrzShRwsUrY5q^g z62~~#YX$bYSs|_GCwV!300XeT_%|nQMLIvX;t~{snSh2@MaD%_>rupm`PX$NorUfb zgx%emo}vj#vb!-uPSO|}%ycCeF#u~E)1KV%CQry7Gs@R?G3I>y;rl}kDbdEp+QET% zi5YfZ|H#9q^mLUWayc)5u$&GD@hn)y*Ika7YI3fRwYLo{5~=@KZp?_a9Tu3ZG_ zh&i%a=JwaZpuATMw;=AQauO@c{Jp^@Je*PA70Ea{&Tj;0Z-wT4By-x#J54sUj^NQd zSHo)Z+jM$xLyTU2uQ$9@bKK}YweEY#EMh__OHcf{Z%+7fcIe=D!kf+f&E1{?3ZU^+ zCw*FdWYw7E+rh8F49D_xm`CB z1>(lSP1qINdHuNlo4pKml1xY0+^n3gTBCYumaRK?X2yMCWkE^Ju<}Qv0;MfgjgY35 zVV)}~`P+^=38x~-V}F_QUm~dg18@G@;po4IEYt;P}`pGSZ*wijzFcXWj8 z;PAw@H1U(zDDh{0nfFQN1J~6Qs*pkW+DzbmrqhG#&cxFvBr8ZrP>G>h3?@Nmr{LB0 z?Zs!m`)0QU;-lfi?Y}<8v7fp&*(Ep`?@Fbo*&hb@)W|dCA%8x$23)pU{Ig&DB3jbr zmHada$rfT6suDj+Ic$2Y(Vt};+Vq!9&G@tFe+d>9TAe#Qx!=$0g^Suf_OAZuFg6s}DdT((bxUCW=-Bjph5WiA8i;Qo ziocGV;Kzg&Hd3lML6x?taL+Ravsu2Gaa$O9hndeJKJpZJRU zS9*{I2N7*xqODVVUi`T#roJ!TPq>xDof_;ch&K%qTQ8Ut-0Z$aoqWuB0h|zpxZ*TqKA&W{`dBfyjmS< z|263ohhg)!_G3#mTKq-1n5{Dlh1*_`O?6WErN{%8cP-$LjEZo((PK%0pZR?dmsj98 zAT_Ur#QQ@9Ow1=2IN|85%#$O{Ma?3Uwn5h;ezqqYZ4O?1qn=IRnLBZ+8!^@> zs_&9-LRp~7d%hET2Ji6YFk%adup!azo{2&lK^4*zCSAprvA>T9bi+lS3+pmt z1yCa%t+8^Uy*C@skWxYVe=?)s@Bw&x=;N0VQl zd9ZH#K-KN0BoO>$HKzhuhCVU9{aQp5Y6L@N83H+X2#!+xK|Q~O@_cS)CK}Q zmm|L7shGMbGVd5WrY`E%ycL}#Z?Amo(N*=uy}}ymDFV^k2!K^$(R5V=i&d=Fw^@IK zMT7mxZI$?gQs};C{3ogggBc~4(Bsv?`U{u!jj+K3z;@N9tn^sm{TzM$9>c}oM=Dx% zLm?7;RkEctR|zxwHHE_A;r*W(3%d1F4~VIgE5sd;wk~|0zj<=)^|HK>#wSO+z~9F= z%Zt{bJo2bi$Ra~!w#}f0${=K{dIzf|{6;6Wxgrr4Gh=z+^hd?eU{N%)X8opjncep& zyYYwzO#{2}n5EEfN1>jcYf88iz*g4*QkspAc9jLQJ3^Orgfdh`CS<&gvEN*31?(Iu zoN-*VP{|K14URAlW*Jt(y~)eMk1pK~WTI_wH+}VN*CVHnV<%bt-k*+`i?NTA;HeOS ze#s4*`j3<)nFFMM`U%S2P2-$X$C|{l@3dXI2B+mk5_N;4aj6eh^2IRX&1^v(CG62o zXOr93K`no@Gbmp~++|chlets*#LEPOLo|JlgIHyvdH3I>9(Xe3=<4Q6jwo5)2b#04 zZAl6?<*wS?g|asXO)<6iXVp!fZxk1*hcTy>3h zHx1+^5XWvO@Vtmd-azG`$BDOG>5p`y`CAAVU`k=+TRKjP?DD}Gb+yT$2vvbO)dVrR z%U-d_W^=Fp#NYeyD(gQJDE&)9!lw>RxI=#aQ_P1X0dis0+r##3D%1 zqcKcoOfMQgPj<%t2;^ob5t+&Ki_zmrV^`sy@2#vKyFzIWx)E{A&zpj2uxVMUXf_B) z)vf0Mw3TKnn%^bCj*q06kI~4p1QsrEM}YHn)1oMRk}b~vPnP@t50M-t5hTwLCFA{X ztO9OcwDxl&sFWoi@+E(~1$nBkJHu16{)Z#%^g#~-Hg~elFv_3&ei{dM2^gF$uB~*3 zk$2l1zU^ATv9CCvVl!LVmKsumDU35uZ&}6K3Z-Pnem@yiBFCLd^lnN0fXJeo^j88D zChhr+c}&hcLjn}3X4SglT6Pc4K8Z80E}S~7Fj|lK;frU?1rM{S$Mc2Q5FfQ~EL<2* z4XI&K(OxIGkc0zy(6%K|tR`APL{V#C%~0P?VIffHizxflxa9A?;=D0wZKfcvv{z>X zD#hioih=EhL9P>qkhfXMhCnNdbKxubn)GDK9{EBce&Q+y#n^A3{IxtH?Y=w?6J7`j zqaz2kZzPi`$_*K#-1COmGh~(f(#W64f`flNXVo6*^RITRdg_O(fTWX^whUwM{p~Bh z$5LU3LR}L-tlcz9ZFArk+6f3rGM*>nq^POn*)-}DzPdPC0=W#AQZgD#^NP|}-5}u^ zXXbE!-n&oB{P0S}ox$T^cq=Jm2-~;4#BZhX!_>Yf&G{E*dK zCk#?)OYU_kUIn--_1AxrYN9P~X={_R)(ufIc$U7T!IA>@lNkw~N=N-ps1Y&K!4lZQ z-k<|iFA*Z_Dux(oO_sK}>(D^-o#dKkXI}Bwq2YZKza8PpfZP2z*dehHnm%m(%TEFN zCE%AwgqdxGgN|dWbvV9GaXI+mp|24a%EcXX@`D19?=Cjh$KCg}^-b`hVfvczkRzG!wUhV=2t9GKAO`X1QZl+rH8nLE_1uQ&6CoH=NVxJJKjCdIor8;x-4=xNU(osV z@H%7s^EuHS2?C)mVG?C>uQHBSRN6olXq35pc83{|IEln0)A5t>U;6>S42t@3yZq_n zg7(iI&_lZ2;4*!!hgOzegi!>%S(|8KViaQYDX^H~UgX3O>$tbp((%U=53#^}KZY{1 z-Kyt5)gw6M!h{>N7s8V4s($$<>0??C7TAAY?#`e^yvEj>Glz4UNvNsjWiN(TqQ{UC zi_K8K!e2jw9_9oPDfpQ(YffTMQ8tG*Elbm9b#%0_B9gmkg9RSSg35<8?`I5`0YPhd z0`F{~LR@0r^v7+z2H1ltwsJJR#?v$RwCLyruH;QFw~&!zrZN4LO_J(mW&RSVP@YjO zH`UJ#$O-Z$S$DdKi*sb2SLjcLhPb}G$o|p{YzV3~D(xt*8aYpn4d7^~E`^fdo+a%^ z{4Ogf>u=7~kbX&d8MC)&o3oX$8pH`Xx1agfZ-+K_VWU=#Bi)T4+p(UUYnRs0QoPOI z;e)EU>s;n;Wu_QQD2=`%)aT=$Rv?9U%sr#B>&{vBvU+a!M zK$z9dyAI=bZA>^361Gq@Ki!=l0f`5}Q)W*e6|&q(Q}3W4Z8yV2NTGAixte0{d2*V> zcIiTD364aMEp(0M6BxXe1_-3EyhMR1eI zWCo)dNd*Yss8h)bV^1oWk`FtIA?dHD#8ECiTH|C%g$WNJ#c!@rDAnW~*9|RHK zl8&BkgD46)GpSeLcfX?Bx2c-W>OUbVcz@A;B?r$Wri4UF<_$^}PnrhXn#(xfw zeY;#4TW+guo`7uL2VUQXK6+PS_udt(Na0`a*KqCrUxOC)>)n8Cd_G3(M&{}3%c;8h zh1q?uqDR1xZ{~j-C%VA-rFkW0$5nR^j}YPmUx#dw$$146ynsj&7zU1^zhMON)^L_h z_ki|qeC~x^DtWOsf5|16t@I32zuioXjDjk3 z5IV`E;q-amxwFBO*V|G|-nv70mYetFZ96L;M8T@4L$7m7AG{RpJ!Xm2K~V48bl z?&2iR{grNx1*E-l;XWN9eVU^j_+~}(W6k*!T;i6oDlP&bL`00(b1Hyv@)XnTA{pL< zUP^h%&d#=oIr|>ad!qU9JpO%32%Bm3Ig9$8u*rk>!{n~NaFz*cA&hF(a)Uy%-|6c` z{qr?;9@@%|Wb5Bg$r@&8iqYrB3r&|Z+CgjL+zzsICVk7BJj-oF#jzXYwdC=+i(UCmEWL55tBVLhhB zrbP-StmP#c4kXxG zMZB$tgRqf;q4WM^-(UbpMp??Jr$1WWwo5$H#n85IMZQ|oa%u7euu;IN^$N6k?+N{O zhixK}X`mt9dpEKESuUQKADQPvC@8YYRtu4K;^9GG3`sjK_Ty(gI0V(+cY%5Ufg?e{ z%~5RMBeB)89{Sd*9#5+{5$__oS0CDG?2VTq@J3`4(+&5ULRelT7Uw+9N2GS_W-~f+ zKiOpjQPrw0`>n+{#O9B)L~@rl?Mg9&j~q$@BdIWO^XeWFH953EW+a_cH9yligPJRN zp>YR`8jhalEl|$@(CIG;D>(LfXBS~D#9j9H$3zvoT+19#uA1>G_A1hH?emV=$`A~B zm`%W6Zr$#~JC`z{#MC*iEtsIysPfl`^$%}}M z+q0ShM9tCTA4@}ieWpaEq^NXkL}w>cZaD3=hJ!?o9~>S6RJmwPzZ6uq-zj_hJ0=%3 zI>&hZCgBv)?_w(1UGbF6F`&(BGYR!+uV$x~mWHl+xq#o6_H$&O?a)W@_bWQmFoVA6pHkT%`Iz3rtGM}V_x@1dA`qGHLDfkLXd zYstF$YtzawVx6f!F_*=)VQGg$VcJc#S;~iEPt|imbCVdLqNN!wJj|2hwv^`H-6&#i zTypaLoAu>dk5l6xJc@7C?BZU>30E3kf_CQNb+?7PQvv?xJTnsS)l%)njsm6rD*AOP zi&0+n0jkblqD*3w^-43 zv?kWcsTfQ>xmH}$S5M$y5tPP4#-HLDgsLVNSo6?QLp^xb|$|GUO zo5N0Jn;-wcjljmN>&H;9feTsJS>nt@>o1!~j`W9lCUy-~D!DsQ@Yw+JWnvh6T)9*)kH{|En;}JW?QeorU_1zy!lb9OAFILtNhJrj&Ia!#E6C$|lW--kuyaw+> zF-AN@pw6aozf^Em%-2!0&Nz-452?h=y~59aZnF#zCk0T+r1I;Vq#1Wc#<+Lp7_H0S z+9MC(jy3cn&BlTIxP%jZwlNl%4o``eq=pjnNf3x8ktAn(ZK*O~*V>&MMk{27>oo!@ z@DLJNM~Hppz8XtI-H@NfJ?uh%AODnl$tSWk_`9mp#m~{n<@&j`%;6YJZ16R<6Hcc5 z$^+FiuCL!AzFT4vsR-e{f!_fqwR3-40_&Vz{x#q743sh<8U z8*fXMG!0uA^$Vi>G8PiTE|691X+D3y$*Lp8|4{N};Hr?@mlg}wn9fnOpQ}g>(X}^J zCxkW)sbGR4*$5i;_V_|rOspnD=|hrYS{XSGlbwZB?xY-pXcQ-8R1vVz>}W6ami5%* zB=3Qvq?QNA!2xXeiP=we5{rH9fo z1k2R+oFWk}=6RX{5{!7q(IH|p%FNFluP+UgmCyYFd5mh+o&J~`KBNBF(Gl7~I2{4K=&CZ6X0`-XIc<@bTI|Sr)dI>1K z-psWp*Xztp-TKX;0@+CPlIwp$DQH7Q7{Am5WJ)|2$8gqoWvoN}P$>^ZyX%w{mA}f+gy9TL|rfQ?d!-bmDH%Ppcs=H7=0_=IF z0B+!Hv^BA%m^Eg7X>?^+6y*TM;5GQ~G%3H@P%#a#gr=yN4jq8Z!f=KR|5qp#w;GOU z6BvZodyN(~(L0X#RqY3Fci{mpw)E9I^0`E!d$J?S3>0I|9fDbC`EyywTM{)hF}LAo zj^BSZ9X?dh6LHE*Z?30punfy<@nYYCAxo4Pk+?gVwq)~^#9PD|v7fyj^yvHvd4rHV zQeHZ{y`+VzivMDw(*52$Q$+Zv!Ts)f$G**NW*y%)#5G_x`wK>hzz$ZYclWhSpv7Zpx&<|I<&kK6F4jJ>58%6vs z(etmFMTQ+=h#VBACpc^RVS z2r1jGq1~2KZSYg$eb7B+9fYsMH~eYb))4n=pTV%#a?>8X;3s&%L+eiA;y)>_x_wS# z7*Mh$vL2MAqhJdvte|}OS|!yq8p0+axo)r39aLISjiT*!!4j(JI-N|3&(oV)o2X(W z$MiVu7U$?bi6FdjhIE@`U-JV6{dTMzb|Dh#Y+zIT?Qj&`tYh{ovl}i2w$q*nlMod? z3>)?=Aemkuad`q)l?oA$036;p0?Ae+WCAqTrQL)nm%SNxZXT(<==_+yD%48=-`yuw zxL4nGNIrcf9EZU2rXL+hu zsg7fX7{|&TGefU`_uqYEKN|8Ui`jZ0GH(aLd6N@(CwaUOUE}yw!c4I*4FAEs*Qrw7 zFn@%%LIVcVv!=@Ag8_?a^@`QifeB8kV#cs6#*<>aTg$Rx-a6JP@cXR13JCfc$AS$< z748V`X2fRZi!fE}N7UNmEAP_LdGqXtzehbVdl7A+3l5jEw5sto*xS{@(hu?gme*gy z87O+XJ5?*R&EG)mu3=yHOiz=qZ+Wgi&cVu1T~HFbH8+1E$jj%~vAL9twC4K%Uy3u9 z;sOm*IQpBY6W&HO&r|xJf%(WLZZ~Q}4+Gx`jWH`TVskE> z4$oq?&xbIkd%K9oxx;uORTO-2Ca_Tu!=&pZbEwF;jU$*^o_~{-i_^ha}B%HjWp3oc&inO+eyh z)NXc$G=3MAc`3g!J8=;_um{_v6TaA-^5(d;Xcm@;vY~~FY$|FZSrC#UtpfdXkFl|z zNl*FsZssni5{Fxot?ZgRRodGPA&n6iILjQup|buWEz6IQ&girW11d|ZHxK=7!=t`i zTd6;1hZhB&tJQ|2FQ==V^{SVcN|nA#5XTJW*Z(GoLdLFgh0NS1tcRrx}iB()qnPZ+3k zF|}#lcf~OD5+W6&%S5xf{Rx#42vGA}>_C9B(k0@Z0KvapH9q*CxR|`_xJVC(K-Q=3lFl$~ zi^LBH#m5TZ<#6__Ns@0~1ed~@9v!Z)LQ>zMjTd#C-2oxzTRt5tVG7VT41FboaJ z;m-&o1>G0365X)~=vyd53wPnk1cO~AS*sI8CvUEtq$}?H^#0<(jrT$bNYV~BIinFR z=9g{_f!q=NKFnMW>@(2lUPi~GAB1E)eYv&9bG*(W0P6SJefUoIMJo=-`~Gy>OgaY0 zC$)rXGD2cg+wr+J@HqLJSv zqpu4EM$L0vcdGuA#qah+%E$_7PkW;Exq(Vo}>%l!%`k+}q6zzC3*1@cc0I73rTmtw|i>YL4p z9UHUVy=jPkPqeMBp}Q|6t4Lt}-6r?Twdmag{wt_LgLf<&%{1}}Js}1oB@Z;&+{b$@ zfWc(_9W@GXuA30*tKCz-7l%R29oktMHJ=~VGcAFDJ2OB$ZUk5#lz8S9JC5*4PP59?=4|c11-{Vwi~N&RX7}Z8g4=X;6FA|Iwc39|)SbkwvVPqo zr0|J!mtVdwOdBMrH?^mx&GS00)1AVn_QiuShk8KKj;M{^5!Lp+oYPu_KEPAT0$|ay z8U)! z{8SC%NX<(!nYT;;^p2zxSYcJmOzwm@_5gg(FV0IXcOFht|N5{L-P|%9tIr*u`01O;Ei^4mww**$$oxxr|@$j+A+~jiL=%|7#>{9 zJ(j(Q3hoE|JqJjg`_U5J=QcXb_EVmej>`S|@}$RPc^O|1DupLqv)r=}3x+~cwf0fQ zgvnX{hm**T&r&_Yi_> zaDp}NZjEbz;4Z;JaCZs8A-FaU!9#GkIdkV$P1QM5HB;w2d~f^Zd)a&c*Iw(lqQ3p3 z>>Al$T&&utYQumQNb((mrYfai*1xIJtkm1IjY7kq$W}g@{i&!U3&V^#(@&12s2vUN z8I7Wxo63GLJ(8p&Yhs(0T-`ak3~H%xSyUb4eAvm~oM-iu9Q!V9_!tj1+rJU3Y($t_`3cisHR?ut+_sl_8m zrQmpPG(F|y{8YAiBsiz%JhBijLP9-KEhjVfy$fq0(mETUoI9|r&YgJ6FSRDM75K3AHfC*rL#FCM{YXLd<7C zyfF_sOt>l2G~F&j_r}}%@9B>J+iLh?L`PHCi2UkiZ;t^c^S3qmPzyNVYyB+R_anW$ z9B=@S!022v(!}O0i9}__a0C!*cdxynL!JAvot{`(tR~detAUk_VMpM}{E%wl4H0&_ zTG{m;8`8P}ae_@!I61$lVQ*(63-_(Z#}0X1yZOnC@?e-a!E7s1k0wSO?@8f6rKq*z z=PR#yxMZo@x`_Td5jq08;DH2 z(bab*5yjQqk)3iUjcX41r^ZeTqTlrMM)S|nk#;wGY?_7pVI-rNcl|Yy(a7~nf=`R} z+&;hS6#(yAz1_)<_A*RjdKYZxaU)3x3ZOC&PDZe-#aSxg%yL>EIo)@cQg!2EF1cd7 zK!KUoZo?h<=u33Wg*AGmad{qgXu;16&Jyf3mo(bT;g?&<8v^sp=Rfe+9<;t7z|r%k zc27qvO|==URPi2LxijW2@qC}<&UI<(-$HvHRy=Kn?&u-^9UuNq{h)uiIrdL(fV0XrdLe>7W zJ6F>5MG{n8WFB!@wmCkBwD&tRY<4%IdHn>)AjA+C z=}mqegUVTEBM17`y4o7NaMpU;^?*H{_Urzim42un@gdoGj*Be)iq_NDy%%L9BlZ|W z>N3M}z4}I^A)CPn&=NqTmdqIC^dS{(h6{BRUTEP}=Fa-M`|TtpqQC>jAi2{jpkAP* zMP_2f#(zz8i79|V{OQiZrAAh=s9c$05Doul4IkvG&;b}WrjbAm8q7VX$JKdB)u4=r(X8FAI7($cD}j$!8DEitmQDON-LY>AW&B%>_4$a5$z?*4sFU zXwS9zENaHxLW5;AqgO%Le76bM5c;8-BQbTZgQF^{GfG|xLGw1cVn%h&fB4mcm~o|( zx8q33G1qpTp-V_Wz4=tv6^@*b%rcjzB7K)IJ*g7F0sV=#f~xD;@SeN(3HX|{4{b1T z$b%tQNKuzA9!EkZoVn%ptaK6Eb1rPrsRWIm{my2vL>x)EZN6ijPBaCF z1BPJp-0)D9-RaX_qnC5WSDNrQiDaLd2i+pVVAvoDiV9gBT)G%^dZM^Ko=KrYBN7W3 z7>e?h?&Ui#dSPS{YlP1Z?$5h-)~NSyw!Ax|iecRSo`>H{Acm!XlcJ=JbL3$(*1Xn4 z+9+*$n6BT8|C)S=Hv~pm-p>AZJcEp z60fE1vX375tYJZfGip|)dHcWZu%v$tD`z>=9Jd96et{j!d1@_VwI5-GbwjR1p%+sfH3U$SP#Cq{i+v`G{_LiYGZ`Naq#-W z3fajxZBwGxEdI&C>;-76adCRxckMbf7S2d*lCbx}!Vi@5V1a z%8j2JWf7r1%swVT{sdAk3`nq<8Ulw-Hr$zrWwwKTR4#+}M+*{mcbuqZOmn(|c)P+n zRVm13CHZA}A3w?gH$Ch z%Y!eGEmSvy!R>i~y8eL-zYc2sm0La=Ry9_;iEi^$__XJwc6hcVo`AYf!c>h`ZDp~* z5RpQa{Wa2FGgs2&c+dp-eawRS+wxH)v3{r2RNgUhuN`#SDHYWM6#HK=5^+VZ^RrR~ z>cyKHs-i612X4s&7{lq}Q0NN{c67eW2C43L=ZRg!O^1$raJ0%K;L`a2QuzLB1L6Nm z6ze}P-kK6cMBe;9=Tz!(7oH>&HXs^$AQa-aWMZgsa$;|15g=}23Et#i3M>gLBN}P{ zeFyQm&o@csl!)wMih6g}@u4l0N$&zPOc?b*gX)tdVhA`~*k9L(*7TQOm%_$JfGfe@ zq@E{@v$&HPw+sC}EME>2A}9S_jzqAxk3VN?kPGg}#=*}%!XzY{z>l;o;))7)D)w!{raa>&*kf=jVC`0rKtO%?DT0ae( zsK9mC`n!hn!d%>@DNE|BGzWKqKn+VRf_Ijd246`Xn>GjY@E6uNj`ayhHl@XnZ4kBO z?B;P8o!4w=&rO>Jo!}Xp>z(N>UO4~p+NBP#%vr-NKR`m)`yMA0hU{FQAMc&|ihE;5 z7x0H}s)Q{Ayqz=y_*^*2#fxgKe2~r=Y!bW(rb;^ z!=;R(g0Q&1yg`i5X=lUaAyGoilMX%GVV_aB_=X2bk}${paUt?hGHZZD_cqv2b?1>W zXOpRfjV@-|xZK1ZxI}P6Kd3}Jw`l7B4|kvcy7y;nq9f@Gs8U4)C9yaa|IF^K3ZdrP z({e}jPqyfLaR0F0vPe-mDV%+VaDkcy<#z8QvcB#Nr>^F=W$C;iTpA=PTdlXMVIc_a zn05jGCdN=HM<0we8Eoj((z-BBgBB6G;=~_QD{iGz0~X4#frSNw0|T#XK_Lz`=bPYaR@w~BmV z$W7fO@CZF4Fum(1KFaV}Szg|uxTjq>x0lgW+@vOYttq*Ko?2MF;%W)DwXp*j6R^iWWhO-84H37v)E3|+gJUW zv2u_IR<{x4q2-;j%z-F`U#;je?)sW>yn_ov{2Df_Lm;OFTIDIxPaY$&RHcj#_g5W3BnY5wUP| zc&#>-XSH8z_XVk24!5{`67O3r!tn$;YQ6nSvtSskenFv?yTpjzi(7{+t{lapEP@1j zy)yJcfr3X!ejcS8_OA$ZR`g7h;p!79NWQ zK_aZ@7~Ue_&Y-PA$6>V!cOrZ!t^b~<1Ei=nZH=3o(3LT3fJ&ouNa=JArns5wYo}JZX$6onW5xTwLrP ztmy1$&uc6vd-E@9q%PR=;P8MNbbemC`Ea#3dyG6NIPZ6QeBT(j^ZqMa_p*VSR=8l- zgid>a9YZedtZ={DaoWQNGC(M-p%@{-vej4Z)|Snsw~eRJl)!Tw$5-edSt(?6lFS2V#2laH@~*4tmlPaG=tNQ|ld~aaQI~8{T-JO*+Xr#zK!rN`- zcptsD9Vl*{#}C%}*edX%s%kee+1h!IuV-EfbYS6k%OCPimdaF;3<>MAf*klVV?_*n zWM;tRDu^TeZk}5?42;10_o$%7Z%y(YNkOx<$hD4-|8jc=8xq%^M6`S!PFCTr+X+#t z^Enos-$wIsP6l`02=WkB@Sl7+K}N`PF`bXC`ftjI|J!RXSq>OoPF*ZlnOyn0<}TEK zVdXKJyjb?`0PbV*)YC?4NANk^R^BO#g1^<(bten@-X3bsF!&=ipLsMSRloCaWe&Qq zi;NRR*&VcY5JXdp9p#uYB~|%ly@t4LdH9q z@mYraN&M;?HWAGTC-#$B>Up`aJlaNXzIbaL6Vy%DN9pl>5+Sup>Bb>W(4A|XmkXX%tt$RC4{m{))SodQ(LbknewTWB)8{4NjMwW6 z>}|v#PmJoEp}s{6{XUi~vil6~

    L%Yj0kwC)JKzW*Z{;59WN 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≪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 NC1tZOiJIot{vZ5_jpG0S literal 0 HcmV?d00001 diff --git a/lmms_eval/tasks/mmmu/mmmu_group_img_val.yaml b/lmms_eval/tasks/mmmu/mmmu_group_img_val.yaml index c9f9239e4..aad2e6a80 100644 --- a/lmms_eval/tasks/mmmu/mmmu_group_img_val.yaml +++ b/lmms_eval/tasks/mmmu/mmmu_group_img_val.yaml @@ -9,7 +9,7 @@ doc_to_target: "answer" process_results: !function utils_group_img.mmmu_process_results # Note that the metric name can be either a registed metric function (such as the case for GQA) or a key name returned by process_results generation_kwargs: - max_new_tokens: 16 + max_new_tokens: 128 model_specific_generation_kwargs: llava: image_aspect_ratio: original diff --git a/lmms_eval/tasks/mmmu/mmmu_val.yaml b/lmms_eval/tasks/mmmu/mmmu_val.yaml index 49ab0dd1d..9e1574c43 100755 --- a/lmms_eval/tasks/mmmu/mmmu_val.yaml +++ b/lmms_eval/tasks/mmmu/mmmu_val.yaml @@ -9,7 +9,7 @@ doc_to_target: "answer" process_results: !function utils.mmmu_process_results # Note that the metric name can be either a registed metric function (such as the case for GQA) or a key name returned by process_results generation_kwargs: - max_new_tokens: 16 + max_new_tokens: 128 model_specific_generation_kwargs: llava: image_aspect_ratio: original diff --git a/lmms_eval/tasks/mmmu/utils.py b/lmms_eval/tasks/mmmu/utils.py index 302a6dff2..5a1b91f61 100755 --- a/lmms_eval/tasks/mmmu/utils.py +++ b/lmms_eval/tasks/mmmu/utils.py @@ -11,7 +11,7 @@ lmms_logger = logging.getLogger("lmms-eval") -MULTI_CHOICE_PROMPT = "Answer with the option letter from the given choices directly." +MULTI_CHOICE_PROMPT = "Answer with the option's letter from the given choices directly." OPEN_ENDED_PROMPT = "Answer the question using a single word or phrase." @@ -36,9 +36,9 @@ def construct_prompt(doc): # Weirdly, data["options"] is a string in MMMU Huggingface dataset parsed_options = parse_options(ast.literal_eval(doc["options"])) # parsed_options already prepends a newline so no need to add space here - question = f"{question}\n{parsed_options}\n{MULTI_CHOICE_PROMPT}" + question = f"{question}\n{parsed_options}\n\n{MULTI_CHOICE_PROMPT}" else: - question = f"{question}\n{OPEN_ENDED_PROMPT}" + question = f"{question}\n\n{OPEN_ENDED_PROMPT}" return question @@ -112,18 +112,18 @@ def mmmu_aggregate_results(results): in_domain_data_num = sum([cat_results["num_example"] for cat_results in in_domain_cat_results.values()]) printable_results["Overall-" + domain] = { "num": int(in_domain_data_num), - "acc": round(in_domain_ins_acc, 3), + "acc": round(in_domain_ins_acc, 5), } # add sub category for cat_name, cat_results in in_domain_cat_results.items(): printable_results[cat_name] = { "num": int(cat_results["num_example"]), - "acc": round(cat_results["acc"], 3), + "acc": round(cat_results["acc"], 5), } all_ins_acc = calculate_ins_level_acc(evaluation_result) printable_results["Overall"] = { "num": sum([cat_results["num_example"] for cat_results in evaluation_result.values()]), - "acc": round(all_ins_acc, 3), + "acc": round(all_ins_acc, 5), } print(printable_results) return printable_results["Overall"]["acc"] diff --git a/lmms_eval/tasks/mmmu/utils_group_img.py b/lmms_eval/tasks/mmmu/utils_group_img.py index e3e475be4..81e1c8de3 100644 --- a/lmms_eval/tasks/mmmu/utils_group_img.py +++ b/lmms_eval/tasks/mmmu/utils_group_img.py @@ -13,13 +13,19 @@ from PIL import Image, ImageDraw, ImageFont import numpy as np +import os + +script_dir = os.path.dirname(__file__) +os.chdir(script_dir) + -def add_order_label(image, label, font_family="DejaVu Sans", font_size=40): +def add_order_label(image, label, font_size=40): # Create a drawing context draw = ImageDraw.Draw(image) # Define font for the label - font_path = fm.findfont(fm.FontProperties(family=font_family)) + # font_path = fm.findfont(fm.FontProperties(family=font_family)) + font_path = "./arial.ttf" font = ImageFont.truetype(font_path, font_size) # Calculate text size and position @@ -112,7 +118,7 @@ def process_images_vertical(original_images, size): return concatenate_images_vertical(images) -def process_images(images, size=672): +def process_images(images, size=1008): concat_horizontal = process_images_horizontal(images, size) concat_vertical = process_images_vertical(images, size) @@ -130,7 +136,7 @@ def process_images(images, size=672): lmms_logger = logging.getLogger("lmms-eval") -MULTI_CHOICE_PROMPT = "Answer with the option letter from the given choices directly." +MULTI_CHOICE_PROMPT = "Answer with the option's letter from the given choices directly." OPEN_ENDED_PROMPT = "Answer the question using a single word or phrase." @@ -145,7 +151,7 @@ def replace_images_tokens(input_string): def parse_options(options): option_letters = [chr(ord("A") + i) for i in range(len(options))] - choices_str = "\n".join([f"{option_letter}. {option}" for option_letter, option in zip(option_letters, options)]) + choices_str = "\n".join([f"({option_letter}) {option}" for option_letter, option in zip(option_letters, options)]) return choices_str @@ -155,7 +161,7 @@ def construct_prompt(doc): # Weirdly, data["options"] is a string in MMMU Huggingface dataset parsed_options = parse_options(ast.literal_eval(doc["options"])) # parsed_options already prepends a newline so no need to add space here - question = f"{question}\n{parsed_options}\n{MULTI_CHOICE_PROMPT}" + question = f"{question}\n{parsed_options}\n\n{MULTI_CHOICE_PROMPT}" else: question = f"{question}\n{OPEN_ENDED_PROMPT}" return question diff --git a/pyproject.toml b/pyproject.toml index 30a2e5dbb..db58b9212 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,7 @@ dependencies = [ "black==24.1.0", "datasets==2.16.1", "evaluate>=0.4.0", + "httpx==0.23.3", "jsonlines", "numexpr", "peft>=0.2.0", From 4addd8b4df7630547a91e103254366c9c27d7f3f Mon Sep 17 00:00:00 2001 From: Bo Li Date: Sun, 9 Jun 2024 12:09:46 +0000 Subject: [PATCH 121/181] Refactor exclusion patterns in pyproject.toml and tool.wheel --- miscs/llava_sglang_result_check.md | 0 pyproject.toml | 35 ++++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100755 miscs/llava_sglang_result_check.md diff --git a/miscs/llava_sglang_result_check.md b/miscs/llava_sglang_result_check.md new file mode 100755 index 000000000..e69de29bb diff --git a/pyproject.toml b/pyproject.toml index db58b9212..c93eeb126 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -64,9 +64,40 @@ dependencies = [ [tool.setuptools.packages.find] include = ["lmms_eval*"] +exclude = [ + "assets*", + "benchmark*", + "docs", + "dist*", + "playground*", + "scripts*", + "tests*", + "checkpoints*", + "project_checkpoints*", + "debug_checkpoints*", + "mlx_configs*", + "wandb*", + "notebooks*", + "logs*", +] -[tool.setuptools.package-data] -lmms_eval = ["**/*.yaml", "tasks/**/*"] +[tool.wheel] +exclude = [ + "assets*", + "benchmark*", + "docs", + "dist*", + "playground*", + "scripts*", + "tests*", + "checkpoints*", + "project_checkpoints*", + "debug_checkpoints*", + "mlx_configs*", + "wandb*", + "notebooks*", + "logs*", +] [project.scripts] lmms-eval = "lmms_eval.__main__:cli_evaluate" From d10e5ca8d98a5f4b5a86dcbf2eec21b2561c1406 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Sun, 9 Jun 2024 13:00:39 +0000 Subject: [PATCH 122/181] Revise pyav load stream logic --- lmms_eval/models/model_utils/load_video.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lmms_eval/models/model_utils/load_video.py b/lmms_eval/models/model_utils/load_video.py index 7bdc9383f..a0e6e2b65 100644 --- a/lmms_eval/models/model_utils/load_video.py +++ b/lmms_eval/models/model_utils/load_video.py @@ -21,9 +21,10 @@ def read_video_pyav(video_path, num_frm=8): frames.append(frame) else: # https://github.com/PyAV-Org/PyAV/issues/1269 - context = CodecContext.create("libvpx-vp9", "r") + # https://www.cnblogs.com/beyond-tester/p/17641872.html + # context = CodecContext.create("libvpx-vp9", "r") for packet in container.demux(video=0): - for frame in context.decode(packet): + for frame in packet.decode(): frames.append(frame) total_frames = len(frames) num_frm = min(total_frames, num_frm) From 0a7d8f2496368158b4c15202761e952da904e1ff Mon Sep 17 00:00:00 2001 From: kcz358 Date: Sun, 9 Jun 2024 13:01:20 +0000 Subject: [PATCH 123/181] Add tools to calculate avg time in the video dataset --- tools/get_video_avg_time.py | 41 +++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 tools/get_video_avg_time.py diff --git a/tools/get_video_avg_time.py b/tools/get_video_avg_time.py new file mode 100644 index 000000000..2c490a7b5 --- /dev/null +++ b/tools/get_video_avg_time.py @@ -0,0 +1,41 @@ +import json +from lmms_eval.tasks import initialize_tasks, include_path, get_task_dict +import av +from tqdm import tqdm +from av.codec.context import CodecContext + +tasks = ["worldqa_gen", "activitynetqa", "nextqa_oe_val", "nextqa_oe_test", "videochatgpt_gen", "egoschema"] +# tasks = ["activitynetqa"] +data_stats = {} +if __name__ == "__main__": + initialize_tasks() + + task_dict = get_task_dict(tasks, model_name="llavavid") + for task_name in task_dict.keys(): + task_obj = task_dict[task_name] + if type(task_obj) == tuple: + group, task_obj = task_obj + + docs = task_obj.test_docs() + doc_to_visual = task_obj.doc_to_visual + data_stats[task_name] = 0 + for doc in tqdm(docs, desc=f"Processing {task_name}"): + video_path = doc_to_visual(doc) + container = av.open(video_path[0]) + if "webm" not in video_path[0] and "mkv" not in video_path[0]: + video = container.streams.video[0] + video_length = (float(video.duration * video.time_base)) # in seconds + else: + video_length = 0 + # context = CodecContext.create("libvpx-vp9", "r") + for packet in container.demux(video=0): + for frame in packet.decode(): + video_length = frame.time # The last frame time represent the video time + data_stats[task_name] += video_length + + data_stats[task_name] /= len(docs) # into seconds + # data_stats[task_name] /= 60 # into minutes + + with(open("./video_benchmarks_stats.json", "w")) as f: + json.dump(data_stats, f, indent=4, ensure_ascii=False) + From 105fb25041bd48203fe5cef15ec4e7cccc7de4d3 Mon Sep 17 00:00:00 2001 From: Shuai Liu <76559926+choiszt@users.noreply.github.com> Date: Mon, 10 Jun 2024 01:13:00 +0800 Subject: [PATCH 124/181] update VATEX datasets (#118) * Resolve conflict when merge the kr_ego with internal_main_dev * fix the bug of file overwrite * Optimize the inference of videochatgpt dataset * Resolve conflict * delete repeated line * reformat the code * rename the file name for inference results * group the same task together for cvrr and videochatgpt * group the same task together for videochatgpt and cvrr * reformat the code * fix the bug of videochatgpt_consistency multiocessing * Rename the metric from submission to subtask * fix the bug of consistency where different answers agre generated in pred2 * add accuracy into the evaluation of cvrr * add accuracy metric to cvrr dataset * remove duplicate rows when merging from main branch * Refactor videochatgpt_gen and videochatgpt_temporal for correct score parsing * enable the webm video loader for llavavid as required in cvrr dataset * Refactor process_results function to handle full_docs in videochatgpt task * add tqdm to consistency gpt_eval * Refactor the cvrr for correct aggregate logic * change backend to decord for videochatgpt eval * Fix for mkv video path * add data feature * update vatex * add vatex task * update * update VATEX and evaluation matrices * new * update utils * update vatex * new * update load vatex from url * update vatex from url * Delete lmms_eval/models/gpt4v.py * update vatex from url --------- Co-authored-by: KairuiHu Co-authored-by: Bo Li Co-authored-by: kcz358 Co-authored-by: SHUAI LIU Co-authored-by: choiszt --- .gitignore | 6 + download.sh | 1 + lmms_eval/api/task.py | 67 +- lmms_eval/evaluator.py | 2 +- lmms_eval/models/gpt4v.py | 9 +- lmms_eval/models/llava_vid.py | 2 +- lmms_eval/models/mini_gemini.py | 548 +++++++++++++++ lmms_eval/tasks/__init__.py | 2 + lmms_eval/tasks/vatex/_default_template_yaml | 5 + lmms_eval/tasks/vatex/_vatex.yaml | 4 + lmms_eval/tasks/vatex/utils.py | 221 +++++++ lmms_eval/tasks/vatex/vatex_test.yaml | 35 + lmms_eval/tasks/vatex/vatex_val_ZH.yaml | 35 + setup.py | 1 - tools/make_vatex.py | 25 + tools/makecvrr.ipynb | 663 +++++++++++++++++++ utils/cal_avg_length.py | 34 + utils/download_vatex.py | 10 + utils/upload_data.py | 9 + utils/upload_to_hf.py | 40 ++ 20 files changed, 1709 insertions(+), 10 deletions(-) create mode 100644 download.sh create mode 100644 lmms_eval/models/mini_gemini.py create mode 100755 lmms_eval/tasks/vatex/_default_template_yaml create mode 100755 lmms_eval/tasks/vatex/_vatex.yaml create mode 100755 lmms_eval/tasks/vatex/utils.py create mode 100644 lmms_eval/tasks/vatex/vatex_test.yaml create mode 100755 lmms_eval/tasks/vatex/vatex_val_ZH.yaml create mode 100644 tools/make_vatex.py create mode 100644 tools/makecvrr.ipynb create mode 100644 utils/cal_avg_length.py create mode 100644 utils/download_vatex.py create mode 100644 utils/upload_data.py create mode 100644 utils/upload_to_hf.py diff --git a/.gitignore b/.gitignore index 55e8d8b16..dd8efe3d7 100755 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,9 @@ pretrained/ LLaVA/ *logs temp/ +InternVL/ +logs/ +vatex/ +data/ +llava-video/ +!lmms_eval/tasks/vatex \ No newline at end of file diff --git a/download.sh b/download.sh new file mode 100644 index 000000000..5eea121a6 --- /dev/null +++ b/download.sh @@ -0,0 +1 @@ +yt-dlp https://www.youtube.com/watch?v=G9zN5TTuGO4_000179_000189 \ No newline at end of file diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index 9aa3b3b7c..2af0e0a97 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -108,7 +108,7 @@ def __post_init__(self) -> None: import inspect from importlib import import_module - self.dataset_path = inspect.getfile(import_module(self.dataset_path)) + # self.dataset_path = inspect.getfile(import_module(self.dataset_path)) if self.generation_kwargs is not None: if self.output_type != "generate_until": @@ -688,6 +688,68 @@ def _prepare_metric_and_aggregation(self): def download(self, dataset_kwargs=None) -> None: # If the dataset is a video dataset, # Recursively search whether their is a zip and unzip it to the huggingface home + if "From_YouTube" in dataset_kwargs: + import subprocess + import json + def _download_from_youtube(path): + import subprocess + try: + for video in tqdm(self.all_dataset[split]): + video_id = video['videoID'] + target_path=os.path.join(path,f"{video_id}.mp4") + command = f"yt-dlp -o {target_path} -f mp4 https://www.youtube.com/watch?v={video_id}" + subprocess.run(command, shell=True) + with open(os.path.join(cache_path,f"{task}_download_status.json"),'w') as f: + f.write(json.dumps({task:"downloaded"})) + except Exception as e: + eval_logger.error(f"Error while downloading {task} data: {e}") + with open(os.path.join(cache_path,f"{task}_download_status.json"),'w') as f: + f.write(json.dumps({task:"not downloaded"})) + + hf_home = os.getenv("HF_HOME", "~/.cache/huggingface/") + accelerator = Accelerator() + if accelerator.is_main_process: + dataset_kwargs.pop("From_YouTube") + self.all_dataset = datasets.load_dataset( + path=self.DATASET_PATH, + name=self.DATASET_NAME, + download_mode=datasets.DownloadMode.REUSE_DATASET_IF_EXISTS, + **dataset_kwargs if dataset_kwargs is not None else {},) + dataset_kwargs["From_YouTube"]=True + cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset") #download_parquet + split=vars(self.config)["test_split"] + task=vars(self.config)["task"] + + video_path=os.path.join(hf_home,task) + if os.path.exists(os.path.join(cache_path,f"{task}_download_status.json")): + download_status = json.load(open(os.path.join(cache_path, f"{task}_download_status.json"), 'r')) + if download_status[task] == "downloaded": + eval_logger.info(f"Data for {task} already download!") + else: + eval_logger.info(f"Start downloading YouTube data to {video_path}...") + _download_from_youtube(video_path) + else: + eval_logger.info(f"Start downloading YouTube data to {video_path}...") + _download_from_youtube(video_path) + + accelerator.wait_for_everyone() + if "builder_script" in dataset_kwargs: + builder_script = dataset_kwargs["builder_script"] + self.DATASET_PATH = os.path.join(cache_path, builder_script) + dataset_kwargs.pop("builder_script") + download_config = DownloadConfig() + download_config.max_retries = dataset_kwargs.get("max_retries", 3) if dataset_kwargs is not None else 3 + download_config.num_proc = dataset_kwargs.get("num_proc", 8) if dataset_kwargs is not None else 8 + + downloaded_video_ids=[i.split(".mp4")[0] for i in os.listdir(os.path.expanduser(video_path))if i.endswith(".mp4")] + #Filtered the existing dataset with the downloaded video ids + self.dataset=datasets.DatasetDict({split: self.all_dataset[split].filter(lambda x: x['videoID'] in downloaded_video_ids)}) + + self.dataset_no_image =self.dataset + dataset_kwargs.pop("From_YouTube") + return + + if dataset_kwargs is not None and "video" in dataset_kwargs and dataset_kwargs["video"]: hf_home = os.getenv("HF_HOME", "~/.cache/huggingface/") cache_dir = dataset_kwargs["cache_dir"] @@ -711,9 +773,6 @@ def download(self, dataset_kwargs=None) -> None: dataset_kwargs.pop("cache_dir") dataset_kwargs.pop("video") - download_config = DownloadConfig() - download_config.max_retries = dataset_kwargs.get("max_retries", 3) if dataset_kwargs is not None else 3 - download_config.num_proc = dataset_kwargs.get("num_proc", 8) if dataset_kwargs is not None else 8 self.dataset = datasets.load_dataset( path=self.DATASET_PATH, name=self.DATASET_NAME, diff --git a/lmms_eval/evaluator.py b/lmms_eval/evaluator.py index 7554130f4..e6fbcd6cd 100755 --- a/lmms_eval/evaluator.py +++ b/lmms_eval/evaluator.py @@ -468,7 +468,7 @@ def evaluate( else: # Bo: for models only need agg items results[task_name][metric_key] = agg_fn(items) - + results[task_name]["samples"] = len(items) # hotfix: bleu, chrf, ter seem to be really expensive to bootstrap diff --git a/lmms_eval/models/gpt4v.py b/lmms_eval/models/gpt4v.py index bf8f66ed4..1245bdb21 100755 --- a/lmms_eval/models/gpt4v.py +++ b/lmms_eval/models/gpt4v.py @@ -49,7 +49,7 @@ class GPT4V(lmms): def __init__( self, model_version: str = "gpt-4-vision-preview", - modality: str = "image", + modality: str = "video", max_frames_for_video: int = 10, timeout: int = 120, **kwargs, @@ -120,7 +120,8 @@ def generate_until(self, requests) -> List[str]: for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: # encode, pad, and truncate contexts for this batch - visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + # visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = [doc_to_visual(self.task_dict[task][split][0])] visuals = self.flatten(visuals) imgs = [] # multiple images or frames for video for visual in visuals: @@ -128,7 +129,8 @@ def generate_until(self, requests) -> List[str]: img = self.encode_image(visual) imgs.append(img) elif self.modality == "video": - frames = self.encode_video(visual, self.max_frames_for_video) + # frames = self.encode_video(visual, self.max_frames_for_video) + frames="hi" imgs.extend(frames) payload = {"model": self.model_version, "messages": []} @@ -166,6 +168,7 @@ def generate_until(self, requests) -> List[str]: for attempt in range(5): try: + # content="一个戴着红色帽子的男子,用一个工具把自己的腰系住,往下面慢慢的在走。";break#Choiszt:just for test response = url_requests.post(API_URL, headers=headers, json=payload, timeout=self.timeout) response_data = response.json() diff --git a/lmms_eval/models/llava_vid.py b/lmms_eval/models/llava_vid.py index 3465766f5..529717bc7 100755 --- a/lmms_eval/models/llava_vid.py +++ b/lmms_eval/models/llava_vid.py @@ -16,7 +16,7 @@ from lmms_eval.api.registry import register_model eval_logger = logging.getLogger("lmms-eval") - +import sys;sys.path.append("llava-video") try: from llavavid.model.language_model.llava_llama import LlavaConfig from llavavid.model.language_model.llava_qwen import LlavaQwenConfig diff --git a/lmms_eval/models/mini_gemini.py b/lmms_eval/models/mini_gemini.py new file mode 100644 index 000000000..8a40a5d3e --- /dev/null +++ b/lmms_eval/models/mini_gemini.py @@ -0,0 +1,548 @@ +import argparse +import os +import json +import shortuuid +import logging +from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs +from accelerate.state import AcceleratorState +from typing import List, Optional, Union, Tuple +import torch +from tqdm import tqdm +import numpy as np +import math +from datetime import timedelta +from transformers import AutoConfig,AutoModelForCausalLM,GenerationConfig, \ + LlamaConfig, LlamaModel, LlamaForCausalLM +from huggingface_hub import snapshot_download + +from lmms_eval import utils +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model +from lmms_eval.utils import stop_sequences_criteria +from PIL import Image + +import subprocess +import sys + +from torch.utils.data import Dataset, DataLoader + +eval_logger = logging.getLogger("lmms-eval") + +import warnings +from typing import Any, List, Optional, Tuple, Union + +import torch.utils.checkpoint + +from peft import LoraConfig, get_peft_model +from torch import nn +from transformers import AutoTokenizer +import re +from huggingface_hub import snapshot_download + +try: + from mgm.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN + from mgm.conversation import conv_templates, SeparatorStyle + from mgm.model.language_model.mgm_llama import MGMConfig, MGMLlamaModel, MGMLlamaForCausalLM + from mgm.model.builder import load_pretrained_model + from mgm.utils import disable_torch_init + from mgm.mm_utils import tokenizer_image_token, process_images, get_model_name_from_path +except ImportError: + eval_logger.error("InternVL is not installed. Please install InternVL to use this model.") + + +def split_list(lst, n): + """Split a list into n (roughly) equal-sized chunks""" + chunk_size = math.ceil(len(lst) / n) # integer division + return [lst[i:i+chunk_size] for i in range(0, len(lst), chunk_size)] + + +def get_chunk(lst, n, k): + chunks = split_list(lst, n) + return chunks[k] + + +def eval_model(args): + # Model + disable_torch_init() + model_path = os.path.expanduser(args.model_path) + model_name = get_model_name_from_path(model_path) + tokenizer, model, image_processor, context_len = load_pretrained_model(model_path, args.model_base, model_name, load_8bit=args.load_8bit) + + questions = [json.loads(q) for q in open(os.path.expanduser(args.question_file), "r")] + questions = get_chunk(questions, args.num_chunks, args.chunk_idx) + answers_file = os.path.expanduser(args.answers_file) + os.makedirs(os.path.dirname(answers_file), exist_ok=True) + ans_file = open(answers_file, "w") + + if 'plain' in args.conv_mode and 'finetune' not in model_name.lower() and 'mmtag' not in args.conv_mode: + args.conv_mode = args.conv_mode + '_mmtag' + print(f'It seems that this is a plain model, but it is not using a mmtag prompt, auto switching to {args.conv_mode}.') + + data_loader = create_data_loader(questions, args.image_folder, tokenizer, image_processor, model.config) + + for (input_ids, image_tensor, image_tensor_aux), line in tqdm(zip(data_loader, questions), total=len(questions)): + idx = line["question_id"] + cur_prompt = line["text"] + + input_ids = input_ids.to(device=model.device, non_blocking=True) + if hasattr(model, "update_prompt"): + model.update_prompt([[cur_prompt]]) + + terminators = tokenizer.eos_token_id + if "llama_3" in args.conv_mode: + terminators = [terminators, tokenizer.convert_tokens_to_ids("<|eot_id|>")] + + with torch.inference_mode(): + output_ids = model.generate( + input_ids, + images=image_tensor.to(dtype=model.dtype, device=model.device, non_blocking=True), + images_aux=image_tensor_aux.to(dtype=model.dtype, device=model.device, non_blocking=True) if len(image_tensor_aux)>0 else None, + do_sample=True if args.temperature > 0 else False, + temperature=args.temperature, + top_p=args.top_p, + num_beams=args.num_beams, + max_new_tokens=args.max_new_tokens, + bos_token_id=tokenizer.bos_token_id, # Begin of sequence token + eos_token_id=terminators, # End of sequence token + pad_token_id=tokenizer.pad_token_id, # Pad token + use_cache=True) + + outputs = tokenizer.batch_decode(output_ids, skip_special_tokens=True)[0].strip() + + ans_id = shortuuid.uuid() + ans_file.write(json.dumps({"question_id": idx, + "prompt": cur_prompt, + "text": outputs, + "answer_id": ans_id, + "model_id": model_name, + "metadata": {}}) + "\n") + # ans_file.flush() + ans_file.close() + + + +@register_model("mini_gemini") +class MGM7B(lmms): + config_class = MGMConfig + main_input_name = "pixel_values" + _no_split_modules = ["InternVisionEncoderLayer", "LlamaDecoderLayer"] + + """ + 0. Install lmms-eval + cd lmms-eval + pip install -e . + + How to Install InternVL: + 1. Clone the InternVL repository: + git clone https://github.com/OpenGVLab/InternVL.git + + 2. Install the requirements: + pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118 + + 3. Install flash-attn==2.3.6: + pip install flash-attn==2.3.6 --no-build-isolation + """ + + """ + How to download the pretrained model: + 1. Download the pretrained model from hugginface: + cd pretrained/ + # pip install -U huggingface_hub + huggingface-cli download --resume-download --local-dir-use-symlinks False OpenGVLab/InternVL-Chat-V1-5 --local-dir InternVL-Chat-V1-5 + + 2. the pretrained model should be in the following directory: + pretrained + └── InternVL-Chat-V1-5 + """ + + # + # The above steps can be optional, I add snapshot download, so now can just use hf repo_id + # model_args pretrained=OpenGVLab/InternVL-Chat-V1-5 + # + + """ + InternVL-Chat-V1-5 Model for OpenGVLab https://github.com/OpenGVLab/InternVL/blob/main/internvl_chat/internvl/model/internvl_chat/modeling_internvl_chat.py + Example usage: + + accelerate launch --num_processes=8 --main_process_port 12345 -m lmms_eval \ + --model internvl \ + --model_args pretrained=OpenGVLab/InternVL-Chat-V1-5 \ + --tasks mme \ + --batch_size 1 \ + --output_path ./logs/ \ + --log_samples + """ + + def __init__( + self, + config: Optional[MGMConfig] = None, + pretrained: str = "OpenGVLab/InternVL-Chat-V1-5", + truncation: Optional[bool] = True, + device: Optional[str] = "cuda:0", + dtype: Optional[Union[str, torch.dtype]] = "auto", + batch_size: Optional[Union[int, str]] = 1, + trust_remote_code: Optional[bool] = False, + revision=None, + device_map="cuda:0", + conv_template="vicuna_v1", + use_cache=True, + truncate_context=False, # whether to truncate the context in generation, set it False for LLaVA-1.6 + customized_config=None, # ends in json + dynamic=True, + load_in_8bit=False, + vision_model=None, + language_model=None, + max_num=12, + **kwargs, + ) -> None: + super().__init__() + + assert kwargs == {}, f"Unexpected kwargs: {kwargs}" + + accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) + accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) + if accelerator.num_processes > 1: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + elif accelerator.num_processes == 1 and device_map == "auto": + self._device = torch.device(device) + self.device_map = device_map + else: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + + self.dynamic = dynamic # dynamic image_size + self.max_num = max_num + + accelerator.wait_for_everyone() + + model_name = get_model_name_from_path(pretrained) + + config=MGMConfig.from_pretrained(pretrained) + overwrite_config = {} + overwrite_config["mm_vision_tower"] = "openai/clip-vit-large-patch14-336" + overwrite_config["mm_vision_tower_aux"] = "openai/openclip-convnext-large-d-320-laion2B-s29B-b131K-ft-soup" + setattr(config, "mm_vision_tower", overwrite_config["mm_vision_tower"]) + setattr(config, "mm_vision_tower_aux", overwrite_config["mm_vision_tower_aux"]) + # overwrite_config["mm_spatial_pool_out_channels"] = self.mm_spatial_pool_out_channels + # overwrite_config["mm_spatial_pool_mode"] = self.mm_spatial_pool_mode + # overwrite_config["patchify_video_feature"] = False + tokenizer, model, image_processor, context_len = load_pretrained_model(pretrained, None, model_name, load_8bit=load_in_8bit,config=config) + # config = InternVLChatConfig.from_pretrained(cache_dir) + # tokenizer = AutoTokenizer.from_pretrained(cache_dir, trust_remote_code=True, use_fast=False) + # model = InternVLChatModel.from_pretrained(cache_dir, low_cpu_mem_usage=True, config=config, torch_dtype=torch.bfloat16, load_in_8bit=load_in_8bit).eval() + if not load_in_8bit: + model = model.cuda() + # self.model=model + # self.device=self._device + self._tokenizer = tokenizer + # self.tokenizer=tokenizer + self._model = model + self._config = self._model.config + self.use_thumbnail = self.model.config.use_thumbnail + self.model.eval() + self.model.tie_weights() + self.truncation = truncation + self.batch_size_per_gpu = int(batch_size) + self.conv_template = conv_template + self.use_cache = use_cache + self.truncate_context = truncate_context + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + # If you want to use DistributedType.DEEPSPEED, you have to run accelerate config before using the model + # Also, you have to select zero stage 0 (equivalent to DDP) in order to make the prepare model works + # I tried to set different parameters in the kwargs to let default zero 2 stage works, but it didn't work. + if accelerator.distributed_type == DistributedType.DEEPSPEED: + kwargs = { + "train_micro_batch_size_per_gpu": self.batch_size_per_gpu, + "train_batch_size": self.batch_size_per_gpu * accelerator.num_processes, + } + AcceleratorState().deepspeed_plugin.deepspeed_config_process(must_match=True, **kwargs) + eval_logger.info("Detected that you are using DistributedType.DEEPSPEED. Make sure you run `accelerate config` and set zero stage to 0") + + if accelerator.distributed_type == DistributedType.FSDP or accelerator.distributed_type == DistributedType.DEEPSPEED: + self._model = accelerator.prepare(self.model) + else: + self._model = accelerator.prepare_model(self.model, evaluation_mode=True) + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + elif accelerator.num_processes == 1 and device_map == "auto": + eval_logger.info(f"Using {accelerator.num_processes} devices with tensor parallelism") + self._rank = 0 + self._word_size = 1 + else: + eval_logger.info(f"Using single device: {self._device}") + self.model.to(self._device) + self._rank = 0 + self._world_size = 1 + + # from internvl model + + self.image_size = config.force_image_size or config.vision_config.image_size + + def wrap_backbone_lora(self, r=128, lora_alpha=256, lora_dropout=0.05): + lora_config = LoraConfig( + r=r, + target_modules=["attn.qkv", "attn.proj", "mlp.fc1", "mlp.fc2"], + lora_alpha=lora_alpha, + lora_dropout=lora_dropout, + ) + self.vision_model = get_peft_model(self.vision_model, lora_config) + self.vision_model.print_trainable_parameters() + + def wrap_llm_lora(self, r=128, lora_alpha=256, lora_dropout=0.05): + lora_config = LoraConfig( + r=r, target_modules=["self_attn.q_proj", "self_attn.k_proj", "self_attn.v_proj", "self_attn.o_proj", "mlp.gate_proj", "mlp.down_proj", "mlp.up_proj"], lora_alpha=lora_alpha, lora_dropout=lora_dropout, task_type="CAUSAL_LM" + ) + self.language_model = get_peft_model(self.language_model, lora_config) + self.language_model.enable_input_require_grads() + self.language_model.print_trainable_parameters() + + def pixel_shuffle(self, x, scale_factor=0.5): + n, w, h, c = x.size() + # N, W, H, C --> N, W, H * scale, C // scale + x = x.view(n, w, int(h * scale_factor), int(c / scale_factor)) + # N, W, H * scale, C // scale --> N, H * scale, W, C // scale + x = x.permute(0, 2, 1, 3).contiguous() + # N, H * scale, W, C // scale --> N, H * scale, W * scale, C // (scale ** 2) + x = x.view(n, int(h * scale_factor), int(w * scale_factor), int(c / (scale_factor * scale_factor))) + if self.ps_version == "v1": + warnings.warn("In ps_version 'v1', the height and width have not been swapped back, " "which results in a transposed image.") + else: + x = x.permute(0, 2, 1, 3).contiguous() + return x + + def noised_embed(self, vit_embeds, noise_alpha=5): + dims = torch.tensor(vit_embeds.size(1) * vit_embeds.size(2)) + mag_norm = noise_alpha / torch.sqrt(dims) + noise = torch.zeros_like(vit_embeds).uniform_(-mag_norm, mag_norm) + return vit_embeds + noise + + def extract_feature(self, pixel_values): + if self.select_layer == -1: + vit_embeds = self.vision_model(pixel_values=pixel_values, output_hidden_states=False, return_dict=True).last_hidden_state + else: + vit_embeds = self.vision_model(pixel_values=pixel_values, output_hidden_states=True, return_dict=True).hidden_states[self.select_layer] + vit_embeds = vit_embeds[:, 1:, :] + + if self.training and self.neftune_alpha is not None: + vit_embeds = self.noised_embed(vit_embeds, self.neftune_alpha) + + h = w = int(vit_embeds.shape[1] ** 0.5) + vit_embeds = vit_embeds.reshape(vit_embeds.shape[0], h, w, -1) + vit_embeds = self.pixel_shuffle(vit_embeds, scale_factor=self.downsample_ratio) + vit_embeds = vit_embeds.reshape(vit_embeds.shape[0], -1, vit_embeds.shape[-1]) + vit_embeds = self.mlp1(vit_embeds) # .to(pixel_values.device) + return vit_embeds + + def multi_image_chat(self, tokenizer, pixel_values, image_counts, question, generation_config, history=None, return_history=False, IMG_START_TOKEN="", IMG_END_TOKEN="", IMG_CONTEXT_TOKEN=""): + img_context_token_id = tokenizer.convert_tokens_to_ids(IMG_CONTEXT_TOKEN) + self.img_context_token_id = img_context_token_id + if tokenizer.convert_tokens_to_ids("<|im_end|>") != 0: + eos_token_id = tokenizer.convert_tokens_to_ids("<|im_end|>") # 92542, InternLM2 + else: + eos_token_id = tokenizer.eos_token_id + + from internvl.conversation import get_conv_template + + template = get_conv_template(self.template) + + if history is None: + history = [] + image_tokens = "" + image_bs = pixel_values.shape[0] + # print(f"dynamic ViT batch size: {image_bs}, image_counts: {image_counts}") + for idx, image_count in enumerate(image_counts): + image_tokens += f" (图{idx+1}):" + IMG_START_TOKEN + IMG_CONTEXT_TOKEN * self.num_image_token * image_count + IMG_END_TOKEN + question = image_tokens + "\n" + question + else: + for old_question, old_answer in history: + template.append_message(template.roles[0], old_question) + template.append_message(template.roles[1], old_answer) + template.append_message(template.roles[0], question) + template.append_message(template.roles[1], None) + query = template.get_prompt() + model_inputs = tokenizer(query, return_tensors="pt") + input_ids = model_inputs["input_ids"].cuda() + attention_mask = model_inputs["attention_mask"].cuda() + generation_config["eos_token_id"] = eos_token_id + + generation_output = self.generate(pixel_values=pixel_values, input_ids=input_ids, attention_mask=attention_mask, **generation_config) + response = tokenizer.batch_decode(generation_output, skip_special_tokens=True)[0] + response = response.split("<|im_end|>")[0].strip() # for InternLM2 + history.append((question, response)) + if return_history: + return response, history + else: + query_to_print = query.replace(image_tokens, "") + # print(query_to_print, response) + return response + return response + + @property + def tokenizer(self): + return self._tokenizer + + @property + def model(self): + # returns the model, unwrapping it if using Accelerate + if hasattr(self, "accelerator"): + return self.accelerator.unwrap_model(self._model) + else: + return self._model + + @property + def batch_size(self): + return self.batch_size_per_gpu + + @property + def device(self): + return self._device + + @property + def rank(self): + return self._rank + + @property + def world_size(self): + return self._world_size + + def tok_encode(self, string: str, left_truncate_len=None, add_special_tokens=None) -> List[int]: + """ """ + add_special_tokens = False if add_special_tokens is None else add_special_tokens + encoding = self.tokenizer.encode(string, add_special_tokens=add_special_tokens) + # left-truncate the encoded context to be at most `left_truncate_len` tokens long + if left_truncate_len: + encoding = encoding[-left_truncate_len:] + return encoding + + def tok_decode(self, tokens): + try: + return self.tokenizer.decode(tokens) + except: + return self.tokenizer.decode([tokens]) + + def post_processing(self, response): + response = response.replace("\n", "").replace("不是", "No").replace("是", "Yes").replace("否", "No") + response = response.lower().replace("true", "yes").replace("false", "no") + pattern = re.compile(r"[\u4e00-\u9fa5]") + response = re.sub(pattern, "", response) + return response + + @torch.no_grad() + def generate( + self, + pixel_values: Optional[torch.FloatTensor] = None, + input_ids: Optional[torch.FloatTensor] = None, + attention_mask: Optional[torch.LongTensor] = None, + visual_features: Optional[torch.FloatTensor] = None, + generation_config: Optional[GenerationConfig] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + **generate_kwargs, + ) -> torch.LongTensor: + assert self.img_context_token_id is not None + if pixel_values is not None: + if visual_features is not None: + vit_embeds = visual_features + else: + vit_embeds = self.extract_feature(pixel_values) + + input_embeds = self.language_model.get_input_embeddings()(input_ids) + B, N, C = input_embeds.shape + input_embeds = input_embeds.reshape(B * N, C) + + input_ids = input_ids.reshape(B * N) + selected = input_ids == self.img_context_token_id + assert selected.sum() != 0 + input_embeds[selected] = vit_embeds.reshape(-1, C).to(input_embeds.device) + + input_embeds = input_embeds.reshape(B, N, C) + else: + input_embeds = self.language_model.get_input_embeddings()(input_ids) + + outputs = self.language_model.generate( + inputs_embeds=input_embeds, + attention_mask=attention_mask, + generation_config=generation_config, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + use_cache=True, + **generate_kwargs, + ) + + return outputs + + def flatten(self, input): + new_list = [] + for i in input: + for j in i: + new_list.append(j) + return new_list + + def load_image(self, flattened_visuals, input_size=224): + assert flattened_visuals[0].mode == "RGB" + image = flattened_visuals[0].convert("RGB") + transform = build_transform(is_train=False, input_size=input_size) + if self.dynamic: + images = dynamic_preprocess(image, image_size=input_size, use_thumbnail=self.use_thumbnail, max_num=self.max_num) + else: + images = [image] + pixel_values = [transform(image) for image in images] + pixel_values = torch.stack(pixel_values) + return pixel_values + + def generate_until(self, requests: List[Instance]) -> List[str]: + res = [] + + def _collate(x): + # the negative sign on len(toks) sorts descending - this has a few advantages: + # - time estimates will always be over not underestimates, which is more useful for planning + # - to know the size of a batch when going through the list, you know the first one is always the batch + # padded context length. this is useful to simplify the batching logic and more importantly to make + # automatic adaptive batches much much easier to implement + # - any OOMs will happen right away rather than near the end + toks = self.tok_encode(x[0]) + return -len(toks), x[0] + + # we group requests by their generation_kwargs, + # so that we don't try to execute e.g. greedy sampling and temp=0.8 sampling + # in the same batch. + re_ords = utils.Collator([reg.args for reg in requests], _collate, grouping=True) + chunks = re_ords.get_batched(n=self.batch_size, batch_fn=None) + num_iters = len(requests) // self.batch_size if len(requests) % self.batch_size == 0 else len(requests) // self.batch_size + 1 + pbar = tqdm(total=num_iters, disable=(self.rank != 0), desc="Model Responding") + for chunk in chunks: + contexts, all_gen_kwargs, doc_to_visual, doc_id, task, split = zip(*chunk) + task = task[0] + split = split[0] + batched_visuals = [doc_to_visual[0](self.task_dict[task][split][ids]) for ids in doc_id] # [B, N] + flattened_visuals = self.flatten(batched_visuals) + pixel_values = self.load_image(flattened_visuals, self.image_size).cuda().to(torch.bfloat16) + gen_kwargs = all_gen_kwargs[0] + + generation_config = dict( + do_sample=False, + top_k=50, + top_p=0.9, + num_beams=5, + max_new_tokens=20, + eos_token_id=self.tokenizer.eos_token_id, + ) + question = contexts[0] + response = self.model.chat(tokenizer=self.tokenizer, pixel_values=pixel_values, question=question, generation_config=generation_config) + # TODO(choiszt) try batch_chat for multiple inputs + response = self.post_processing(response) + res.append(response) + self.cache_hook.add_partial("generate_until", (question, gen_kwargs), response) + pbar.update(1) + res = re_ords.get_original(res) + return res + # print(chunk) + + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + pass diff --git a/lmms_eval/tasks/__init__.py b/lmms_eval/tasks/__init__.py index e9192eb32..0679eae32 100755 --- a/lmms_eval/tasks/__init__.py +++ b/lmms_eval/tasks/__init__.py @@ -73,6 +73,8 @@ def include_task_folder(task_dir: str, register_task: bool = True) -> None: for f in file_list: # if "detail" in f: # import pdb;pdb.set_trace() + # if "vatex" in f: + # print("a") if f.endswith(".yaml"): yaml_path = os.path.join(root, f) try: diff --git a/lmms_eval/tasks/vatex/_default_template_yaml b/lmms_eval/tasks/vatex/_default_template_yaml new file mode 100755 index 000000000..2e54b9bca --- /dev/null +++ b/lmms_eval/tasks/vatex/_default_template_yaml @@ -0,0 +1,5 @@ +dataset_kwargs: + token:True + # video: False #skip download video from hf + # cache_dir: vatex + From_YouTube: True diff --git a/lmms_eval/tasks/vatex/_vatex.yaml b/lmms_eval/tasks/vatex/_vatex.yaml new file mode 100755 index 000000000..8dce45790 --- /dev/null +++ b/lmms_eval/tasks/vatex/_vatex.yaml @@ -0,0 +1,4 @@ +group : vatex +task: +- vatex_val_zh +- vatex_test \ No newline at end of file diff --git a/lmms_eval/tasks/vatex/utils.py b/lmms_eval/tasks/vatex/utils.py new file mode 100755 index 000000000..c9ebe5c37 --- /dev/null +++ b/lmms_eval/tasks/vatex/utils.py @@ -0,0 +1,221 @@ +import os +import json +from pycocoevalcap.eval import COCOEvalCap, Bleu, Meteor, Rouge, Cider, Spice +from pycocoevalcap.tokenizer.ptbtokenizer import PTBTokenizer +from pycocotools.coco import COCO +from lmms_eval.tasks._task_utils.file_utils import generate_submission_file +from pathlib import Path +import logging +import yaml +import sys +eval_logger = logging.getLogger("lmms-eval") + +dir_name = os.path.dirname(os.path.abspath(__file__)) + +VATEX_METRICS = ["Bleu_4", "Bleu_3", "Bleu_2", "Bleu_1", "METEOR", "ROUGE_L", "CIDEr"] # , "SPICE"] + +with open(Path(__file__).parent / "_default_template_yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + # remove function definition since yaml load cannot handle it + if "!function" not in line: + safe_data.append(line) + + config = yaml.safe_load("".join(safe_data)) + +hf_home = os.getenv("HF_HOME", "~/.cache/huggingface/") +# cache_dir = os.path.join(hf_home, cache_dir) +# base_cache_dir = config["dataset_kwargs"]["cache_dir"] +base_cache_dir=os.path.expanduser(hf_home) + + +def vatex_ZH_doc_to_visual(doc): + with open(Path(__file__).parent / "vatex_val_zh.yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + # remove function definition since yaml load cannot handle it + if "!function" not in line: + safe_data.append(line) + taskname= yaml.safe_load("".join(safe_data))['task'] + cache_dir=os.path.join(base_cache_dir,taskname) + video_path = doc["videoID"] + ".mp4" + video_path = os.path.join(cache_dir, video_path) + if os.path.exists(video_path): + video_path = video_path + elif os.path.exists(video_path.replace("mp4", "MP4")): + video_path = video_path.replace("mp4", "MP4") + elif os.path.exists(video_path.replace("mp4", "mkv")): + video_path = video_path.replace("mp4", "mkv") + else: + sys.exit(f"video path:{video_path} does not exist, please check") + return [video_path] + + +def vatex_test_doc_to_visual(doc): + with open(Path(__file__).parent / "vatex_test.yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + # remove function definition since yaml load cannot handle it + if "!function" not in line: + safe_data.append(line) + taskname= yaml.safe_load("".join(safe_data))['task'] + cache_dir=os.path.join(base_cache_dir,taskname) + video_path = doc["videoID"] + ".mp4" + video_path = os.path.join(cache_dir, video_path) + if os.path.exists(video_path): + video_path = video_path + elif os.path.exists(video_path.replace("mp4", "MP4")): + video_path = video_path.replace("mp4", "MP4") + elif os.path.exists(video_path.replace("mp4", "mkv")): + video_path = video_path.replace("mp4", "mkv") + else: + sys.exit(f"video path:{video_path} does not exist, please check") + return [video_path] + + +def vatex_doc_to_text(doc, model_specific_prompt_kwargs=None): + return model_specific_prompt_kwargs["prompt"] + +def vatex_process_result(doc, result): + """ + Args: + doc: a instance of the eval dataset + results: [pred] + Returns: + a dictionary with key: metric name, value: metric value + """ + pred = result[0] if len(result) > 0 else "" + + data_dict = {"answer": doc["enCap"], "pred": pred, "video_id": doc["videoID"]} + + return {f"vatex_{metric}": data_dict for metric in VATEX_METRICS} + +def vatex_process_CN_result(doc, result): + """ + Args: + doc: a instance of the eval dataset + results: [pred] + Returns: + a dictionary with key: metric name, value: metric value + """ + pred = result[0] if len(result) > 0 else "" + + data_dict = {"answer": doc["chCap"], "pred": pred, "video_id": doc["videoID"]} + + return {f"vatex_{metric}": data_dict for metric in VATEX_METRICS} + + +def vatex_aggregation_result(results, metric, args=None): + scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")] # , (Spice(), "SPICE")] + scorers_dict = {s[1]: s for s in scorers} + + stored_results = [] + # In order to make the coco eval tools to successfully create index + # We need at least two dict in the dataset + # 'annotation' and 'images' + # 'annotation' exactly reproduce the original annotation + # 'images' however only need the image id which is contained in the file name + dataset = {"annotations": [], "images": []} + idx = 0 + for result in results: + stored_results.append({"image_id": result["video_id"], "caption": result["pred"]}) + for a in result["answer"]: + dataset["annotations"].append({"image_id": result["video_id"], "caption": a, "id": idx}) + idx += 1 + dataset["images"].append({"id": result["video_id"]}) + + coco = COCO() + # Manually create index here + coco.dataset = dataset + coco.createIndex() + + vatex_result = coco.loadRes(stored_results) + vatex_eval = COCOEvalCap(coco, vatex_result) + + imgIds = vatex_eval.params["image_id"] + gts = {} + res = {} + for imgId in imgIds: + gts[imgId] = vatex_eval.coco.imgToAnns[imgId] + res[imgId] = vatex_eval.cocoRes.imgToAnns[imgId] + + eval_logger.info("tokenization...") + tokenizer = PTBTokenizer() + gts = tokenizer.tokenize(gts) + res = tokenizer.tokenize(res) + + eval_logger.info(f"Computing {metric} scores...") + + score, scores = scorers_dict[metric][0].compute_score(gts, res) + # When metric is one of the Bleu, score will be a list + if type(score) == list: + n = int(metric.split("_")[-1]) + score = score[n - 1] + + path = generate_submission_file("vatex_captions_val_results.json", args) + + with open(path, "w") as f: + json.dump(stored_results, f, indent=4) + + eval_logger.info(f"Results saved to {path}") + + return score + + +def vatex_bleu4(results, args=None): + return vatex_aggregation_result(results, "Bleu_4", args) + + +def vatex_bleu3(results, args=None): + return vatex_aggregation_result(results, "Bleu_3", args) + + +def vatex_bleu2(results, args=None): + return vatex_aggregation_result(results, "Bleu_2", args) + + +def vatex_bleu1(results, args=None): + return vatex_aggregation_result(results, "Bleu_1", args) + + +def vatex_meteor(results, args=None): + return vatex_aggregation_result(results, "METEOR", args) + + +def vatex_rougel(results, args=None): + return vatex_aggregation_result(results, "ROUGE_L", args) + + +def vatex_cider(results, args=None): + return vatex_aggregation_result(results, "CIDEr", args) + + +def vatex_spice(results, args=None): + return vatex_aggregation_result(results, "SPICE", args) + + +def vatex_test_process_result(doc, result): + """ + Args: + doc: a instance of the eval dataset + results: [pred] + Returns: + a dictionary with key: metric name (in this case vatex_passthrough), value: metric value + """ + return {"vatex_passthrough": {"pred": result, "image_id": doc["image_id"]}} + + +def vatex_test_aggregation_result(results, args): + stored_results = [] + for result in results: + stored_results.append({"image_id": result["image_id"], "caption": result["pred"]}) + + path = generate_submission_file("vatex_captions_test2014_alg_results.json", args) + eval_logger.info("Storing prediction that can be submitted to the server ...") + with open(path, "w") as f: + json.dump(stored_results, f, indent=4) + + eval_logger.info(f"Your test result has been stored into {path}. Make sure you also have the val result stored to submit to the server on https://codalab.lisn.upsaclay.fr/competitions/7404#participate.") diff --git a/lmms_eval/tasks/vatex/vatex_test.yaml b/lmms_eval/tasks/vatex/vatex_test.yaml new file mode 100644 index 000000000..8e1e9f471 --- /dev/null +++ b/lmms_eval/tasks/vatex/vatex_test.yaml @@ -0,0 +1,35 @@ +dataset_path: lmms-lab/vatex_from_url +dataset_name: vatex_test +task: vatex_test +test_split: test +output_type: generate_until +doc_to_visual: !function utils.vatex_test_doc_to_visual +doc_to_text: !function utils.vatex_doc_to_text +doc_to_target: "answer" +model_specific_prompt_kwargs: + default: + prompt: Provide a one-sentence caption for the provided Video. +generation_kwargs: + max_new_tokens: 64 + temperature: 0 + top_p: 1.0 + num_beams: 1 + do_sample: false +process_results: !function utils.vatex_process_result +# Note that the metric name can be either a registed metric function (such as the case for GQA) or a key name returned by process_results +metric_list: + - metric: vatex_Bleu_4 + aggregation : !function utils.vatex_bleu4 + higher_is_better : true + - metric: vatex_METEOR + aggregation : !function utils.vatex_meteor + higher_is_better : true + - metric: vatex_ROUGE_L + aggregation : !function utils.vatex_rougel + higher_is_better : true + - metric: vatex_CIDEr + aggregation : !function utils.vatex_cider + higher_is_better : true +metadata: + - version: 0.0 +include: _default_template_yaml \ No newline at end of file diff --git a/lmms_eval/tasks/vatex/vatex_val_ZH.yaml b/lmms_eval/tasks/vatex/vatex_val_ZH.yaml new file mode 100755 index 000000000..643059354 --- /dev/null +++ b/lmms_eval/tasks/vatex/vatex_val_ZH.yaml @@ -0,0 +1,35 @@ +dataset_path: lmms-lab/vatex_from_url +dataset_name: vatex_val_zh +task: vatex_val_zh +test_split: validation +output_type: generate_until +doc_to_visual: !function utils.vatex_ZH_doc_to_visual +doc_to_text: !function utils.vatex_doc_to_text +doc_to_target: "answer" +generation_kwargs: + max_new_tokens: 64 + temperature: 0 + top_p: 1.0 + num_beams: 1 + do_sample: false +model_specific_prompt_kwargs: + default: + prompt: 请为提供的视频提供一句话简短的字幕。 +process_results: !function utils.vatex_process_CN_result +# Note that the metric name can be either a registed metric function (such as the case for GQA) or a key name returned by process_results +metric_list: + - metric: vatex_Bleu_4 + aggregation : !function utils.vatex_bleu4 + higher_is_better : true + - metric: vatex_METEOR + aggregation : !function utils.vatex_meteor + higher_is_better : true + - metric: vatex_ROUGE_L + aggregation : !function utils.vatex_rougel + higher_is_better : true + - metric: vatex_CIDEr + aggregation : !function utils.vatex_cider + higher_is_better : true +metadata: + - version: 0.0 +include: _default_template_yaml \ No newline at end of file diff --git a/setup.py b/setup.py index dbe4675d0..159f778ab 100755 --- a/setup.py +++ b/setup.py @@ -1,4 +1,3 @@ import setuptools - # This is to make sure that the package supports editable installs setuptools.setup() diff --git a/tools/make_vatex.py b/tools/make_vatex.py new file mode 100644 index 000000000..681c3a81e --- /dev/null +++ b/tools/make_vatex.py @@ -0,0 +1,25 @@ + +from datasets import load_dataset,Dataset +import json +with open("data/vatex_public_test_english_v1.1.json", "r") as f: + data = json.load(f) + +vatex_dataset=Dataset.from_list(data) +# vatex_dataset.rename_columns({ +# 'videoID': 'video_name', +# 'enCap': 'caption' +# }) #if change name is needed +hub_dataset_path = "lmms-lab/vatex_from_url" +vatex_dataset.push_to_hub(repo_id=hub_dataset_path,split="test", config_name = "vatex_test",token="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") + + +with open("data/vatex_validation_v1.0.json", "r") as f: + data = json.load(f) + +vatex_dataset=Dataset.from_list(data) +# vatex_dataset.rename_columns({ +# 'videoID': 'video_name', +# 'enCap': 'caption' +# }) #if change name is needed +hub_dataset_path = "lmms-lab/vatex_from_url" +vatex_dataset.push_to_hub(repo_id=hub_dataset_path,split="validation", config_name = "vatex_val_zh",token="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") \ No newline at end of file diff --git a/tools/makecvrr.ipynb b/tools/makecvrr.ipynb new file mode 100644 index 000000000..0a06894c9 --- /dev/null +++ b/tools/makecvrr.ipynb @@ -0,0 +1,663 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [], + "source": [ + "# This notebook will guide you to make correct format of Huggingface dataset, in proper parquet format and visualizable in Huggingface dataset hub.\n", + "# We will take the example of the dataset \"Otter-AI/MMVet\" and convert it to the proper format." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/mnt/sfs-common/krhu/miniconda3/envs/lmms_eval/lib/python3.9/site-packages/datasets/load.py:922: FutureWarning: The repository for build_cvrr contains custom code which must be executed to correctly load the dataset. You can inspect the repository content at /mnt/sfs-common/krhu/lmms-eval-internal/build_cvrr.py\n", + "You can avoid this message in future by passing the argument `trust_remote_code=True`.\n", + "Passing `trust_remote_code=True` will be mandatory to load this dataset from the next major release of `datasets`.\n", + " warnings.warn(\n", + "Repo card metadata block was not found. Setting CardData to empty.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating test split: 152 examples [00:00, 9291.47 examples/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'time_order_understanding': {'0': {'Q': 'Does the video depict a person performing an activity in the conventional direction along the track?', 'A': 'No, the person is running backwards, which challenges the common expectation of direction in track running activities.', 'DimensionName': 'Time order understanding', 'VideoID': '204.mp4'}, '1': {'Q': 'What is happening in the video?', 'A': 'The video features a person in a blue running outfit and sunglasses running backward on an athletics track. The footage is fast-forwarded, highlighting the continuous backward running, with a backdrop of a football stadium, hurdles, and tiered stands.', 'DimensionName': 'Time order understanding', 'VideoID': '204.mp4'}, '2': {'Q': \"Is the person's gear more suitable for indoor activities or outdoor sports?\", 'A': \"The person's gear, consisting of a blue running kit and black sunglasses, is more suitable for outdoor activities, indicating the appropriateness of the attire for the context of an athletics track.\", 'DimensionName': 'Time order understanding', 'VideoID': '204.mp4'}, '3': {'Q': 'Is the person running towards the camera or running in the direction away from the camera?', 'A': 'The person is running away from the camera by running backwards on the race track.', 'DimensionName': 'Time order understanding', 'VideoID': '204.mp4'}, '4': {'Q': 'Is the person running in clockwise direction or anticlockwise direction on the race track?', 'A': 'The person is running in anticlockwise direction in the video.', 'DimensionName': 'Time order understanding', 'VideoID': '204.mp4'}, '5': {'Q': 'Does the person drink anything in the video while running?', 'A': 'No, the person is not shown to be drinking anything in the video while performing the running activity.', 'DimensionName': 'Time order understanding', 'VideoID': '204.mp4'}, '6': {'Q': 'Is the video capturing an event happening indoors or outdoors?', 'A': 'The video captures an outdoor event, suggested by the outdoor athletics track setting, the attire of the person, and the visibility of the football stadium and tiered stands.', 'DimensionName': 'Time order understanding', 'VideoID': '204.mp4'}, '7': {'Q': 'What object is initially focused at the start of the video?', 'A': \"The video starts with a close-up of a small orange flower being held by a person's hand.\", 'DimensionName': 'Time order understanding', 'VideoID': '205.webm'}, '8': {'Q': 'Is the flower brought closer to or moved further away from the camera as the video progresses?', 'A': 'The flower is moved further away from the camera as the video progresses.', 'DimensionName': 'Time order understanding', 'VideoID': '205.webm'}, '9': {'Q': 'Describe the motion of the hand holding the flower throughout the video.', 'A': 'The hand holding the flower shows a continuous movement away from the camera, resulting in the flower appearing smaller.', 'DimensionName': 'Time order understanding', 'VideoID': '205.webm'}, '10': {'Q': 'By the end of the video, has the size of the flower in the frame increased, decreased, or remained the same?', 'A': 'By the end of the video, the size of the flower in the frame has decreased.', 'DimensionName': 'Time order understanding', 'VideoID': '205.webm'}, '11': {'Q': 'What action is performed with the flower in relation to the camera?', 'A': 'The action performed with the flower is presenting it to the camera before gradually moving it away.', 'DimensionName': 'Time order understanding', 'VideoID': '205.webm'}, '12': {'Q': 'At the midpoint of the video, would the flower appear larger, smaller, or the same size as it did at the beginning?', 'A': 'At the midpoint of the video, the flower would appear smaller than it did at the beginning because it is continually moved away from the camera.', 'DimensionName': 'Time order understanding', 'VideoID': '205.webm'}, '13': {'Q': 'What is the direction of the movement of the flower in the video in relation to the camera?', 'A': 'The flower is being moved away/ backwards from the camera as the video progresses.', 'DimensionName': 'Time order understanding', 'VideoID': '205.webm'}, '14': {'Q': \"Does the object move towards the hand's initial position or away from it as the action progresses?\", 'A': \"The object moves away from the hand's initial position, indicating the hand initiates the motion and pushes the object to a new location rather than pulling it towards itself.\", 'DimensionName': 'Time order understanding', 'VideoID': '206.mp4'}, '15': {'Q': \"Identify the final resting position of the snack packet relative to its starting point. Was it closer to the hand's entry point or further away?\", 'A': \"The snack packet ends up further away from the hand's entry point, revealing that the action involved pushing the snack across the surface away from where the hand first appeared.\", 'DimensionName': 'Time order understanding', 'VideoID': '206.mp4'}, '16': {'Q': 'From the observed action, deduce whether the movement of the object was linear or if it changed directions mid-way.', 'A': 'The movement was linear, as the object moved from one side to the other without any indication of changing directions, showcasing a straightforward push action.', 'DimensionName': 'Time order understanding', 'VideoID': '206.mp4'}, '17': {'Q': \"Can the sequence of the snack's movement be described as starting from the left going to the right, based on the hand's interaction?\", 'A': \"No, the sequence begins on the right and moves to the left, as indicated by the hand's action pushing the snack across the table, contrary to the suggested direction.\", 'DimensionName': 'Time order understanding', 'VideoID': '206.mp4'}, '18': {'Q': 'Is there evidence of the hand pulling the object closer to its initial point of entry into the frame?', 'A': 'No, there is no evidence of a pulling action. The hand moves the object away from its initial point of entry, consistent with a pushing motion.', 'DimensionName': 'Time order understanding', 'VideoID': '206.mp4'}, '19': {'Q': \"Based on the directional movement observed, was the hand's action more indicative of pulling or pushing the snack across the surface?\", 'A': \"The hand's action was more indicative of pushing the snack across the surface, as it moved the object from one side to the other with a push, rather than pulling it with continuous contact.\", 'DimensionName': 'Time order understanding', 'VideoID': '206.mp4'}, '20': {'Q': 'What is the primary action depicted in the video involving a red soft-drink can?', 'A': 'The primary action is pouring water into the can.', 'DimensionName': 'Time order understanding', 'VideoID': '207.webm'}, '21': {'Q': 'Is someone drinking a soft-drink can in the video?', 'A': 'No, the video does not show the drinking activity. The video focuses on the action of pouring water into the red soda can.', 'DimensionName': 'Time order understanding', 'VideoID': '207.webm'}, '22': {'Q': 'Is the video showing the activity of taking out liquid from the soda can?', 'A': 'No, the video does not show the activity of taking out the liquid from the soda can. The video shows water being poured into the soda can.', 'DimensionName': 'Time order understanding', 'VideoID': '207.webm'}, '23': {'Q': 'Is the liquid taken out of the soda can or is it poured into the soda can?', 'A': 'The liquid is poured into the soda can. ', 'DimensionName': 'Time order understanding', 'VideoID': '207.webm'}, '24': {'Q': 'What is happening in the video?', 'A': 'In the video, water is shown being poured into the red soda can. The main action in the video is the process of pouring water into the can..', 'DimensionName': 'Time order understanding', 'VideoID': '207.webm'}, '25': {'Q': 'Is someone taking out a drink from the soda can in the video?', 'A': 'No, the video shows the activity of pouring water into the soda can, not taking it out.', 'DimensionName': 'Time order understanding', 'VideoID': '207.webm'}, '26': {'Q': 'Is there any indication of the can being moved from its resting place on the wooden floor during the pouring action?', 'A': 'There is no depiction of the can being moved; the focus remains on pouring water into the can that is resting on the wooden floor. This implies the can remain stationary throughout the depicted action.', 'DimensionName': 'Time order understanding', 'VideoID': '207.webm'}, '27': {'Q': 'What is happening in the video?', 'A': 'The video starts with a close-up of a small plant pot on a wooden floor. As it progresses, a hand enters the frame and it pulls the plant pot toward the camera, causing a zoom effect.', 'DimensionName': 'Time order understanding', 'VideoID': '208.webm'}, '28': {'Q': 'Is the hand initially holding the plant pot or does it enter the frame without holding anything?', 'A': 'The hand enters the frame without holding anything, afterwards the hand holds the plant pot and pulls it towards the camera.', 'DimensionName': 'Time order understanding', 'VideoID': '208.webm'}, '29': {'Q': 'Does the plant pot move away from the camera or towards the camera when pulled?', 'A': 'The plant pot moves toward the camera when pulled.', 'DimensionName': 'Time order understanding', 'VideoID': '208.webm'}, '30': {'Q': 'Is the zoom effect caused by the camera moving closer to the plant pot or by the plant pot moving closer to the camera?', 'A': 'The zoom effect is caused by the plant pot moving closer to the camera.', 'DimensionName': 'Time order understanding', 'VideoID': '208.webm'}, '31': {'Q': 'Does the video showcase multiple plant pots being interacted with or just a single plant pot?', 'A': 'The video showcases just a single plant pot being interacted with.', 'DimensionName': 'Time order understanding', 'VideoID': '208.webm'}, '32': {'Q': 'At the end of the video, will the pot plant look smaller or bigger in the frame due to the moving action?', 'A': 'As the pot plant is moved towards the camera, it will look bigger towards the end of the video.', 'DimensionName': 'Time order understanding', 'VideoID': '208.webm'}, '33': {'Q': 'By the end of the video, has the plant pot moved a significant distance or remained relatively in the same place from where it started?', 'A': 'By the end of the video, the plant pot has moved a significant distance towards the camera.', 'DimensionName': 'Time order understanding', 'VideoID': '208.webm'}, '34': {'Q': 'What object is moved across the table?', 'A': 'A glass bottle is moved across the table.', 'DimensionName': 'Time order understanding', 'VideoID': '209.webm'}, '35': {'Q': \"Is the direction of the bottle's movement from right to left or from left to right?\", 'A': \"The direction of the bottle's movement is from left to right.\", 'DimensionName': 'Time order understanding', 'VideoID': '209.webm'}, '36': {'Q': 'Before being pushed, where is the glass bottle situated, towards the left side or the right side?', 'A': 'The glass bottle is situated on a wooden table on the left side.', 'DimensionName': 'Time order understanding', 'VideoID': '209.webm'}, '37': {'Q': 'Identify the action performed by the person in the video.', 'A': 'The person performs the action of pushing a glass bottle from left towards the right. This action is the central focus of the video, showcasing the interaction between the person and the object.', 'DimensionName': 'Time order understanding', 'VideoID': '209.webm'}, '38': {'Q': 'What is happening in the video?', 'A': 'The video begins with a glass bottle resting on a wooden table among other items such as boxes. Subsequently, a person pushes the bottle from the left side towards the right, and this is the sole action captured in the video.', 'DimensionName': 'Time order understanding', 'VideoID': '209.webm'}, '39': {'Q': 'In which direction, the person is pushing the bottle in the video?', 'A': 'The person is pushing the bottle towards the right direction in the video.', 'DimensionName': 'Time order understanding', 'VideoID': '209.webm'}, '40': {'Q': 'Does the video showcase multiple actions involving the bottle or a single action?', 'A': \"The video showcases a single action involving the bottle: it being pushed from left side to right. This answer clarifies the simplicity of the video's content regarding the action performed.\", 'DimensionName': 'Time order understanding', 'VideoID': '209.webm'}, '41': {'Q': 'What is the primary fine-grained action shown in the video?', 'A': 'The primary fine-grained action shown in the video is the person pushing the glass bottle from the left side towards the right on the wooden table.', 'DimensionName': 'Time order understanding', 'VideoID': '209.webm'}, '42': {'Q': 'What is the first object that the person interacts within the video?', 'A': 'The first object interacted with is the wooden drawer, as the person opens it to retrieve an item inside.', 'DimensionName': 'Time order understanding', 'VideoID': '210.webm'}, '43': {'Q': 'What is the primary action being performed in the video?', 'A': \"The video shows a person's hand used to open a wooden drawer in order to take out a dark rounded wooden box.\", 'DimensionName': 'Time order understanding', 'VideoID': '210.webm'}, '44': {'Q': 'Does the person place anything into the drawer at any point in the video?', 'A': 'No, the person does not place anything into the drawer; the primary action involves taking an item out.', 'DimensionName': 'Time order understanding', 'VideoID': '210.webm'}, '45': {'Q': \"Is the primary function of the person's interaction with the drawer to organize its contents?\", 'A': \"No, the primary function is not to organize the drawer's contents but to retrieve a dark rounded wooden box from it.\", 'DimensionName': 'Time order understanding', 'VideoID': '210.webm'}, '46': {'Q': 'What is happening in the video?', 'A': \"The video shows a person's hand appearing and then it opens a drawer to take out a dark rounded wooden box from it. The primary action in the video is the process of retrieving the box from the drawer..\", 'DimensionName': 'Time order understanding', 'VideoID': '210.webm'}, '47': {'Q': 'Describe how the person is placing the dark rounded wooden box into the wooden drawer?', 'A': 'The person is not placing the dark rounded wooden box. Instead, he is taking out the wooden box from the drawer.', 'DimensionName': 'Time order understanding', 'VideoID': '210.webm'}, '48': {'Q': 'Is the action of opening the drawer followed by immediately closing it, or is there an intermediate step involving another object?', 'A': 'There is an intermediate step involving another object; after opening the drawer, a dark rounded wooden box is retrieved before any potential closing action.', 'DimensionName': 'Time order understanding', 'VideoID': '210.webm'}, '49': {'Q': 'Is the person placing a dark rounded wooden box inside the drawer?', 'A': 'No, the person is retrieving a dark rounded wooden box from the drawer instead of placing it.', 'DimensionName': 'Time order understanding', 'VideoID': '210.webm'}, '50': {'Q': 'Is the person placing a dark rounded wooden box inside the drawer or retrieving the wooden box from the drawer?', 'A': 'The person is retrieving a dark rounded wooden box from the drawer instead of placing it.', 'DimensionName': 'Time order understanding', 'VideoID': '210.webm'}, '51': {'Q': 'What is the primary action performed by the person in the video?', 'A': 'The primary action performed is the removal of a key from a lock.', 'DimensionName': 'Time order understanding', 'VideoID': '211.webm'}, '52': {'Q': 'What is the person doing in the video?', 'A': 'The video shows a person who is removing a key from a door lock. No other action is performed in the video.', 'DimensionName': 'Time order understanding', 'VideoID': '211.webm'}, '53': {'Q': 'Is the door being unlocked or locked in the footage observed?', 'A': 'The door is neither being unlocked nor locked; the key is being removed from the lock.', 'DimensionName': 'Time order understanding', 'VideoID': '211.webm'}, '54': {'Q': 'Does the person open the door in the video?', 'A': 'There is no activity of opening the door depicted in the video. The video shows the action of removing a key from the door lock.', 'DimensionName': 'Time order understanding', 'VideoID': '211.webm'}, '55': {'Q': \"Is the key present in the person's hand, or it is situated in the lock at the start of the video?\", 'A': 'The key was already inserted into the lock at the start of the video.', 'DimensionName': 'Time order understanding', 'VideoID': '211.webm'}, '56': {'Q': 'Is there any second action shown in the video after removal of the key from the door lock?', 'A': 'No specific action immediately follows the removal of the key in the video, as it primarily showcases the process of removing the key from the lock.', 'DimensionName': 'Time order understanding', 'VideoID': '211.webm'}, '57': {'Q': 'Is there any interaction between a person and the lock aside from the key being removed?', 'A': 'No, there is no other interaction depicted between a person and the lock aside from the key being removed.', 'DimensionName': 'Time order understanding', 'VideoID': '211.webm'}, '58': {'Q': 'Does the person insert the key into the door lock or remove the key from the door lock in the video?', 'A': 'The person removes the key from the door lock in the video.', 'DimensionName': 'Time order understanding', 'VideoID': '211.webm'}, '59': {'Q': 'What is happening in the video?', 'A': \"The video showcases a white door with a golden round lock in front of the camera. A key is already inserted into the lock. Subsequently, a person's hand appears, and they remove the key from the lock. The sole action depicted in the video is the process of removing the key from the lock.\", 'DimensionName': 'Time order understanding', 'VideoID': '211.webm'}, '60': {'Q': 'Does the ship sail from right to left across the body of water?', 'A': \"No, the ship sails from left to right. This directionality can be derived from observing the ship's movement in the video.\", 'DimensionName': 'Time order understanding', 'VideoID': '212.mp4'}, '61': {'Q': 'Is the Statue of Liberty visible before the camera focuses more closely on the ship?', 'A': 'Yes, the Statue of Liberty is visible in the background before the camera zooms in on the ship.', 'DimensionName': 'Time order understanding', 'VideoID': '212.mp4'}, '62': {'Q': 'After the camera moves closer to the ship, does the ship change its direction of sail?', 'A': 'No, the ship continues sailing to the right even after the camera moves closer. The continuity of direction helps in identifying the consistency of the action despite changes in camera perspective.', 'DimensionName': 'Time order understanding', 'VideoID': '212.mp4'}, '63': {'Q': 'Is the ship moving towards the camera or the camera is getting closer to the ship in the video?', 'A': 'The camera is getting closer to the ship in the video. The ship is described as moving from left to right, and the camera moves closer to the ship.', 'DimensionName': 'Time order understanding', 'VideoID': '212.mp4'}, '64': {'Q': 'Does the video showcase any moment where the ship sails from the right towards the left?', 'A': 'No, the video showcases the ship sailing from left to right.', 'DimensionName': 'Time order understanding', 'VideoID': '212.mp4'}, '65': {'Q': 'What is the direction of the movement of the ship in relation to the camera?', 'A': 'The ship is moving from left to right in relation to the camera.', 'DimensionName': 'Time order understanding', 'VideoID': '212.mp4'}, '66': {'Q': 'What is happening in the video?', 'A': 'The video shows a red and black ship sailing from left to right in a body of water, with the Statue of Liberty and city structures in the background. The camera zooms in as the ship continues its rightward movement.', 'DimensionName': 'Time order understanding', 'VideoID': '212.mp4'}, '67': {'Q': 'What objects are initially visible on the wooden desk at the beginning of the video?', 'A': 'A remote and a vase are initially visible on the desk.', 'DimensionName': 'Time order understanding', 'VideoID': '213.webm'}, '68': {'Q': 'In which direction is the remote moved during the video?', 'A': 'The remote is pushed to the left side of the desk.', 'DimensionName': 'Time order understanding', 'VideoID': '213.webm'}, '69': {'Q': 'Does the action of moving the remote occur before or after it sits closely to the vase on the desk?', 'A': 'The action of moving the remote occurs after it is shown sitting closely to the vase.', 'DimensionName': 'Time order understanding', 'VideoID': '213.webm'}, '70': {'Q': 'What is the direction of the movement of the remote from the vase?', 'A': 'The remote is moved towards the left side of the vase.', 'DimensionName': 'Time order understanding', 'VideoID': '213.webm'}, '71': {'Q': 'Is the vase moved at any point in the video?', 'A': 'No, the vase is not moved. The video shows that the remote is being moved, with no depiction of the vase changing position.', 'DimensionName': 'Time order understanding', 'VideoID': '213.webm'}, '72': {'Q': 'Describe the sequence of actions involving the remote as shown in the video.', 'A': 'Initially, the remote is placed close to the vase on a desk, then it is shifted away by being pushed to the left side of the desk.', 'DimensionName': 'Time order understanding', 'VideoID': '213.webm'}, '73': {'Q': 'What is the primary action performed in the video?', 'A': 'The primary action depicts that a person shifts the remote away from the vase by pushing it to the left side of the desk.', 'DimensionName': 'Time order understanding', 'VideoID': '213.webm'}, '74': {'Q': 'Is the remote shifted towards the right side or the left side of the vase in the video?', 'A': 'The remote is shifted towards the left side from the vase in the video.', 'DimensionName': 'Time order understanding', 'VideoID': '213.webm'}, '75': {'Q': 'What is happening in the video?', 'A': 'The video starts by displaying a wooden desk with a remote and a vase placed closely. Following this, a person shifts the remote away from the vase by pushing it to the left side of the desk.', 'DimensionName': 'Time order understanding', 'VideoID': '213.webm'}, '76': {'Q': 'What is the primary action shown in the video?', 'A': 'The primary action shown in the video is the person shifting the remote away from the vase by pushing it to the left side of the desk.', 'DimensionName': 'Time order understanding', 'VideoID': '213.webm'}, '77': {'Q': 'What item is placed inside the drawer first?', 'A': 'A dark rounded wooden box is placed inside the drawer first.', 'DimensionName': 'Time order understanding', 'VideoID': '214.webm'}, '78': {'Q': 'Is the drawer being closed or open at the start of the video?', 'A': 'The drawer is opened at the start of the video.', 'DimensionName': 'Time order understanding', 'VideoID': '214.webm'}, '79': {'Q': 'What is happening in the video?', 'A': \"The video features a close-up of a wooden drawer with various items, including a perfume bottle and a lamp, on top and around it. A person's hands holding a dark rounded wooden box then appear. They open the drawer and put the wooden box into it. The main action in the video is the process of placing the box into the drawer.\", 'DimensionName': 'Time order understanding', 'VideoID': '214.webm'}, '80': {'Q': 'How many items are present inside the wooden drawer when it is opened by the person in the video?', 'A': 'The drawer is shown to be completely empty when it is opened by the person in the video.', 'DimensionName': 'Time order understanding', 'VideoID': '214.webm'}, '81': {'Q': 'Is the person taking out a dark rounded wooden box from the drawer in the video?', 'A': 'No, the person is placing the dark rounded wooden box inside the drawer instead of taking it out.', 'DimensionName': 'Time order understanding', 'VideoID': '214.webm'}, '82': {'Q': 'What is the primary action being performed in the video?', 'A': 'The primary action in the video is the process of placing the dark rounded box into the drawer..', 'DimensionName': 'Time order understanding', 'VideoID': '214.webm'}, '83': {'Q': 'Is the person retrieving the wooden box from the drawer or placing the wooden box into the drawer in the video?', 'A': 'The person in the video is shown to be placing the wooden box into the drawer.', 'DimensionName': 'Time order understanding', 'VideoID': '214.webm'}, '84': {'Q': 'Does the scene primarily depict an activity occurring indoors or outdoors?', 'A': 'Outdoors. The presence of a sunny day, a grassy field, and an expansive, empty road suggests an outdoor setting.', 'DimensionName': 'Time order understanding', 'VideoID': '215.mp4'}, '85': {'Q': \"In which direction relative to the camera's position (towards or away) do the participants move?\", 'A': 'The participants move forward away from the camera.', 'DimensionName': 'Time order understanding', 'VideoID': '215.mp4'}, '86': {'Q': 'Is the camera following the joggers as they move?', 'A': 'No, the camera remains stationary. It does not follow the joggers but captures their movement as they go away from its position.', 'DimensionName': 'Time order understanding', 'VideoID': '215.mp4'}, '87': {'Q': 'Are the joggers moving towards or away from the camera?', 'A': \"Away from the camera. The video depicts that the joggers are moving forward away from the camera's perspective.\", 'DimensionName': 'Time order understanding', 'VideoID': '215.mp4'}, '88': {'Q': 'Are the joggers moving towards the right direction or towards the left direction relative to the camera?', 'A': 'The joggers are moving towards the left direction relative to the camera in the video.', 'DimensionName': 'Time order understanding', 'VideoID': '215.mp4'}, '89': {'Q': 'From the described activities, can you determine if the event takes place at night?', 'A': 'No, the event takes place on a sunny day, indicating it happens during daylight hours, not at night.', 'DimensionName': 'Time order understanding', 'VideoID': '215.mp4'}, '90': {'Q': 'Are the people seen to be jogging in unusually reverse direction in the video?', 'A': 'No, the people in the video are jogging in the typical forward direction, moving away from the camera. There is no depiction of them jogging in an unusually reverse direction. The scene seems to depict a normal outdoor jogging activity on a sunny day.', 'DimensionName': 'Time order understanding', 'VideoID': '215.mp4'}, '91': {'Q': \"What does the person's hand initially hold?\", 'A': \"The person's hand initially holds a ballpoint pen.\", 'DimensionName': 'Time order understanding', 'VideoID': '216.webm'}, '92': {'Q': 'Is the action shown by the person depicted as picking up a pen from the desk in the video?', 'A': 'No, the video indicates that the person drops the pen.', 'DimensionName': 'Time order understanding', 'VideoID': '216.webm'}, '93': {'Q': \"Does the pen stay in the person's hand throughout the video?\", 'A': \"No, the pen does not stay in the person's hand throughout the video. It is dropped and ends up on the floor, which portrays the transition from being held to being let go.\", 'DimensionName': 'Time order understanding', 'VideoID': '216.webm'}, '94': {'Q': 'In the sequence of actions shown, what happens to the ballpoint pen after the person holds it?', 'A': 'After the person holds it, the ballpoint pen is dropped and falls to the floor.', 'DimensionName': 'Time order understanding', 'VideoID': '216.webm'}, '95': {'Q': 'What is happening in the video?', 'A': \"The video depicts a person's hand holding a ballpoint pen initially. Subsequently, the person drops the pen, and it falls to the floor. There are no additional actions in the video.\", 'DimensionName': 'Time order understanding', 'VideoID': '216.webm'}, '96': {'Q': 'Identify the sequence of the main action involving the ballpoint pen from start to finish.', 'A': 'The sequence of the main action starts with the pen being held, followed by it being dropped, and concludes with it landing and remaining on the floor/desk.', 'DimensionName': 'Time order understanding', 'VideoID': '216.webm'}, '97': {'Q': 'Is the pen picked up by the person or dropped by the person in the video?', 'A': 'The pen is dropped by the person in the video.', 'DimensionName': 'Time order understanding', 'VideoID': '216.webm'}, '98': {'Q': 'Identify if the person is picking up a pen in the given video.', 'A': 'No, the pen is dropped by the person, not picked up in the video.', 'DimensionName': 'Time order understanding', 'VideoID': '216.webm'}, '99': {'Q': 'What is the primary action performed in the video?', 'A': \"The primary action performed in the video is the person's hand holding a ballpoint pen initially and subsequently dropping the pen, causing it to fall to the floor.\", 'DimensionName': 'Time order understanding', 'VideoID': '216.webm'}, '100': {'Q': 'What is the action performed by the person in the video with respect to the jar?', 'A': 'The action is closing the lid of the jar.', 'DimensionName': 'Time order understanding', 'VideoID': '217.webm'}, '101': {'Q': 'What is happening in the video?', 'A': \"The video presents a close-up of a kitchen shelf near the sink. A person is holding a black jar's lid in his hand, and gradually, they close the jar using the lid in their hand. The main action in the video is closing the lid of the jar using the hand.\", 'DimensionName': 'Time order understanding', 'VideoID': '217.webm'}, '102': {'Q': 'Does the person open or close the jar in the video?', 'A': 'The person closes the jar.', 'DimensionName': 'Time order understanding', 'VideoID': '217.webm'}, '103': {'Q': 'Is the person shown to be opening the lid of the jar or closing the lid of the jar in the video?', 'A': 'The person is shown to be closing the lid of the jar in the video.', 'DimensionName': 'Time order understanding', 'VideoID': '217.webm'}, '104': {'Q': 'Identify the main action being performed near a kitchen shelf in the video.', 'A': 'The main action is closing the lid of a jar.', 'DimensionName': 'Time order understanding', 'VideoID': '217.webm'}, '105': {'Q': 'Describe the action of opening the lid of the jar in the video?', 'A': 'The video does not show opening the lid of the jar, instead it shows the action of closing the jar using its lid.', 'DimensionName': 'Time order understanding', 'VideoID': '217.webm'}, '106': {'Q': 'What is the person doing in the video?', 'A': 'The person is shown to be closing the lid of the jar using his hand in the video.', 'DimensionName': 'Time order understanding', 'VideoID': '217.webm'}, '107': {'Q': 'Is the person filling the jar with anything in the video?', 'A': \"No, the person is not filling the jar. The person's action is closing the jar using its lid.\", 'DimensionName': 'Time order understanding', 'VideoID': '217.webm'}, '108': {'Q': 'What is the main direction of the flying action of the helicopter?', 'A': 'This video shows a red helicopter in the middle of a city flying in reverse from left towards the right.', 'DimensionName': 'Time order understanding', 'VideoID': '218.mp4'}, '109': {'Q': 'Which direction did the helicopter move in relation to the background buildings?', 'A': 'The helicopter moved from left to right in relation to the background buildings.', 'DimensionName': 'Time order understanding', 'VideoID': '218.mp4'}, '110': {'Q': 'What is the unusual aspect depicted with respect to the helicopter in the video?', 'A': 'The unusual aspect depicted in the video is that the red helicopter is flying in reverse from left to right and rising up in the air in the middle of a city. Typically, helicopters move forward, so the reverse direction of flight is unconventional.', 'DimensionName': 'Time order understanding', 'VideoID': '218.mp4'}, '111': {'Q': \"Determine if the helicopter's movement was towards the left or right from its starting position in the filmed scene.\", 'A': \"The helicopter's movement was towards the right from its starting position, as it was flying in reverse from left towards the right.\", 'DimensionName': 'Time order understanding', 'VideoID': '218.mp4'}, '112': {'Q': 'Did the helicopter descend or ascend during the captured events?', 'A': 'The helicopter ascended during the captured events, rising very high up in the air.', 'DimensionName': 'Time order understanding', 'VideoID': '218.mp4'}, '113': {'Q': \"Describe the helicopter's movement pattern in relation to the city's tall buildings.\", 'A': 'The helicopter moved in reverse direction from left to right while ascending, with tall buildings with glass walls visible in the background.', 'DimensionName': 'Time order understanding', 'VideoID': '218.mp4'}, '114': {'Q': \"Assess whether the helicopter's rising motion was in direct contact with any of the background structures.\", 'A': \"The helicopter's rising motion was not in direct contact with any of the background structures; it rose high with tall buildings in the backdrop but did not touch them.\", 'DimensionName': 'Time order understanding', 'VideoID': '218.mp4'}, '115': {'Q': 'What color is the measuring tape that appears in the video?', 'A': 'The measuring tape is yellow.', 'DimensionName': 'Time order understanding', 'VideoID': '219.webm'}, '116': {'Q': 'What is happening in the video?', 'A': 'The video reveals a yellow measuring tape lying on the ground. A person then pushes the tape from the right side to the left, and no other actions are performed in the video.', 'DimensionName': 'Time order understanding', 'VideoID': '219.webm'}, '117': {'Q': 'What is the direction of the movement of the measuring tape?', 'A': 'The measuring tape is pushed from right to left. This direction is identified by observing the movement of the tape relative to its surroundings.', 'DimensionName': 'Time order understanding', 'VideoID': '219.webm'}, '118': {'Q': 'Is the measuring tape pushed toward the right or towards the left by the person in the video?', 'A': 'The measuring tape is moved towards the left in the video.', 'DimensionName': 'Time order understanding', 'VideoID': '219.webm'}, '119': {'Q': \"By the end of the video, has the measuring tape's position changed compared to its initial state, if yes then in what direction it has been pushed?\", 'A': \"Yes, the measuring tape's position has changed by being pushed from the right side to the left. This change is observable by comparing the tape's initial and final positions in the video.\", 'DimensionName': 'Time order understanding', 'VideoID': '219.webm'}, '120': {'Q': 'How many actions are performed on the measuring tape throughout the video?', 'A': 'Only one action is performed: the tape is pushed from the right side to the left. This is evident from monitoring the entire duration of the video for any activities involving the tape.', 'DimensionName': 'Time order understanding', 'VideoID': '219.webm'}, '121': {'Q': 'What is the direction of the movement of the measuring tape?', 'A': 'The tape is pushed from the right side to the left in the video.', 'DimensionName': 'Time order understanding', 'VideoID': '219.webm'}, '122': {'Q': 'What is the primary action shown in the video?', 'A': 'The primary action shown in the video is a person pushing a yellow measuring tape from the right side to the left on the ground.', 'DimensionName': 'Time order understanding', 'VideoID': '219.webm'}, '123': {'Q': 'What is happening in the video?', 'A': 'The video features a person in a red shirt and black cap skillfully descending a tree using a rope looped around it. They alternate between loosening and tightening the rope for a controlled descent.', 'DimensionName': 'Time order understanding', 'VideoID': '220.mp4'}, '124': {'Q': 'Is the person shown to be climbing the tree in the video?', 'A': 'No, the person in the video is not climbing the tree but rather descending from it using a rope looped around the tree trunk.', 'DimensionName': 'Time order understanding', 'VideoID': '220.mp4'}, '125': {'Q': 'Identify the sequence of actions taken by the person to get down the tree.', 'A': 'The sequence involves supporting themselves by a rope, loosening the rope to move down, and then tightening it again to stop. Repeating this sequence allows the person to descend gradually.', 'DimensionName': 'Time order understanding', 'VideoID': '220.mp4'}, '126': {'Q': 'Does the person use any additional tools or supports apart from the rope to descend the tree?', 'A': 'No, the person solely relies on the rope for support to get down the tree.', 'DimensionName': 'Time order understanding', 'VideoID': '220.mp4'}, '127': {'Q': 'Is the person moving upward or downward on the tree in the video?', 'A': 'The person is decending from the tree, so he is moving downward.', 'DimensionName': 'Time order understanding', 'VideoID': '220.mp4'}, '128': {'Q': 'What visual elements apart from the person and the tree can be seen in the video?', 'A': 'A table with jars and bowls and a dense set of trees are visible in the background.', 'DimensionName': 'Time order understanding', 'VideoID': '220.mp4'}, '129': {'Q': \"Is the person's descent rapid or gradual, and what action contributes to this pace?\", 'A': \"The person's descent is gradual, contributed by the action of loosening and tightening the rope multiple times.\", 'DimensionName': 'Time order understanding', 'VideoID': '220.mp4'}, '130': {'Q': 'Does the dog initiate its movement towards the camera or away from it when it starts walking?', 'A': \"The dog initiates its movement away from the camera. This is determined by noting the direction of the dog's walking, which is backwards, leading it further away from the camera's position initially near it.\", 'DimensionName': 'Time order understanding', 'VideoID': '221.mp4'}, '131': {'Q': \"In which part of the video does the dog finally disappear from the camera's view, is it towards the start of the video or towards the end of the video?\", 'A': \"The dog disappears from the camera's view towards the end of the video. This is because the dog walks all the way back and out of view, indicating its exit occurs after traversing the visible area.\", 'DimensionName': 'Time order understanding', 'VideoID': '221.mp4'}, '132': {'Q': \"Is the dog walking forwards or backwards in relation to the camera's perspective during its movement?\", 'A': \"The dog is walking backwards in relation to the camera's perspective. Since the dog moves away from the camera while facing it, this indicates a backward movement.\", 'DimensionName': 'Time order understanding', 'VideoID': '221.mp4'}, '133': {'Q': 'What is the location of the dog in relation to the camera at the end of the video, is it located near to the camera or far away from the camera?', 'A': 'The location of the dog is far away from the camera on the floor at a hallway towards the end of the video.', 'DimensionName': 'Time order understanding', 'VideoID': '221.mp4'}, '134': {'Q': 'What is happening in the video?', 'A': 'The video shows a white dog standing near to the camera on the floor at a hallway. As the video progresses, the dog is shown to be walking backwards while facing the camera across a hallway in a living room away from the camera all the way back and out of view.', 'DimensionName': 'Time order understanding', 'VideoID': '221.mp4'}, '135': {'Q': \"By the video's end, is the dog more or less visible to the camera compared to its initial state?\", 'A': \"By the video's end, the dog is less visible to the camera compared to its initial state. Given that the dog walks out of view, it transitions from being clearly visible to not visible at all.\", 'DimensionName': 'Time order understanding', 'VideoID': '221.mp4'}, '136': {'Q': \"Based on the dog's walking direction, is its movement primarily towards or away from the initial point of observation?\", 'A': \"The dog's movement is primarily away from the initial point of observation. Walking backwards across the hallway away from the camera signifies that its movement is directed further from the starting point.\", 'DimensionName': 'Time order understanding', 'VideoID': '221.mp4'}, '137': {'Q': 'Is the dog moving near to the camera or away from the camera in the video?', 'A': 'The dog is moving away from the camera as the video progresses.', 'DimensionName': 'Time order understanding', 'VideoID': '221.mp4'}, '138': {'Q': 'What is happening in the video?', 'A': \"In the video, a person enters a living room with a guitar, interacts with a cat on an armchair, kicks the cat away, and plays the guitar. The cat runs upstairs, knocks over a plant vase, which falls on the person's head, causing them pain.\", 'DimensionName': 'Time order understanding', 'VideoID': '222.mp4'}, '139': {'Q': 'Before sitting on the armchair to play the guitar, what action does the person perform involving the cat?', 'A': 'The person pushes the cat away from the chair and kicks it away.', 'DimensionName': 'Time order understanding', 'VideoID': '222.mp4'}, '140': {'Q': 'Which direction does the cat move after being pushed and kicked away by the person?', 'A': 'The cat runs towards the right and moves up the staircase behind the armchair.', 'DimensionName': 'Time order understanding', 'VideoID': '222.mp4'}, '141': {'Q': 'What incident occurs immediately after the cat runs up the staircase?', 'A': \"A plant vase is knocked off by the cat, which falls onto the person's head.\", 'DimensionName': 'Time order understanding', 'VideoID': '222.mp4'}, '142': {'Q': 'After what specific event does the person hold onto his head in pain?', 'A': 'The person holds onto his head in pain immediately after the plant vase falls on their head.', 'DimensionName': 'Time order understanding', 'VideoID': '222.mp4'}, '143': {'Q': 'Describe the sequence of actions from when the person first plays the guitar to sitting on the armchair.', 'A': 'The person grabs and pushes the cat away from the chair, kicks it away, and finally sits on the armchair to play the guitar again.', 'DimensionName': 'Time order understanding', 'VideoID': '222.mp4'}, '144': {'Q': 'Is the person shown to be happy towards the end of the video?', 'A': 'No, the person experiences an incident where a plant vase falls on their head, causing pain, which suggests a negative or uncomfortable situation.', 'DimensionName': 'Time order understanding', 'VideoID': '222.mp4'}, '145': {'Q': 'Does the helicopter initially fly from left to right before any maneuvers?', 'A': 'No, the helicopter initially flies from right to left in the video.', 'DimensionName': 'Time order understanding', 'VideoID': '223.mp4'}, '146': {'Q': \"Is the helicopter's descent towards landing immediate after it takes off?\", 'A': 'No, the helicopter descends after flying for a while and performing a turn.', 'DimensionName': 'Time order understanding', 'VideoID': '223.mp4'}, '147': {'Q': 'Does the helicopter ascend or descend as it approaches the camera towards the start of the video?', 'A': 'The helicopter descends as it approaches the camera.', 'DimensionName': 'Time order understanding', 'VideoID': '223.mp4'}, '148': {'Q': 'Does the helicopter turn away from the camera or towards the camera towards the end of the video?', 'A': 'The helicopter turns away from the camera at the end of the video.', 'DimensionName': 'Time order understanding', 'VideoID': '223.mp4'}, '149': {'Q': 'Is the pilot shown to be coming out of the helicopter after it descends to the ground towards the end of the video?', 'A': 'No, the video does not show any pilot coming out of the helicopter after it descends.', 'DimensionName': 'Time order understanding', 'VideoID': '223.mp4'}, '150': {'Q': 'Does the helicopter make a rapid descent towards the ground immediately after its turn?', 'A': 'No', 'DimensionName': 'Time order understanding', 'VideoID': '223.mp4'}, '151': {'Q': \"Is the backdrop of the helicopter's journey primarily urban buildings?\", 'A': 'No, it is a mountain with trees.', 'DimensionName': 'Time order understanding', 'VideoID': '223.mp4'}}}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/html": [ + "

    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    QADimensionNameVideoID
    0Does the video depict a person performing an a...No, the person is running backwards, which cha...Time order understanding204.mp4
    1What is happening in the video?The video features a person in a blue running ...Time order understanding204.mp4
    2Is the person's gear more suitable for indoor ...The person's gear, consisting of a blue runnin...Time order understanding204.mp4
    3Is the person running towards the camera or ru...The person is running away from the camera by ...Time order understanding204.mp4
    4Is the person running in clockwise direction o...The person is running in anticlockwise directi...Time order understanding204.mp4
    5Does the person drink anything in the video wh...No, the person is not shown to be drinking any...Time order understanding204.mp4
    6Is the video capturing an event happening indo...The video captures an outdoor event, suggested...Time order understanding204.mp4
    7What object is initially focused at the start ...The video starts with a close-up of a small or...Time order understanding205.webm
    8Is the flower brought closer to or moved furth...The flower is moved further away from the came...Time order understanding205.webm
    9Describe the motion of the hand holding the fl...The hand holding the flower shows a continuous...Time order understanding205.webm
    \n", + "
    " + ], + "text/plain": [ + " Q \\\n", + "0 Does the video depict a person performing an a... \n", + "1 What is happening in the video? \n", + "2 Is the person's gear more suitable for indoor ... \n", + "3 Is the person running towards the camera or ru... \n", + "4 Is the person running in clockwise direction o... \n", + "5 Does the person drink anything in the video wh... \n", + "6 Is the video capturing an event happening indo... \n", + "7 What object is initially focused at the start ... \n", + "8 Is the flower brought closer to or moved furth... \n", + "9 Describe the motion of the hand holding the fl... \n", + "\n", + " A \\\n", + "0 No, the person is running backwards, which cha... \n", + "1 The video features a person in a blue running ... \n", + "2 The person's gear, consisting of a blue runnin... \n", + "3 The person is running away from the camera by ... \n", + "4 The person is running in anticlockwise directi... \n", + "5 No, the person is not shown to be drinking any... \n", + "6 The video captures an outdoor event, suggested... \n", + "7 The video starts with a close-up of a small or... \n", + "8 The flower is moved further away from the came... \n", + "9 The hand holding the flower shows a continuous... \n", + "\n", + " DimensionName VideoID \n", + "0 Time order understanding 204.mp4 \n", + "1 Time order understanding 204.mp4 \n", + "2 Time order understanding 204.mp4 \n", + "3 Time order understanding 204.mp4 \n", + "4 Time order understanding 204.mp4 \n", + "5 Time order understanding 204.mp4 \n", + "6 Time order understanding 204.mp4 \n", + "7 Time order understanding 205.webm \n", + "8 Time order understanding 205.webm \n", + "9 Time order understanding 205.webm " + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from datasets import load_dataset\n", + "\n", + "data_path = \"/mnt/sfs-common/krhu/lmms-eval-internal/build_cvrr.py\"\n", + "df = load_dataset(data_path, split=\"test\").to_pandas()\n", + "df.head(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    QADimensionNameVideoID
    0Does the video depict a person performing an a...No, the person is running backwards, which cha...Time order understanding204.mp4
    1What is happening in the video?The video features a person in a blue running ...Time order understanding204.mp4
    2Is the person's gear more suitable for indoor ...The person's gear, consisting of a blue runnin...Time order understanding204.mp4
    3Is the person running towards the camera or ru...The person is running away from the camera by ...Time order understanding204.mp4
    4Is the person running in clockwise direction o...The person is running in anticlockwise directi...Time order understanding204.mp4
    5Does the person drink anything in the video wh...No, the person is not shown to be drinking any...Time order understanding204.mp4
    6Is the video capturing an event happening indo...The video captures an outdoor event, suggested...Time order understanding204.mp4
    7What object is initially focused at the start ...The video starts with a close-up of a small or...Time order understanding205.webm
    8Is the flower brought closer to or moved furth...The flower is moved further away from the came...Time order understanding205.webm
    9Describe the motion of the hand holding the fl...The hand holding the flower shows a continuous...Time order understanding205.webm
    10By the end of the video, has the size of the f...By the end of the video, the size of the flowe...Time order understanding205.webm
    11What action is performed with the flower in re...The action performed with the flower is presen...Time order understanding205.webm
    12At the midpoint of the video, would the flower...At the midpoint of the video, the flower would...Time order understanding205.webm
    13What is the direction of the movement of the f...The flower is being moved away/ backwards from...Time order understanding205.webm
    14Does the object move towards the hand's initia...The object moves away from the hand's initial ...Time order understanding206.mp4
    15Identify the final resting position of the sna...The snack packet ends up further away from the...Time order understanding206.mp4
    16From the observed action, deduce whether the m...The movement was linear, as the object moved f...Time order understanding206.mp4
    17Can the sequence of the snack's movement be de...No, the sequence begins on the right and moves...Time order understanding206.mp4
    18Is there evidence of the hand pulling the obje...No, there is no evidence of a pulling action. ...Time order understanding206.mp4
    19Based on the directional movement observed, wa...The hand's action was more indicative of pushi...Time order understanding206.mp4
    \n", + "
    " + ], + "text/plain": [ + " Q \\\n", + "0 Does the video depict a person performing an a... \n", + "1 What is happening in the video? \n", + "2 Is the person's gear more suitable for indoor ... \n", + "3 Is the person running towards the camera or ru... \n", + "4 Is the person running in clockwise direction o... \n", + "5 Does the person drink anything in the video wh... \n", + "6 Is the video capturing an event happening indo... \n", + "7 What object is initially focused at the start ... \n", + "8 Is the flower brought closer to or moved furth... \n", + "9 Describe the motion of the hand holding the fl... \n", + "10 By the end of the video, has the size of the f... \n", + "11 What action is performed with the flower in re... \n", + "12 At the midpoint of the video, would the flower... \n", + "13 What is the direction of the movement of the f... \n", + "14 Does the object move towards the hand's initia... \n", + "15 Identify the final resting position of the sna... \n", + "16 From the observed action, deduce whether the m... \n", + "17 Can the sequence of the snack's movement be de... \n", + "18 Is there evidence of the hand pulling the obje... \n", + "19 Based on the directional movement observed, wa... \n", + "\n", + " A \\\n", + "0 No, the person is running backwards, which cha... \n", + "1 The video features a person in a blue running ... \n", + "2 The person's gear, consisting of a blue runnin... \n", + "3 The person is running away from the camera by ... \n", + "4 The person is running in anticlockwise directi... \n", + "5 No, the person is not shown to be drinking any... \n", + "6 The video captures an outdoor event, suggested... \n", + "7 The video starts with a close-up of a small or... \n", + "8 The flower is moved further away from the came... \n", + "9 The hand holding the flower shows a continuous... \n", + "10 By the end of the video, the size of the flowe... \n", + "11 The action performed with the flower is presen... \n", + "12 At the midpoint of the video, the flower would... \n", + "13 The flower is being moved away/ backwards from... \n", + "14 The object moves away from the hand's initial ... \n", + "15 The snack packet ends up further away from the... \n", + "16 The movement was linear, as the object moved f... \n", + "17 No, the sequence begins on the right and moves... \n", + "18 No, there is no evidence of a pulling action. ... \n", + "19 The hand's action was more indicative of pushi... \n", + "\n", + " DimensionName VideoID \n", + "0 Time order understanding 204.mp4 \n", + "1 Time order understanding 204.mp4 \n", + "2 Time order understanding 204.mp4 \n", + "3 Time order understanding 204.mp4 \n", + "4 Time order understanding 204.mp4 \n", + "5 Time order understanding 204.mp4 \n", + "6 Time order understanding 204.mp4 \n", + "7 Time order understanding 205.webm \n", + "8 Time order understanding 205.webm \n", + "9 Time order understanding 205.webm \n", + "10 Time order understanding 205.webm \n", + "11 Time order understanding 205.webm \n", + "12 Time order understanding 205.webm \n", + "13 Time order understanding 205.webm \n", + "14 Time order understanding 206.mp4 \n", + "15 Time order understanding 206.mp4 \n", + "16 Time order understanding 206.mp4 \n", + "17 Time order understanding 206.mp4 \n", + "18 Time order understanding 206.mp4 \n", + "19 Time order understanding 206.mp4 " + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head(20)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "from datasets import Dataset, Features, Value\n", + "import pandas as pd\n", + "\n", + "# Define the features for the dataset\n", + "features = Features(\n", + " {\n", + " \"Q\": Value(dtype=\"string\"),\n", + " \"A\": Value(dtype=\"string\"),\n", + " \"DimensionName\": Value(dtype=\"string\"),\n", + " \"VideoID\": Value(dtype=\"string\"),\n", + " }\n", + ")\n", + "\n", + "df_items = {\n", + " \"Q\": [],\n", + " \"A\": [],\n", + " \"DimensionName\": [],\n", + " \"VideoID\": [],\n", + "}\n", + "\n", + "for idx, row in df.iterrows():\n", + " df_items[\"Q\"].append(str(row[\"Q\"]))\n", + " df_items[\"A\"].append(str(row[\"A\"]))\n", + " df_items[\"DimensionName\"].append(str(row[\"DimensionName\"]))\n", + " df_items[\"VideoID\"].append(str(row[\"VideoID\"]))\n", + "\n", + "df_items = pd.DataFrame(df_items)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    QADimensionNameVideoID
    0Does the video depict a person performing an a...No, the person is running backwards, which cha...Time order understanding204.mp4
    1What is happening in the video?The video features a person in a blue running ...Time order understanding204.mp4
    2Is the person's gear more suitable for indoor ...The person's gear, consisting of a blue runnin...Time order understanding204.mp4
    3Is the person running towards the camera or ru...The person is running away from the camera by ...Time order understanding204.mp4
    4Is the person running in clockwise direction o...The person is running in anticlockwise directi...Time order understanding204.mp4
    \n", + "
    " + ], + "text/plain": [ + " Q \\\n", + "0 Does the video depict a person performing an a... \n", + "1 What is happening in the video? \n", + "2 Is the person's gear more suitable for indoor ... \n", + "3 Is the person running towards the camera or ru... \n", + "4 Is the person running in clockwise direction o... \n", + "\n", + " A \\\n", + "0 No, the person is running backwards, which cha... \n", + "1 The video features a person in a blue running ... \n", + "2 The person's gear, consisting of a blue runnin... \n", + "3 The person is running away from the camera by ... \n", + "4 The person is running in anticlockwise directi... \n", + "\n", + " DimensionName VideoID \n", + "0 Time order understanding 204.mp4 \n", + "1 Time order understanding 204.mp4 \n", + "2 Time order understanding 204.mp4 \n", + "3 Time order understanding 204.mp4 \n", + "4 Time order understanding 204.mp4 " + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_items.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [], + "source": [ + "dataset = Dataset.from_pandas(df_items, features=features)" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Creating parquet from Arrow format: 100%|██████████| 1/1 [00:00<00:00, 1515.28ba/s]\n", + "Uploading the dataset shards: 100%|██████████| 1/1 [00:01<00:00, 1.33s/it]\n" + ] + }, + { + "data": { + "text/plain": [ + "CommitInfo(commit_url='https://huggingface.co/datasets/lmms-lab/CVRR-ES/commit/dd4d8ad2c74226ee6d3d8d53b2bda853e6e0503f', commit_message='Upload dataset', commit_description='', oid='dd4d8ad2c74226ee6d3d8d53b2bda853e6e0503f', pr_url=None, pr_revision=None, pr_num=None)" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hub_dataset_path = \"lmms-lab/CVRR-ES\"\n", + "dataset.push_to_hub(repo_id=hub_dataset_path, split=\"test\", config_name = \"unusual_and_physically_anomalous_activities\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "lmms-eval", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.19" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/utils/cal_avg_length.py b/utils/cal_avg_length.py new file mode 100644 index 000000000..5f7abb7f1 --- /dev/null +++ b/utils/cal_avg_length.py @@ -0,0 +1,34 @@ +import os +import datetime +import cv2 + +def get_video_duration(video_path): + cap = cv2.VideoCapture(video_path) + fps = cap.get(cv2.CAP_PROP_FPS) + frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT) + duration = frame_count / fps + cap.release() + return duration + +def calculate_average_duration(directory): + total_duration = 0 + video_count = 0 + for filename in os.listdir(directory): + if filename.endswith('.mp4'): + video_path = os.path.join(directory, filename) + duration = get_video_duration(video_path) + total_duration += duration + video_count += 1 + if video_count > 0: + average_duration = total_duration / video_count + return average_duration + else: + return 0 + +directory = 'data/test_video' + +# calculate average duration +average_duration = calculate_average_duration(directory) + + +print(f"Avg duration of '{directory}' : {datetime.timedelta(seconds=average_duration)}") \ No newline at end of file diff --git a/utils/download_vatex.py b/utils/download_vatex.py new file mode 100644 index 000000000..74663252f --- /dev/null +++ b/utils/download_vatex.py @@ -0,0 +1,10 @@ +import subprocess +import json +from tqdm import tqdm + +with open("data/vatex_public_test_english_v1.1.json",'r')as f: + testvideo=json.load(f) +for video in tqdm(testvideo): + video_id = video['videoID'] + command = f"yt-dlp -o data/test_video/{video_id}.mp4 -f mp4 https://www.youtube.com/watch?v={video_id}" + subprocess.run(command, shell=True) \ No newline at end of file diff --git a/utils/upload_data.py b/utils/upload_data.py new file mode 100644 index 000000000..cbbcd5fcf --- /dev/null +++ b/utils/upload_data.py @@ -0,0 +1,9 @@ +from huggingface_hub import HfApi + +api=HfApi() +api.upload_file( + path_or_fileobj="data/vatex_val.zip", + path_in_repo="vatex_val.zip", + repo_id="lmms-lab/vatex", + repo_type="dataset", +) diff --git a/utils/upload_to_hf.py b/utils/upload_to_hf.py new file mode 100644 index 000000000..e7d4ae8f6 --- /dev/null +++ b/utils/upload_to_hf.py @@ -0,0 +1,40 @@ +import zipfile +import os + +def chunk_zip(input_zip_path, output_folder, max_size_mb): + if not os.path.exists(output_folder): + os.makedirs(output_folder) + + # Open the zip file + with zipfile.ZipFile(input_zip_path, 'r') as zfile: + # Get a list of all archived file names from the zip + all_files = zfile.namelist() + total_size = 0 + count = 1 + + # Create a new zip file with three-digit formatting + chunk_zip = zipfile.ZipFile(os.path.join(output_folder, f'videos_chunked_{count:02d}.zip'), 'w') + + for file in all_files: + # Get file size in MB + file_size = zfile.getinfo(file).file_size / 1024 / 1024 + + # Check if adding the file to current chunk will exceed the max size + if total_size + file_size > max_size_mb and total_size > 0: + # Close current chunk and start a new one + chunk_zip.close() + count += 1 + chunk_zip = zipfile.ZipFile(os.path.join(output_folder, f'videos_chunked_{count:02d}.zip'), 'w') + total_size = 0 + + # Write the file to the chunk + + chunk_zip.writestr(zfile.getinfo(file), zfile.read(file)) + total_size += file_size + + chunk_zip.close() + +input_zip_path = 'data/vatex_test.zip' +output_folder = 'data/hf_upload' +max_size_mb = 25*1024 # for 25GB +chunk_zip(input_zip_path, output_folder, max_size_mb) \ No newline at end of file From e4ac135edf605c9ac928a47631868cfa1b8eb146 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Sun, 9 Jun 2024 17:30:46 +0000 Subject: [PATCH 125/181] add download logic to support force download option --- lmms_eval/api/task.py | 47 ++++++++++--------- .../activitynetqa/_default_template_yaml | 1 + 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index 2af0e0a97..304b0a35b 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -691,20 +691,20 @@ def download(self, dataset_kwargs=None) -> None: if "From_YouTube" in dataset_kwargs: import subprocess import json + def _download_from_youtube(path): - import subprocess try: for video in tqdm(self.all_dataset[split]): - video_id = video['videoID'] - target_path=os.path.join(path,f"{video_id}.mp4") + video_id = video["videoID"] + target_path = os.path.join(path, f"{video_id}.mp4") command = f"yt-dlp -o {target_path} -f mp4 https://www.youtube.com/watch?v={video_id}" subprocess.run(command, shell=True) - with open(os.path.join(cache_path,f"{task}_download_status.json"),'w') as f: - f.write(json.dumps({task:"downloaded"})) + with open(os.path.join(cache_path, f"{task}_download_status.json"), "w") as f: + f.write(json.dumps({task: "downloaded"})) except Exception as e: eval_logger.error(f"Error while downloading {task} data: {e}") - with open(os.path.join(cache_path,f"{task}_download_status.json"),'w') as f: - f.write(json.dumps({task:"not downloaded"})) + with open(os.path.join(cache_path, f"{task}_download_status.json"), "w") as f: + f.write(json.dumps({task: "not downloaded"})) hf_home = os.getenv("HF_HOME", "~/.cache/huggingface/") accelerator = Accelerator() @@ -714,15 +714,16 @@ def _download_from_youtube(path): path=self.DATASET_PATH, name=self.DATASET_NAME, download_mode=datasets.DownloadMode.REUSE_DATASET_IF_EXISTS, - **dataset_kwargs if dataset_kwargs is not None else {},) - dataset_kwargs["From_YouTube"]=True - cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset") #download_parquet - split=vars(self.config)["test_split"] - task=vars(self.config)["task"] - - video_path=os.path.join(hf_home,task) - if os.path.exists(os.path.join(cache_path,f"{task}_download_status.json")): - download_status = json.load(open(os.path.join(cache_path, f"{task}_download_status.json"), 'r')) + **dataset_kwargs if dataset_kwargs is not None else {}, + ) + dataset_kwargs["From_YouTube"] = True + cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset") # download_parquet + split = vars(self.config)["test_split"] + task = vars(self.config)["task"] + + video_path = os.path.join(hf_home, task) + if os.path.exists(os.path.join(cache_path, f"{task}_download_status.json")): + download_status = json.load(open(os.path.join(cache_path, f"{task}_download_status.json"), "r")) if download_status[task] == "downloaded": eval_logger.info(f"Data for {task} already download!") else: @@ -741,25 +742,25 @@ def _download_from_youtube(path): download_config.max_retries = dataset_kwargs.get("max_retries", 3) if dataset_kwargs is not None else 3 download_config.num_proc = dataset_kwargs.get("num_proc", 8) if dataset_kwargs is not None else 8 - downloaded_video_ids=[i.split(".mp4")[0] for i in os.listdir(os.path.expanduser(video_path))if i.endswith(".mp4")] - #Filtered the existing dataset with the downloaded video ids - self.dataset=datasets.DatasetDict({split: self.all_dataset[split].filter(lambda x: x['videoID'] in downloaded_video_ids)}) + downloaded_video_ids = [i.split(".mp4")[0] for i in os.listdir(os.path.expanduser(video_path)) if i.endswith(".mp4")] + # Filtered the existing dataset with the downloaded video ids + self.dataset = datasets.DatasetDict({split: self.all_dataset[split].filter(lambda x: x["videoID"] in downloaded_video_ids)}) - self.dataset_no_image =self.dataset + self.dataset_no_image = self.dataset dataset_kwargs.pop("From_YouTube") return - if dataset_kwargs is not None and "video" in dataset_kwargs and dataset_kwargs["video"]: hf_home = os.getenv("HF_HOME", "~/.cache/huggingface/") cache_dir = dataset_kwargs["cache_dir"] cache_dir = os.path.join(hf_home, cache_dir) accelerator = Accelerator() if accelerator.is_main_process: - cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset") + force_download = dataset_kwargs.get("force_download", False) + cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset", force_download=force_download) zip_files = glob(os.path.join(cache_path, "**/*.zip"), recursive=True) - if not os.path.exists(cache_dir) and len(zip_files) > 0: + if force_download or (not os.path.exists(cache_dir) and len(zip_files) > 0): for zip_file in zip_files: eval_logger.info(f"Unzipping {zip_file} to {cache_dir}") shutil.unpack_archive(zip_file, cache_dir) diff --git a/lmms_eval/tasks/activitynetqa/_default_template_yaml b/lmms_eval/tasks/activitynetqa/_default_template_yaml index 9f558cb38..adec677a9 100644 --- a/lmms_eval/tasks/activitynetqa/_default_template_yaml +++ b/lmms_eval/tasks/activitynetqa/_default_template_yaml @@ -2,6 +2,7 @@ dataset_path: lmms-lab/ActivityNetQA dataset_kwargs: token: True video: True + force_download: False cache_dir: activitynetqa model_specific_prompt_kwargs: default: From 15df0b94596d6f76f70b1d0bdcf8d29f96476b0c Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 10 Jun 2024 02:23:06 +0000 Subject: [PATCH 126/181] Hardcode the loading logic for v1.5 in llavavid, prevent loading from transformers --- lmms_eval/models/llava_vid.py | 38 +++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/lmms_eval/models/llava_vid.py b/lmms_eval/models/llava_vid.py index 3465766f5..89ebe02b3 100755 --- a/lmms_eval/models/llava_vid.py +++ b/lmms_eval/models/llava_vid.py @@ -14,23 +14,30 @@ from lmms_eval.api.instance import Instance from lmms_eval.api.model import lmms from lmms_eval.api.registry import register_model +from lmms_eval.models.model_utils.load_video import read_video_pyav eval_logger = logging.getLogger("lmms-eval") try: from llavavid.model.language_model.llava_llama import LlavaConfig - from llavavid.model.language_model.llava_qwen import LlavaQwenConfig + # from llavavid.model.language_model.llava_qwen import LlavaQwenConfig from llavavid.model.builder import load_pretrained_model from llavavid.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria from llavavid.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN from llavavid.conversation import conv_templates, SeparatorStyle - AutoConfig.register("llava_qwen", LlavaQwenConfig) + # AutoConfig.register("llava_qwen", LlavaQwenConfig) AutoConfig.register("llava_llama", LlavaConfig) except ImportError: eval_logger.debug("LLaVA-Video is not installed. Please install LLaVA-Video to use this model.") +try: + from llavavid.model.language_model.llava_qwen import LlavaQwenConfig + AutoConfig.register("llava_qwen", LlavaQwenConfig) +except: + eval_logger.debug("") + @register_model("llavavid") class LlavaVid(lmms): @@ -108,8 +115,31 @@ def __init__( overwrite_config["rope_scaling"] = {"factor": float(scaling_factor), "type": "linear"} overwrite_config["max_sequence_length"] = 4096 * scaling_factor overwrite_config["tokenizer_model_max_length"] = 4096 * scaling_factor - - self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, self.model_name, device_map=self.device_map, overwrite_config=overwrite_config) + + if "v1.5" in pretrained: # A hardcode solution here to load v1.5 model, otherwise it will use LlavaConfig from hf transformers + from transformers import AutoTokenizer + from llavavid.model.language_model.llava_llama import LlavaConfig, LlavaLlamaForCausalLM + self._tokenizer = AutoTokenizer.from_pretrained(pretrained, use_fast=False) + cfg_pretrained = LlavaConfig.from_pretrained(pretrained) + if overwrite_config is not None: + print(f"Overwriting config with {overwrite_config}") + for k, v in overwrite_config.items(): + setattr(cfg_pretrained, k, v) + kwargs["torch_dtype"] = torch.float16 + self._model = LlavaLlamaForCausalLM.from_pretrained(pretrained, low_cpu_mem_usage=True, config=cfg_pretrained, device_map=self.device_map, **kwargs) + vision_tower = self._model.get_vision_tower() + if not vision_tower.is_loaded: + vision_tower.load_model(device_map=self.device_map) + if self.device_map != "auto": + vision_tower.to(device="cuda", dtype=torch.float16) + self._image_processor = vision_tower.image_processor + + if hasattr(self._model.config, "max_sequence_length"): + self._max_length = self._model.config.max_sequence_length + else: + self._max_length = 2048 + else: + self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, self.model_name, device_map=self.device_map, overwrite_config=overwrite_config) else: self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model( pretrained, From 579f5378371bba8c4a96081054da2bf15c3629a7 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 10 Jun 2024 02:30:21 +0000 Subject: [PATCH 127/181] Add videochatgpt inference file --- lmms_eval/models/video_chatgpt/__init__.py | 1 + lmms_eval/models/video_chatgpt/constants.py | 11 + .../models/video_chatgpt/eval/__init__.py | 0 .../models/video_chatgpt/eval/model_utils.py | 147 +++++++++ lmms_eval/models/video_chatgpt/inference.py | 185 ++++++++++++ .../models/video_chatgpt/model/__init__.py | 1 + .../models/video_chatgpt/model/consolidate.py | 28 ++ .../models/video_chatgpt/model/make_delta.py | 50 ++++ lmms_eval/models/video_chatgpt/model/utils.py | 26 ++ .../video_chatgpt/model/video_chatgpt.py | 282 ++++++++++++++++++ .../video_chatgpt/single_video_inference.py | 168 +++++++++++ lmms_eval/models/video_chatgpt/utils.py | 125 ++++++++ .../video_chatgpt/video_conversation.py | 156 ++++++++++ 13 files changed, 1180 insertions(+) create mode 100644 lmms_eval/models/video_chatgpt/__init__.py create mode 100644 lmms_eval/models/video_chatgpt/constants.py create mode 100644 lmms_eval/models/video_chatgpt/eval/__init__.py create mode 100644 lmms_eval/models/video_chatgpt/eval/model_utils.py create mode 100644 lmms_eval/models/video_chatgpt/inference.py create mode 100644 lmms_eval/models/video_chatgpt/model/__init__.py create mode 100644 lmms_eval/models/video_chatgpt/model/consolidate.py create mode 100644 lmms_eval/models/video_chatgpt/model/make_delta.py create mode 100644 lmms_eval/models/video_chatgpt/model/utils.py create mode 100644 lmms_eval/models/video_chatgpt/model/video_chatgpt.py create mode 100644 lmms_eval/models/video_chatgpt/single_video_inference.py create mode 100644 lmms_eval/models/video_chatgpt/utils.py create mode 100644 lmms_eval/models/video_chatgpt/video_conversation.py diff --git a/lmms_eval/models/video_chatgpt/__init__.py b/lmms_eval/models/video_chatgpt/__init__.py new file mode 100644 index 000000000..c5f48379d --- /dev/null +++ b/lmms_eval/models/video_chatgpt/__init__.py @@ -0,0 +1 @@ +from .model import VideoChatGPTLlamaForCausalLM diff --git a/lmms_eval/models/video_chatgpt/constants.py b/lmms_eval/models/video_chatgpt/constants.py new file mode 100644 index 000000000..c9ea9ac1e --- /dev/null +++ b/lmms_eval/models/video_chatgpt/constants.py @@ -0,0 +1,11 @@ +CONTROLLER_HEART_BEAT_EXPIRATION = 30 +WORKER_HEART_BEAT_INTERVAL = 15 + +LOGDIR = "." + + +# Defining model +DEFAULT_VIDEO_TOKEN = "
    ", +) + +conv_video_chatgpt_v1 = Conversation( + system="You are Video-ChatGPT, a large vision-language assistant. " + "You are able to understand the video content that the user provides, and assist the user with a variety of tasks using natural language." + "Follow the instructions carefully and explain your answers in detail based on the provided video.", + # system="", + roles=("USER", "ASSISTANT"), + version="v1", + messages=(), + offset=0, + sep_style=SeparatorStyle.TWO, + sep=" ", + sep2="
    ", +) + +default_conversation = conv_v1_2 +conv_templates = { + "default": conv_v1_2, + "video-chatgpt_v1": conv_video_chatgpt_v1, + "vicuna_v1_1": conv_vicuna_v1_1, +} + +if __name__ == "__main__": + print(default_conversation.get_prompt()) From ef91210639ee21c61f9a98d1aa2d5c2f38403226 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 10 Jun 2024 02:33:45 +0000 Subject: [PATCH 128/181] Add mplug Owl video --- lmms_eval/models/mplugOwlVideo.py | 194 ++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 lmms_eval/models/mplugOwlVideo.py diff --git a/lmms_eval/models/mplugOwlVideo.py b/lmms_eval/models/mplugOwlVideo.py new file mode 100644 index 000000000..b0ba5c3f5 --- /dev/null +++ b/lmms_eval/models/mplugOwlVideo.py @@ -0,0 +1,194 @@ +import logging +from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs +from accelerate.state import AcceleratorState +from typing import List, Optional, Union, Tuple +import torch +from transformers import AutoTokenizer +from tqdm import tqdm +from datetime import timedelta + +from lmms_eval import utils +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model +from lmms_eval.utils import stop_sequences_criteria + +from lmms_eval.models.mplug_owl_video.modeling_mplug_owl import MplugOwlForConditionalGeneration +from lmms_eval.models.mplug_owl_video.processing_mplug_owl import MplugOwlImageProcessor, MplugOwlProcessor + + +eval_logger = logging.getLogger("lmms-eval") + + +@register_model("mplug_owl_video") +class mplug_Owl(lmms): + def __init__( + self, + pretrained: str = "MAGAer13/mplug-owl-llama-7b-video", + device: Optional[str] = "cuda:0", + dtype: Optional[Union[str, torch.dtype]] = "auto", + batch_size: Optional[Union[int, str]] = 1, + device_map="cuda:0", + num_frames: Union[str, int] = 4, + **kwargs, + ) -> None: + ''' + Install instructions: + 1. Install lmms-eval + cd lmms-eval + pip install -e .; + 2. Install other packages with restricted versions + pip install av sentencepiece protobuf==3.20 transformers==4.28.1 einops; + ''' + super().__init__() + + accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) + accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) + if accelerator.num_processes > 1: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + elif accelerator.num_processes == 1 and device_map == "auto": + self._device = torch.device(device) + self.device_map = device_map + else: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + + # import pdb; pdb.set_trace() + # This is very slow. Their issue, not mine + # Also, keep transformers in version 4.28.1 + # They put a Config object inside a config object, this is not acceptable + # for transformers == 4.39.1, object type not serializable + # Protobuf needs to be in 3.20.x otherwise error + # ヽ(`Д´)ノ + self._model = MplugOwlForConditionalGeneration.from_pretrained( + pretrained, + torch_dtype=torch.bfloat16, + ) + self.image_processor = MplugOwlImageProcessor.from_pretrained(pretrained) + self._tokenizer = AutoTokenizer.from_pretrained(pretrained) + self.processor = MplugOwlProcessor(self.image_processor, self.tokenizer) + self.model.eval() + self.batch_size_per_gpu = batch_size + self.num_frames = num_frames + + self.model.to(self.device) + + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + # If you want to use DistributedType.DEEPSPEED, you have to run accelerate config before using the model + # Also, you have to select zero stage 0 (equivalent to DDP) in order to make the prepare model works + # I tried to set different parameters in the kwargs to let default zero 2 stage works, but it didn't work. + if accelerator.distributed_type == DistributedType.DEEPSPEED: + kwargs = { + "train_micro_batch_size_per_gpu": self.batch_size_per_gpu, + "train_batch_size": self.batch_size_per_gpu * accelerator.num_processes, + } + AcceleratorState().deepspeed_plugin.deepspeed_config_process(must_match=True, **kwargs) + eval_logger.info("Detected that you are using DistributedType.DEEPSPEED. Make sure you run `accelerate config` and set zero stage to 0") + if accelerator.distributed_type == DistributedType.FSDP or accelerator.distributed_type == DistributedType.DEEPSPEED: + self._model = accelerator.prepare(self.model) + else: + self._model = accelerator.prepare_model(self.model, evaluation_mode=True) + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + else: + eval_logger.info(f"Using single device: {self._device}") + self.model.to(self._device) + self._rank = 0 + self._world_size = 1 + + @property + def config(self): + # return the associated transformers.AutoConfig for the given pretrained model. + return self._config + + @property + def tokenizer(self): + return self._tokenizer + + @property + def model(self): + # returns the model, unwrapping it if using Accelerate + if hasattr(self, "accelerator"): + return self.accelerator.unwrap_model(self._model) + else: + return self._model + + @property + def eot_token_id(self): + # we use EOT because end of *text* is more accurate for what we're doing than end of *sentence* + return self.tokenizer.eos_token_id + + @property + def max_length(self): + return self._max_length + + @property + def batch_size(self): + return self.batch_size_per_gpu + + @property + def device(self): + return self._device + + @property + def rank(self): + return self._rank + + @property + def world_size(self): + return self._world_size + + def flatten(self, input): + new_list = [] + for i in input: + for j in i: + new_list.append(j) + return new_list + + def format_prompt(self, question): + prompts = [f" <|video|> Question : {question} Answer : "] + return prompts + + def generate_until(self, requests) -> List[str]: + res = [] + pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") + + for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + # encode, pad, and truncate contexts for this batch + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + inputs = self.processor(text=self.format_prompt(contexts), videos=visuals, num_frames=self.num_frames, return_tensors="pt") + pixel_values_videos = inputs["video_pixel_values"] + if pixel_values_videos.shape[2] != self.num_frames: + empty_frames = torch.zeros((1, pixel_values_videos.shape[1], self.num_frames - pixel_values_videos.shape[2], *pixel_values_videos.shape[3:]), dtype=pixel_values_videos.dtype) + pixel_values_videos = torch.cat([pixel_values_videos, empty_frames], dim=2) + inputs["video_pixel_values"] = pixel_values_videos + inputs = {k: v.bfloat16() if v.dtype == torch.float else v for k, v in inputs.items()} + inputs = {k: v.to(self.model.device) for k, v in inputs.items()} + + if "max_new_tokens" in gen_kwargs: + gen_kwargs["max_length"] = gen_kwargs["max_new_tokens"] + if "max_new_tokens" not in gen_kwargs: + gen_kwargs["max_length"] = 128 + if "do_sample" not in gen_kwargs: + gen_kwargs["do_sample"] = False + if "top_k" not in gen_kwargs: + gen_kwargs["top_k"] = 1 + + generate_kwargs = {"do_sample": gen_kwargs["do_sample"], "top_k": gen_kwargs["top_k"], "max_length": gen_kwargs["max_length"]} + + with torch.no_grad(): + outputs = self.model.generate(**inputs, **generate_kwargs) + sentence = self.tokenizer.decode(outputs.tolist()[0], skip_special_tokens=True) + pbar.update(1) + res.append(sentence) + pbar.close() + return res + + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + return super().loglikelihood(requests) From 71105782b75535135072f93abd63e49412e4f2fc Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 10 Jun 2024 02:34:17 +0000 Subject: [PATCH 129/181] Add necessary file for mplug Owl video to load --- lmms_eval/models/mplug_owl_video/__init__.py | 77 + .../configuration_mplug_owl.py | 289 +++ .../mplug_owl_video/modeling_mplug_owl.py | 1841 +++++++++++++++++ .../mplug_owl_video/processing_mplug_owl.py | 263 +++ .../mplug_owl_video/tokenization_mplug_owl.py | 62 + 5 files changed, 2532 insertions(+) create mode 100644 lmms_eval/models/mplug_owl_video/__init__.py create mode 100644 lmms_eval/models/mplug_owl_video/configuration_mplug_owl.py create mode 100644 lmms_eval/models/mplug_owl_video/modeling_mplug_owl.py create mode 100644 lmms_eval/models/mplug_owl_video/processing_mplug_owl.py create mode 100644 lmms_eval/models/mplug_owl_video/tokenization_mplug_owl.py diff --git a/lmms_eval/models/mplug_owl_video/__init__.py b/lmms_eval/models/mplug_owl_video/__init__.py new file mode 100644 index 000000000..2020ad3a8 --- /dev/null +++ b/lmms_eval/models/mplug_owl_video/__init__.py @@ -0,0 +1,77 @@ +# Copyright 2020 The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from typing import TYPE_CHECKING + +from transformers.utils import OptionalDependencyNotAvailable, _LazyModule, is_tokenizers_available, is_torch_available + + +_import_structure = { + "configuration_mplug_owl": ["MPLUG_OWL_PRETRAINED_CONFIG_ARCHIVE_MAP", "MplugOwlConfig"], + "processing_mplug_owl": ["MplugOwlImageProcessor", "MplugOwlProcessor"], + "tokenization_mplug_owl": ["MplugOwlTokenizer"], +} + +try: + if not is_tokenizers_available(): + raise OptionalDependencyNotAvailable() +except OptionalDependencyNotAvailable: + pass + + +try: + if not is_torch_available(): + raise OptionalDependencyNotAvailable() +except OptionalDependencyNotAvailable: + pass +else: + _import_structure["modeling_mplug_owl"] = [ + "MPLUG_OWL_PRETRAINED_MODEL_ARCHIVE_LIST", + "MplugOwlForConditionalGeneration", + "MplugOwlModel", + ] + + +if TYPE_CHECKING: + from .configuration_mplug_owl import MPLUG_OWL_PRETRAINED_CONFIG_ARCHIVE_MAP, MplugOwlConfig + from .tokenization_mplug_owl import MplugOwlTokenizer + + try: + if not is_tokenizers_available(): + raise OptionalDependencyNotAvailable() + except OptionalDependencyNotAvailable: + pass + + try: + if not is_torch_available(): + raise OptionalDependencyNotAvailable() + except OptionalDependencyNotAvailable: + pass + else: + from .modeling_mplug_owl import ( + MPLUG_OWL_PRETRAINED_MODEL_ARCHIVE_LIST, + MplugOwlForConditionalGeneration, + MplugOwlModel, + MplugOwlPreTrainedModel, + ) + + +else: + import sys + + sys.modules[__name__] = _LazyModule(__name__, globals()["__file__"], _import_structure, module_spec=__spec__) + +from .configuration_mplug_owl import * +from .modeling_mplug_owl import * +from .processing_mplug_owl import * +from .tokenization_mplug_owl import * diff --git a/lmms_eval/models/mplug_owl_video/configuration_mplug_owl.py b/lmms_eval/models/mplug_owl_video/configuration_mplug_owl.py new file mode 100644 index 000000000..6b5d458d6 --- /dev/null +++ b/lmms_eval/models/mplug_owl_video/configuration_mplug_owl.py @@ -0,0 +1,289 @@ +# coding=utf-8 +# Copyright 2022 x-plug and The HuggingFace Inc. team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" MplugOwl model configuration """ +import copy +import os +from typing import Union + +from transformers.configuration_utils import PretrainedConfig +from transformers.models.auto.modeling_auto import MODEL_FOR_CAUSAL_LM_MAPPING_NAMES +from transformers.utils import logging +from transformers.models.auto import CONFIG_MAPPING + + +logger = logging.get_logger(__name__) + +MPLUG_OWL_PRETRAINED_CONFIG_ARCHIVE_MAP = { + "MAGAer13/mplug-owl-llama-7b": "https://huggingface.co/MAGAer13/mplug-owl-llama-7b/resolve/main/config.json", + # See all MplugOwl models at https://huggingface.co/models?filter=mplug_owl +} + + +class MplugOwlVisionConfig(PretrainedConfig): + r""" + This is the configuration class to store the configuration of a [`MplugOwlVisionModel`]. It is used to instantiate a + mPLUG-Owl vision encoder according to the specified arguments, defining the model architecture. Instantiating a + configuration defaults will yield a similar configuration to that of the mPLUG-Owl + [x-plug/x_plug-llama-7b](https://huggingface.co/x-plug/x_plug-llama-7b) architecture. + + Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the + documentation from [`PretrainedConfig`] for more information. + + Args: + hidden_size (`int`, *optional*, defaults to 768): + Dimensionality of the encoder layers and the pooler layer. + intermediate_size (`int`, *optional*, defaults to 3072): + Dimensionality of the "intermediate" (i.e., feed-forward) layer in the Transformer encoder. + num_hidden_layers (`int`, *optional*, defaults to 12): + Number of hidden layers in the Transformer encoder. + num_attention_heads (`int`, *optional*, defaults to 12): + Number of attention heads for each attention layer in the Transformer encoder. + image_size (`int`, *optional*, defaults to 224): + The size (resolution) of each image. + patch_size (`int`, *optional*, defaults to 32): + The size (resolution) of each patch. + hidden_act (`str` or `function`, *optional*, defaults to `"quick_gelu"`): + The non-linear activation function (function or string) in the encoder and pooler. If string, `"gelu"`, + `"relu"`, `"selu"` and `"gelu_new"` ``"quick_gelu"` are supported. + layer_norm_eps (`float`, *optional*, defaults to 1e-5): + The epsilon used by the layer normalization layers. + attention_dropout (`float`, *optional*, defaults to 0.0): + The dropout ratio for the attention probabilities. + initializer_range (`float`, *optional*, defaults to 0.02): + The standard deviation of the truncated_normal_initializer for initializing all weight matrices. + initializer_factor (`float`, *optional*, defaults to 1): + A factor for initializing all weight matrices (should be kept to 1, used internally for initialization + testing). + + + ```""" + + model_type = "mplug_owl_vision_model" + + def __init__( + self, + hidden_size=1024, + intermediate_size=4096, + projection_dim=768, + num_hidden_layers=24, + num_attention_heads=16, + num_channels=3, + image_size=224, + patch_size=14, + hidden_act="quick_gelu", + layer_norm_eps=1e-6, + attention_dropout=0.0, + initializer_range=0.02, + initializer_factor=1.0, + use_flash_attn=False, + **kwargs, + ): + super().__init__(**kwargs) + self.hidden_size = hidden_size + self.intermediate_size = intermediate_size + self.projection_dim = projection_dim + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + self.num_channels = num_channels + self.patch_size = patch_size + self.image_size = image_size + self.initializer_range = initializer_range + self.initializer_factor = initializer_factor + self.attention_dropout = attention_dropout + self.layer_norm_eps = layer_norm_eps + self.hidden_act = hidden_act + self.use_flash_attn = use_flash_attn + + @classmethod + def from_pretrained(cls, pretrained_model_name_or_path: Union[str, os.PathLike], **kwargs) -> "PretrainedConfig": + config_dict, kwargs = cls.get_config_dict(pretrained_model_name_or_path, **kwargs) + + # get the vision config dict if we are loading from MplugOwlConfig + if config_dict.get("model_type") == "mplug-owl": + config_dict = config_dict["vision_config"] + + if "model_type" in config_dict and hasattr(cls, "model_type") and config_dict["model_type"] != cls.model_type: + logger.warning(f"You are using a model of type {config_dict['model_type']} to instantiate a model of type " f"{cls.model_type}. This is not supported for all configurations of models and can yield errors.") + + return cls.from_dict(config_dict, **kwargs) + + +class MplugOwlVisualAbstractorConfig(PretrainedConfig): + model_type = "mplug_owl_visual_abstract" + + def __init__( + self, + hidden_size=1024, # + num_hidden_layers=6, # + num_attention_heads=16, # + intermediate_size=4096, # + attention_probs_dropout_prob=0.1, # + initializer_range=0.02, + layer_norm_eps=1e-6, # + encoder_hidden_size=1024, # + **kwargs, + ): + super().__init__(**kwargs) + self.hidden_size = hidden_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + self.intermediate_size = intermediate_size + self.attention_probs_dropout_prob = attention_probs_dropout_prob + self.initializer_range = initializer_range + self.layer_norm_eps = layer_norm_eps + self.encoder_hidden_size = encoder_hidden_size + + @classmethod + def from_pretrained(cls, pretrained_model_name_or_path: Union[str, os.PathLike], **kwargs) -> "PretrainedConfig": + config_dict, kwargs = cls.get_config_dict(pretrained_model_name_or_path, **kwargs) + + # get the visual_abstractor config dict if we are loading from MplugOwlConfig + if config_dict.get("model_type") == "mplug-owl": + config_dict = config_dict["abstractor_config"] + + if "model_type" in config_dict and hasattr(cls, "model_type") and config_dict["model_type"] != cls.model_type: + logger.warning(f"You are using a model of type {config_dict['model_type']} to instantiate a model of type " f"{cls.model_type}. This is not supported for all configurations of models and can yield errors.") + + return cls.from_dict(config_dict, **kwargs) + + +class MplugOwlConfig(PretrainedConfig): + r""" + [`MplugOwlConfig`] is the configuration class to store the configuration of a [`MplugOwlForConditionalGeneration`]. It is + used to instantiate a mPLUG-Owl model according to the specified arguments, defining the vision model, Q-Former model + and language model configs. Instantiating a configuration with the defaults will yield a similar configuration to + that of the mPLUG-Owl [x-plug/x_plug-llama-7b](https://huggingface.co/x-plug/x_plug-llama-7b) architecture. + + Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the + documentation from [`PretrainedConfig`] for more information. + + Args: + vision_config (`dict`, *optional*): + Dictionary of configuration options used to initialize [`MplugOwlVisionConfig`]. + visual_abstractor_config (`dict`, *optional*): + Dictionary of configuration options used to initialize [`MplugOwlVisualAbstractorConfig`]. + text_config (`dict`, *optional*): + Dictionary of configuration options used to initialize any [`PretrainedConfig`]. + num_query_tokens (`int`, *optional*, defaults to 32): + The number of query tokens passed through the Transformer. + + kwargs (*optional*): + Dictionary of keyword arguments. + + Example: + + ```python + >>> from transformers import ( + ... MplugOwlVisionConfig, + ... MplugOwlVisualAbstractorConfig, + ... OPTConfig, + ... MplugOwlConfig, + ... MplugOwlForConditionalGeneration, + ... ) + + >>> # Initializing a MplugOwlConfig with x-plug/x_plug-llama-7b style configuration + >>> configuration = MplugOwlConfig() + + >>> # Initializing a MplugOwlForConditionalGeneration (with random weights) from the x-plug/x_plug-llama-7b style configuration + >>> model = MplugOwlForConditionalGeneration(configuration) + + >>> # Accessing the model configuration + >>> configuration = model.config + + >>> # We can also initialize a MplugOwlConfig from a MplugOwlVisionConfig, MplugOwlVisualAbstractorConfig and any PretrainedConfig + + >>> # Initializing mPLUG-Owl vision, mPLUG-Owl Q-Former and language model configurations + >>> vision_config = MplugOwlVisionConfig() + >>> visual_abstractor_config = MplugOwlVisualAbstractorConfig() + >>> text_config = OPTConfig() + + >>> config = MplugOwlConfig.from_text_vision_configs(vision_config, visual_abstractor_config, text_config) + ```""" + + model_type = "mplug-owl" + is_composition = True + + def __init__(self, vision_config=None, visual_abstractor_config=None, text_config=None, num_query_tokens=64, **kwargs): + super().__init__(**kwargs) + if vision_config is None: + vision_config = MplugOwlVisionConfig().to_dict() + logger.info("vision_config is None.") + + if visual_abstractor_config is None: + visual_abstractor_config = {} + logger.info("abstractor_config is None. ") + + if text_config is None: + # we use LLAMA 7b by default + from ..llama.configuration_llama import LlamaConfig + + text_config = LlamaConfig(pad_token_id=2).to_dict() + logger.info("text_config is None.") + + self.vision_config = MplugOwlVisionConfig(**vision_config) + self.visual_abstractor_config = MplugOwlVisualAbstractorConfig(**visual_abstractor_config) + # self.visual_abstractor_config.layer_norm_eps = 1e-6 + text_model_type = text_config["model_type"] if "model_type" in text_config else "llama" + self.text_config = CONFIG_MAPPING[text_model_type](**text_config) + + self.tie_word_embeddings = self.text_config.tie_word_embeddings + self.is_encoder_decoder = self.text_config.is_encoder_decoder + + self.num_query_tokens = num_query_tokens + # self.visual_abstractor_config.encoder_hidden_size = self.vision_config.hidden_size + self.use_decoder_only_language_model = self.text_config.model_type in MODEL_FOR_CAUSAL_LM_MAPPING_NAMES + self.initializer_factor = 1.0 + self.initializer_range = 0.02 + + for attr in dir(self.text_config): + if not hasattr(self, attr): + setattr(self, attr, getattr(self.text_config, attr)) + + @classmethod + def from_vision_visual_abstractor_text_configs( + cls, + vision_config: MplugOwlVisionConfig, + visual_abstractor_config: MplugOwlVisualAbstractorConfig, + text_config: PretrainedConfig, + **kwargs, + ): + r""" + Instantiate a [`MplugOwlConfig`] (or a derived class) from a mPLUG-Owl vision model, Q-Former and language model + configurations. + + Returns: + [`MplugOwlConfig`]: An instance of a configuration object + """ + + return cls( + vision_config=vision_config.to_dict(), + visual_abstractor_config=visual_abstractor_config.to_dict(), + text_config=text_config.to_dict(), + **kwargs, + ) + + def to_dict(self): + """ + Serializes this instance to a Python dictionary. Override the default [`~PretrainedConfig.to_dict`]. + + Returns: + `Dict[str, any]`: Dictionary of all the attributes that make up this configuration instance, + """ + output = copy.deepcopy(self.__dict__) + output["vision_config"] = self.vision_config.to_dict() + output["visual_abstractor_config"] = self.visual_abstractor_config.to_dict() + output["text_config"] = self.text_config.to_dict() + output["model_type"] = self.__class__.model_type + return output diff --git a/lmms_eval/models/mplug_owl_video/modeling_mplug_owl.py b/lmms_eval/models/mplug_owl_video/modeling_mplug_owl.py new file mode 100644 index 000000000..38ef63435 --- /dev/null +++ b/lmms_eval/models/mplug_owl_video/modeling_mplug_owl.py @@ -0,0 +1,1841 @@ +# coding=utf-8 +# Copyright 2022 x-plug The HuggingFace Inc. team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" PyTorch MplugOwl model. """ + +import logging +import math +from typing import Any, Optional, Tuple, Union + +try: + from flash_attn.flash_attn_interface import flash_attn_unpadded_func + + flash_attn_func = flash_attn_unpadded_func +except: + flash_attn_func = None + print("install flash-attn first.") +import math +from dataclasses import dataclass +from typing import Any, Optional, Tuple, Union + +import torch +import torch.utils.checkpoint +from torch import nn +import einops + +from transformers.modeling_outputs import BaseModelOutput, BaseModelOutputWithPooling, BaseModelOutputWithPastAndCrossAttentions +from transformers.modeling_utils import PreTrainedModel +from transformers.pytorch_utils import find_pruneable_heads_and_indices, prune_linear_layer +from transformers.utils import ( + ModelOutput, + add_start_docstrings, + add_start_docstrings_to_model_forward, + logging, + replace_return_docstrings, +) +from transformers.models.auto import AutoModelForCausalLM +from .configuration_mplug_owl import MplugOwlConfig, MplugOwlVisionConfig, MplugOwlVisualAbstractorConfig + + +logger = logging.get_logger(__name__) + +_CHECKPOINT_FOR_DOC = "MAGAer13/mplug-owl-llama-7b" +_CONFIG_FOR_DOC = "MplugOwlConfig" + + +MPLUG_OWL_PRETRAINED_MODEL_ARCHIVE_LIST = [ + "MAGAer13/mplug-owl-llama-7b", + # See all MplugOwl models at https://huggingface.co/models?filter=mplug_owl +] + + +@dataclass +class MplugOwlForConditionalGenerationModelOutput(ModelOutput): + """ + Class defining the outputs of [`MPlugOwlForConditionalGeneration`]. + + Args: + loss (`torch.FloatTensor`, *optional*, returned when `labels` is provided, `torch.FloatTensor` of shape `(1,)`): + Language modeling loss from the language model. + logits (`torch.FloatTensor` of shape `(batch_size, sequence_length, config.vocab_size)`): + Prediction scores of the language modeling head of the language model. + vision_outputs (`BaseModelOutputWithPooling`): + Outputs of the vision encoder. + + language_model_outputs (`CausalLMOutputWithPast` or `Seq2SeqLMOutput`): + Outputs of the language model. + """ + + loss: Optional[Tuple[torch.FloatTensor]] = None + logits: Optional[Tuple[torch.FloatTensor]] = None + vision_outputs: Optional[torch.FloatTensor] = None + language_model_outputs: Optional[Tuple[torch.FloatTensor]] = None + + def to_tuple(self) -> Tuple[Any]: + return tuple(self[k] if k not in ["vision_outputs", "language_model_outputs"] else getattr(self, k).to_tuple() for k in self.keys()) + + +def get_ltor_masks_and_position_ids_from_embeddings(data): + """Build masks and position id for left to right model.""" + + # Extract batch size and sequence length. + micro_batch_size, seq_length = data.size()[:2] + + # Attention mask (lower triangular). + att_mask_batch = 1 + attention_mask = torch.tril(torch.ones((att_mask_batch, seq_length, seq_length), device=data.device)).view(att_mask_batch, 1, seq_length, seq_length) + + # Loss mask. + loss_mask = torch.ones(data.size()[:2], dtype=torch.float, device=data.device) + + # Position ids. + position_ids = torch.arange(seq_length, dtype=torch.long, device=data.device) + position_ids = position_ids.unsqueeze(0).expand_as(data[..., 0]) + + # Convert attention mask to binary: + attention_mask = attention_mask < 0.5 + + return attention_mask, loss_mask, position_ids + + +class MplugOwlVisionEmbeddings(nn.Module): + def __init__(self, config: MplugOwlVisionConfig): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.image_size = config.image_size + self.patch_size = config.patch_size + + self.cls_token = nn.Parameter(torch.randn(1, 1, self.hidden_size)) + + self.patch_embed = nn.Conv2d( + in_channels=3, + out_channels=self.hidden_size, + kernel_size=self.patch_size, + stride=self.patch_size, + bias=False, + ) + + self.num_patches = (self.image_size // self.patch_size) ** 2 + + self.position_embedding = nn.Parameter(torch.randn(1, self.num_patches + 1, self.hidden_size)) + + self.pre_layernorm = LayerNormFp32(self.hidden_size, eps=config.layer_norm_eps) + + def forward(self, pixel_values: torch.FloatTensor) -> torch.Tensor: + # [B, C, T, H, W] or [B, C, H, W] + batch_size = pixel_values.size(0) + T = pixel_values.size(2) if pixel_values.dim() > 4 else 1 + if T > 1: + pixel_values = einops.rearrange(pixel_values, "b c t h w -> (b t) c h w") + image_embeds = self.patch_embed(pixel_values) + image_embeds = image_embeds.flatten(2).transpose(1, 2) + + class_embeds = self.cls_token.expand(batch_size * T, 1, -1).to(image_embeds.dtype) + embeddings = torch.cat([class_embeds, image_embeds], dim=1) + embeddings = embeddings + self.position_embedding[:, : embeddings.size(1)].to(image_embeds.dtype) + embeddings = self.pre_layernorm(embeddings) + embeddings = einops.rearrange(embeddings, "(b t) n d -> b t n d", b=batch_size) + return embeddings + + +class LayerNormFp32(nn.LayerNorm): + """Subclass torch's LayerNorm to handle fp16 (by casting to float32 and back).""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def forward(self, x: torch.Tensor): + output = torch.nn.functional.layer_norm( + x.float(), + self.normalized_shape, + self.weight.float() if self.weight is not None else None, + self.bias.float() if self.bias is not None else None, + self.eps, + ) + return output.type_as(x) + + +class QuickGELU(nn.Module): + def forward(self, x: torch.Tensor): + return x * torch.sigmoid(1.702 * x) + + +class MplugOwlVisionLocalTemporal(nn.Module): + def __init__(self, config): + super(MplugOwlVisionLocalTemporal, self).__init__() + + self.image_size = config.image_size + self.patch_size = config.patch_size + self.num_patches = 1 + (self.image_size // self.patch_size) ** 2 + self.hidden_size = config.hidden_size + d_bottleneck = self.hidden_size // 2 + + self.ln = LayerNormFp32(self.hidden_size) + self.down_proj = nn.Conv3d(self.hidden_size, d_bottleneck, kernel_size=1, stride=1, padding=0) + self.conv = nn.Conv3d(d_bottleneck, d_bottleneck, kernel_size=(3, 1, 1), stride=1, padding=(1, 0, 0), groups=d_bottleneck) + self.up_proj = nn.Conv3d(d_bottleneck, self.hidden_size, kernel_size=1, stride=1, padding=0) + + nn.init.constant_(self.up_proj.weight, 0) + nn.init.constant_(self.up_proj.bias, 0) + + self.activation_func = QuickGELU() + + def forward(self, x): + # [b, t, s, c] + T = x.size(1) + H = int((self.num_patches - 1) ** 0.5) + cls_token, x = x[:, :, 0:1], x[:, :, 1:] + x = self.ln(x) + x = einops.rearrange(x, "b t (h w) c -> b c t h w", h=H) + x = self.down_proj(x) + if self.conv.weight.dtype == torch.bfloat16: + x = torch.nn.functional.conv3d(x.half(), self.conv.weight.half(), bias=self.conv.bias.half(), stride=1, padding=(1, 0, 0), groups=self.conv.weight.shape[0]).to(cls_token.dtype) + else: + x = self.conv(x) + x = self.activation_func(x) + x = self.up_proj(x) + x = einops.rearrange(x, "b c t h w -> b t (h w) c") + x = torch.cat([cls_token, x], dim=2) + return x + + +class MplugOwlVisionAttention(nn.Module): + """Multi-headed attention from 'Attention Is All You Need' paper""" + + def __init__(self, config): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + if self.head_dim * self.num_heads != self.hidden_size: + raise ValueError(f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size} and `num_heads`:" f" {self.num_heads}).") + self.scale = self.head_dim**-0.5 + self.dropout = nn.Dropout(config.attention_dropout) + + self.query_key_value = nn.Linear(self.hidden_size, 3 * self.hidden_size) + self.dense = nn.Linear(self.hidden_size, self.hidden_size) + + def _shape(self, tensor: torch.Tensor, seq_len: int, bsz: int): + return tensor.view(bsz, seq_len, self.num_heads, self.head_dim).transpose(1, 2).contiguous() + + def forward( + self, + hidden_states: torch.Tensor, + head_mask: Optional[torch.Tensor] = None, + output_attentions: Optional[bool] = False, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + """Input shape: Batch x Time x Channel""" + + bsz, seq_len, embed_dim = hidden_states.size() + + mixed_qkv = self.query_key_value(hidden_states) + + mixed_qkv = mixed_qkv.reshape(bsz, seq_len, self.num_heads, 3, embed_dim // self.num_heads).permute(3, 0, 2, 1, 4) # [3, b, np, sq, hn] + query_states, key_states, value_states = ( + mixed_qkv[0], + mixed_qkv[1], + mixed_qkv[2], + ) + # if self.config.use_flash_attn and flash_attn_func is not None: + if False: + # [b*sq, np, hn] + query_states = query_states.permute(0, 2, 1, 3).contiguous() + query_states = query_states.view(query_states.size(0) * query_states.size(1), query_states.size(2), -1) + + key_states = key_states.permute(0, 2, 1, 3).contiguous() + key_states = key_states.view(key_states.size(0) * key_states.size(1), key_states.size(2), -1) + + value_states = value_states.permute(0, 2, 1, 3).contiguous() + value_states = value_states.view(value_states.size(0) * value_states.size(1), value_states.size(2), -1) + + cu_seqlens = torch.arange(0, (bsz + 1) * seq_len, step=seq_len, dtype=torch.int32, device=query_states.device) + + context_layer = flash_attn_func( + query_states, + key_states, + value_states, + cu_seqlens, + cu_seqlens, + seq_len, + seq_len, + self.dropout if self.training else 0.0, + softmax_scale=self.scale, + causal=False, + return_attn_probs=False, + ) + # [b*sq, np, hn] => [b, sq, np, hn] + context_layer = context_layer.view(bsz, seq_len, context_layer.size(1), context_layer.size(2)) + else: + # Take the dot product between "query" and "key" to get the raw attention scores. + attention_scores = torch.matmul(query_states, key_states.transpose(-1, -2)) + + attention_scores = attention_scores * self.scale + + # Normalize the attention scores to probabilities. + attention_probs = torch.softmax(attention_scores, dim=-1) + + # This is actually dropping out entire tokens to attend to, which might + # seem a bit unusual, but is taken from the original Transformer paper. + attention_probs = self.dropout(attention_probs) + + # Mask heads if we want to + if head_mask is not None: + attention_probs = attention_probs * head_mask + + context_layer = torch.matmul(attention_probs, value_states).permute(0, 2, 1, 3) + + new_context_layer_shape = context_layer.size()[:-2] + (self.hidden_size,) + context_layer = context_layer.reshape(new_context_layer_shape) + + output = self.dense(context_layer) + + outputs = (output, attention_probs) if output_attentions else (output, None) + + return outputs + + +class MplugOwlMLP(nn.Module): + def __init__(self, config): + super().__init__() + self.config = config + self.activation_fn = QuickGELU() + self.fc1 = nn.Linear(config.hidden_size, config.intermediate_size) + self.fc2 = nn.Linear(config.intermediate_size, config.hidden_size) + + def forward(self, hidden_states: torch.Tensor) -> torch.Tensor: + hidden_states = self.fc1(hidden_states) + hidden_states = self.activation_fn(hidden_states) + hidden_states = self.fc2(hidden_states) + return hidden_states + + +class MplugOwlVisionEncoderLayer(nn.Module): + def __init__(self, config: MplugOwlVisionConfig): + super().__init__() + self.hidden_size = config.hidden_size + self.temporal = MplugOwlVisionLocalTemporal(config) + self.self_attn = MplugOwlVisionAttention(config) + self.input_layernorm = LayerNormFp32(self.hidden_size, eps=config.layer_norm_eps) + self.mlp = MplugOwlMLP(config) + self.post_attention_layernorm = LayerNormFp32(self.hidden_size, eps=config.layer_norm_eps) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: torch.Tensor, + output_attentions: Optional[bool] = False, + ) -> Tuple[torch.FloatTensor]: + """ + Args: + hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, time, seq_len, embed_dim)` + attention_mask (`torch.FloatTensor`): attention mask of size + `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values. + `(config.encoder_attention_heads,)`. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more detail. + """ + B, T = hidden_states.size(0), hidden_states.size(1) + if T > 1: + hidden_states = hidden_states + self.temporal(hidden_states) + hidden_states = einops.rearrange(hidden_states, "b t n d -> (b t) n d") + + residual = hidden_states + + hidden_states = self.input_layernorm(hidden_states) + hidden_states, attn_weights = self.self_attn( + hidden_states=hidden_states, + head_mask=attention_mask, + output_attentions=output_attentions, + ) + hidden_states = hidden_states + residual + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + + hidden_states = hidden_states + residual + hidden_states = einops.rearrange(hidden_states, "(b t) n d -> b t n d", b=B) + + outputs = (hidden_states,) + + if output_attentions: + outputs += (attn_weights,) + + return outputs + + +class MplugOwlPreTrainedModel(PreTrainedModel): + """ + An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained + models. + """ + + config_class = MplugOwlConfig + base_model_prefix = "mplug_owl" + supports_gradient_checkpointing = True + _keys_to_ignore_on_load_missing = [ + r"position_ids", + r"language_model.encoder.embed_tokens.weight", + r"language_model.decoder.embed_tokens.weight", + r"language_model.lm_head.weight", + ] + _no_split_modules = [ + "MplugOwlVisionEncoderLayer", + "LlamaDecoderLayer", + "MplugOwlVisualAbstractorLayer", + "LlamaForCausalLM", + "Parameter", + ] + _keep_in_fp32_modules = ["wo"] + + def _init_weights(self, module): + """Initialize the weights""" + factor = self.config.initializer_range + if isinstance(module, nn.Conv2d) or isinstance(module, nn.Embedding) or isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=factor) + if hasattr(module, "bias") and module.bias is not None: + module.bias.data.zero_() + + if isinstance(module, MplugOwlVisionEmbeddings): + if hasattr(self.config, "vision_config"): + factor = self.config.vision_config.initializer_range + nn.init.trunc_normal_(module.position_embedding, mean=0.0, std=factor) + nn.init.trunc_normal_(module.cls_token, mean=0.0, std=factor) + + elif isinstance(module, nn.LayerNorm): + module.bias.data.zero_() + module.weight.data.fill_(1.0) + elif isinstance(module, nn.Linear) and module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Parameter): + raise ValueError + nn.init.trunc_normal_(module.data, mean=0.0, std=factor) + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, MplugOwlVisionEncoder): + module.gradient_checkpointing = value + + +MPLUG_OWL_START_DOCSTRING = r""" + This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the + library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads + etc.) + + This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. + Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage + and behavior. + + Parameters: + config ([`MplugOwlConfig`]): Model configuration class with all the parameters of the model. + Initializing with a config file does not load the weights associated with the model, only the + configuration. Check out the [`~PreTrainedModel.from_pretrained`] method to load the model weights. +""" + +MPLUG_OWL_VISION_INPUTS_DOCSTRING = r""" + Args: + pixel_values (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`): + Pixel values. Pixel values can be obtained using [`MplugOwlProcessor`]. See [`MplugOwlProcessor.__call__`] for + details. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned + tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for + more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. +""" + +MPLUG_OWL_TEXT_INPUTS_DOCSTRING = r""" + Args: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide + it. Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. [What are input IDs?](../glossary#input-ids) + attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + [What are attention masks?](../glossary#attention-mask) + decoder_input_ids (`torch.LongTensor` of shape `(batch_size, target_sequence_length)`, *optional*): + Indices of decoder input sequence tokens in the vocabulary. + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + [What are decoder input IDs?](../glossary#decoder-input-ids) + + T5 uses the `pad_token_id` as the starting token for `decoder_input_ids` generation. If `past_key_values` + is used, optionally only the last `decoder_input_ids` have to be input (see `past_key_values`). + + To know more on how to prepare `decoder_input_ids` for pretraining take a look at [T5 + Training](./t5#training). + decoder_attention_mask (`torch.BoolTensor` of shape `(batch_size, target_sequence_length)`, *optional*): + Default behavior: generate a tensor that ignores pad tokens in `decoder_input_ids`. Causal mask will also + be used by default. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned + tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for + more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. +""" + +MPLUG_OWL_INPUTS_DOCSTRING = r""" + Args: + pixel_values (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`): + Pixel values. Pixel values can be obtained using [`MplugOwlProcessor`]. See [`MplugOwlProcessor.__call__`] for + details. + + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Indices of input sequence tokens in the vocabulary of the language model. Input tokens can optionally be + provided to serve as text prompt, which the language model can continue. + + Indices can be obtained using [`MplugOwlProcessor`]. See [`MplugOwlProcessor.__call__`] for details. + + [What are input IDs?](../glossary#input-ids) + attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + + [What are attention masks?](../glossary#attention-mask) + + decoder_input_ids (`torch.LongTensor` of shape `(batch_size, target_sequence_length)`, *optional*): + Indices of decoder input sequence tokens in the vocabulary of the language model. Only relevant in case an + encoder-decoder language model (like T5) is used. + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. [What are decoder input IDs?](../glossary#decoder-input-ids) + + decoder_attention_mask (`torch.BoolTensor` of shape `(batch_size, target_sequence_length)`, *optional*): + Default behavior: generate a tensor that ignores pad tokens in `decoder_input_ids`. Causal mask will also + be used by default. + + Only relevant in case an encoder-decoder language model (like T5) is used. + + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned + tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for + more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. +""" + + +class MplugOwlVisionEncoder(nn.Module): + """ + Transformer encoder consisting of `config.num_hidden_layers` self attention layers. Each layer is a + [`MplugOwlVisionEncoderLayer`]. + + Args: + config (`MplugOwlVisionConfig`): + The corresponding vision configuration for the `MplugOwlEncoder`. + """ + + def __init__(self, config: MplugOwlVisionConfig): + super().__init__() + self.config = config + self.layers = nn.ModuleList([MplugOwlVisionEncoderLayer(config) for _ in range(config.num_hidden_layers)]) + self.gradient_checkpointing = False + + def forward( + self, + inputs_embeds, + attention_mask: Optional[torch.Tensor] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutput]: + r""" + Args: + inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`): + Embedded representation of the inputs. Should be float, not int tokens. + attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + + [What are attention masks?](../glossary#attention-mask) + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors + for more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. + """ + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + encoder_states = () if output_hidden_states else None + all_attentions = () if output_attentions else None + + hidden_states = inputs_embeds + for idx, encoder_layer in enumerate(self.layers): + if output_hidden_states: + encoder_states = encoder_states + (hidden_states,) + if self.gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs, output_attentions) + + return custom_forward + + layer_outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(encoder_layer), + hidden_states, + attention_mask, + ) + else: + layer_outputs = encoder_layer( + hidden_states, + attention_mask, + output_attentions=output_attentions, + ) + + hidden_states = layer_outputs[0] + + if output_attentions: + all_attentions = all_attentions + (layer_outputs[1],) + + if output_hidden_states: + encoder_states = encoder_states + (hidden_states,) + + if not return_dict: + return tuple(v for v in [hidden_states, encoder_states, all_attentions] if v is not None) + return BaseModelOutput(last_hidden_state=hidden_states, hidden_states=encoder_states, attentions=all_attentions) + + +class MplugOwlVisionModel(MplugOwlPreTrainedModel): + main_input_name = "pixel_values" + config_class = MplugOwlVisionConfig + + def __init__(self, config: MplugOwlVisionConfig): + super().__init__(config) + self.config = config + self.hidden_size = config.hidden_size + + self.embeddings = MplugOwlVisionEmbeddings(config) + self.encoder = MplugOwlVisionEncoder(config) + self.post_layernorm = LayerNormFp32(self.hidden_size, eps=config.layer_norm_eps) + + self.post_init() + + @add_start_docstrings_to_model_forward(MPLUG_OWL_VISION_INPUTS_DOCSTRING) + @replace_return_docstrings(output_type=BaseModelOutputWithPooling, config_class=MplugOwlVisionConfig) + def forward( + self, + pixel_values: Optional[torch.FloatTensor] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPooling]: + r""" + Returns: + + """ + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + if pixel_values is None: + raise ValueError("You have to specify pixel_values") + + hidden_states = self.embeddings(pixel_values) # [B, T, N, D] + + encoder_outputs = self.encoder( + inputs_embeds=hidden_states, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + last_hidden_state = encoder_outputs[0] + last_hidden_state = self.post_layernorm(last_hidden_state) + + pooled_output = last_hidden_state[:, :, 0, :].mean(1) + pooled_output = self.post_layernorm(pooled_output) + + if not return_dict: + return (last_hidden_state, pooled_output) + encoder_outputs[1:] + + return BaseModelOutputWithPooling( + last_hidden_state=last_hidden_state, + pooler_output=pooled_output, + hidden_states=encoder_outputs.hidden_states, + attentions=encoder_outputs.attentions, + ) + + def get_input_embeddings(self): + return self.embeddings + + +class MplugOwlVisualAbstractorMLP(nn.Module): + def __init__(self, config: MplugOwlVisualAbstractorConfig): + super().__init__() + self.config = config + in_features = config.hidden_size + hidden_features = config.intermediate_size + if hidden_features != 2816: + hidden_features = int(2 * hidden_features / 3) + multiple_of = 256 + hidden_features = multiple_of * ((hidden_features + multiple_of - 1) // multiple_of) + self.act = nn.SiLU() + + self.w1 = nn.Linear(in_features, hidden_features) + self.w2 = nn.Linear(hidden_features, in_features) + self.w3 = nn.Linear(in_features, hidden_features) + self.ffn_ln = LayerNormFp32(hidden_features, eps=config.layer_norm_eps) + + def forward(self, hidden_states: torch.Tensor) -> torch.Tensor: + hidden_states = self.act(self.w1(hidden_states)) * self.w3(hidden_states) + hidden_states = self.ffn_ln(hidden_states) + hidden_states = self.w2(hidden_states) + return hidden_states + + +class MplugOwlVisualAbstractorMultiHeadAttention(nn.Module): + def __init__(self, config: MplugOwlVisualAbstractorConfig): + super().__init__() + self.config = config + if config.hidden_size % config.num_attention_heads != 0: + raise ValueError("The hidden size (%d) is not a multiple of the number of attention heads (%d)" % (config.hidden_size, config.num_attention_heads)) + + self.num_attention_heads = config.num_attention_heads + self.attention_head_size = int(config.hidden_size / config.num_attention_heads) + self.all_head_size = self.num_attention_heads * self.attention_head_size + + self.query = nn.Linear(config.hidden_size, self.all_head_size) + self.key = nn.Linear(config.encoder_hidden_size, self.all_head_size) + self.value = nn.Linear(config.encoder_hidden_size, self.all_head_size) + + self.dropout = nn.Dropout(config.attention_probs_dropout_prob) + self.save_attention = False + + def save_attn_gradients(self, attn_gradients): + self.attn_gradients = attn_gradients + + def get_attn_gradients(self): + return self.attn_gradients + + def save_attention_map(self, attention_map): + self.attention_map = attention_map + + def get_attention_map(self): + return self.attention_map + + def transpose_for_scores(self, x): + new_x_shape = x.size()[:-1] + (self.num_attention_heads, self.attention_head_size) + x = x.view(*new_x_shape) + return x.permute(0, 2, 1, 3) + + def forward( + self, + hidden_states, + attention_mask=None, + head_mask=None, + encoder_hidden_states=None, + encoder_attention_mask=None, + past_key_value=None, + output_attentions=False, + ): + # If this is instantiated as a cross-attention module, the keys + # and values come from an encoder; the attention mask needs to be + # such that the encoder's padding tokens are not attended to. + key_layer = self.transpose_for_scores(self.key(encoder_hidden_states)) + value_layer = self.transpose_for_scores(self.value(encoder_hidden_states)) + attention_mask = encoder_attention_mask + + mixed_query_layer = self.query(hidden_states) + + query_layer = self.transpose_for_scores(mixed_query_layer) + + past_key_value = (key_layer, value_layer) + + # Take the dot product between "query" and "key" to get the raw attention scores. + attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2)) + + attention_scores = attention_scores / math.sqrt(self.attention_head_size) + + if attention_mask is not None: + # Apply the attention mask is (precomputed for all layers in BertModel forward() function) + attention_scores = attention_scores + attention_mask + + # Normalize the attention scores to probabilities. + attention_probs = nn.Softmax(dim=-1)(attention_scores) + + if self.save_attention: + self.save_attention_map(attention_probs) + attention_probs.register_hook(self.save_attn_gradients) + + # This is actually dropping out entire tokens to attend to, which might + # seem a bit unusual, but is taken from the original Transformer paper. + attention_probs_dropped = self.dropout(attention_probs) + + # Mask heads if we want to + if head_mask is not None: + attention_probs_dropped = attention_probs_dropped * head_mask + + context_layer = torch.matmul(attention_probs_dropped, value_layer) + + context_layer = context_layer.permute(0, 2, 1, 3).contiguous() + new_context_layer_shape = context_layer.size()[:-2] + (self.all_head_size,) + context_layer = context_layer.view(*new_context_layer_shape) + + outputs = (context_layer, attention_probs) if output_attentions else (context_layer,) + + outputs = outputs + (past_key_value,) + return outputs + + +class MplugOwlVisualAbstractorCrossOutput(nn.Module): + def __init__(self, config: MplugOwlVisualAbstractorConfig): + super().__init__() + dim = config.hidden_size + self.out_proj = nn.Linear(dim, dim, bias=True) + self.norm2 = LayerNormFp32(dim) + self.mlp = MplugOwlVisualAbstractorMLP(config) + + def forward(self, hidden_states: torch.Tensor, input_tensor: torch.Tensor) -> torch.Tensor: + input_tensor = input_tensor + self.out_proj(hidden_states) + input_tensor = input_tensor + self.mlp(self.norm2(input_tensor)) + return input_tensor + + +class MplugOwlVisualAbstractorAttention(nn.Module): + def __init__(self, config: MplugOwlVisualAbstractorConfig): + super().__init__() + self.attention = MplugOwlVisualAbstractorMultiHeadAttention(config) + self.output = MplugOwlVisualAbstractorCrossOutput(config) + self.pruned_heads = set() + self.norm1 = LayerNormFp32(config.hidden_size) + self.normk = LayerNormFp32(config.hidden_size) + + def prune_heads(self, heads): + if len(heads) == 0: + return + heads, index = find_pruneable_heads_and_indices(heads, self.attention.num_attention_heads, self.attention.attention_head_size, self.pruned_heads) + + # Prune linear layers + self.attention.query = prune_linear_layer(self.attention.query, index) + self.attention.key = prune_linear_layer(self.attention.key, index) + self.attention.value = prune_linear_layer(self.attention.value, index) + self.output.dense = prune_linear_layer(self.output.out_proj, index, dim=1) + + # Update hyper params and store pruned heads + self.attention.num_attention_heads = self.attention.num_attention_heads - len(heads) + self.attention.all_head_size = self.attention.attention_head_size * self.attention.num_attention_heads + self.pruned_heads = self.pruned_heads.union(heads) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.FloatTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + past_key_value: Optional[Tuple[Tuple[torch.FloatTensor]]] = None, + output_attentions: Optional[bool] = False, + ) -> Tuple[torch.Tensor]: + # HACK we apply norm on q and k + hidden_states = self.norm1(hidden_states) + encoder_hidden_states = self.normk(encoder_hidden_states) + encoder_hidden_states = torch.cat([hidden_states, encoder_hidden_states], dim=1) + encoder_attention_mask = torch.cat([attention_mask, encoder_attention_mask], dim=-1) + self_outputs = self.attention( + hidden_states, + attention_mask, + head_mask, + encoder_hidden_states, + encoder_attention_mask, + past_key_value, + output_attentions, + ) + attention_output = self.output(self_outputs[0], hidden_states) + # add attentions if we output them + outputs = (attention_output,) + self_outputs[1:] + return outputs + + +class MplugOwlVisualAbstractorLayer(nn.Module): + def __init__(self, config, layer_idx): + super().__init__() + self.chunk_size_feed_forward = config.chunk_size_feed_forward + self.seq_len_dim = 1 + + self.layer_idx = layer_idx + + self.crossattention = MplugOwlVisualAbstractorAttention(config) + self.has_cross_attention = True + + def forward( + self, + hidden_states, + attention_mask=None, + head_mask=None, + encoder_hidden_states=None, + encoder_attention_mask=None, + output_attentions=False, + ): + if encoder_hidden_states is None: + raise ValueError("encoder_hidden_states must be given for cross-attention layers") + cross_attention_outputs = self.crossattention( + hidden_states, + attention_mask, + head_mask, + encoder_hidden_states, + encoder_attention_mask, + output_attentions=output_attentions, + ) + query_attention_output = cross_attention_outputs[0] + + outputs = (query_attention_output,) + return outputs + + +class MplugOwlVisualAbstractorEncoder(nn.Module): + def __init__(self, config): + super().__init__() + self.config = config + self.layers = nn.ModuleList([MplugOwlVisualAbstractorLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)]) + self.gradient_checkpointing = False + + def forward( + self, + hidden_states, + attention_mask=None, + head_mask=None, + encoder_hidden_states=None, + encoder_attention_mask=None, + past_key_values=None, + output_attentions=False, + output_hidden_states=False, + return_dict=True, + ): + all_hidden_states = () if output_hidden_states else None + + for i in range(self.config.num_hidden_layers): + layer_module = self.layers[i] + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + layer_head_mask = head_mask[i] if head_mask is not None else None + past_key_value = past_key_values[i] if past_key_values is not None else None + + if getattr(self.config, "gradient_checkpointing", False) and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs, past_key_value, output_attentions) + + return custom_forward + + layer_outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(layer_module), + hidden_states, + attention_mask, + layer_head_mask, + encoder_hidden_states, + encoder_attention_mask, + ) + else: + layer_outputs = layer_module( + hidden_states, + attention_mask, + layer_head_mask, + encoder_hidden_states, + encoder_attention_mask, + output_attentions, + ) + + hidden_states = layer_outputs[0] + + return BaseModelOutput( + last_hidden_state=hidden_states, + ) + + +class MplugOwlVisualAbstractorModel(MplugOwlPreTrainedModel): + def __init__(self, config: MplugOwlVisualAbstractorConfig, language_hidden_size): + super().__init__(config) + self.config = config + + self.encoder = MplugOwlVisualAbstractorEncoder(config) + self.visual_fc = torch.nn.Linear(config.hidden_size, language_hidden_size) + self.temporal_visual_fc = torch.nn.Linear(config.hidden_size, language_hidden_size) + self.vit_eos = torch.nn.Parameter(torch.randn(1, 1, language_hidden_size)) + nn.init.trunc_normal_(self.vit_eos, mean=0.0, std=self.config.initializer_range) + self.post_init() + + def _prune_heads(self, heads_to_prune): + """ + Prunes heads of the model. heads_to_prune: dict of {layer_num: list of heads to prune in this layer} See base + class PreTrainedModel + """ + for layer, heads in heads_to_prune.items(): + self.encoder.layer[layer].attention.prune_heads(heads) + + def get_extended_attention_mask( + self, + attention_mask: torch.Tensor, + input_shape: Tuple[int], + device: torch.device, + ) -> torch.Tensor: + """ + Makes broadcastable attention and causal masks so that future and masked tokens are ignored. + + Arguments: + attention_mask (`torch.Tensor`): + Mask with ones indicating tokens to attend to, zeros for tokens to ignore. + input_shape (`Tuple[int]`): + The shape of the input to the model. + device: (`torch.device`): + The device of the input to the model. + + Returns: + `torch.Tensor` The extended attention mask, with a the same dtype as `attention_mask.dtype`. + """ + # We can provide a self-attention mask of dimensions [batch_size, from_seq_length, to_seq_length] + # ourselves in which case we just need to make it broadcastable to all heads. + if attention_mask.dim() == 3: + extended_attention_mask = attention_mask[:, None, :, :] + elif attention_mask.dim() == 2: + # Provided a padding mask of dimensions [batch_size, seq_length] + # - the model is an encoder, so make the mask broadcastable to [batch_size, num_heads, seq_length, seq_length] + extended_attention_mask = attention_mask[:, None, None, :] + else: + raise ValueError("Wrong shape for input_ids (shape {}) or attention_mask (shape {})".format(input_shape, attention_mask.shape)) + + # Since attention_mask is 1.0 for positions we want to attend and 0.0 for + # masked positions, this operation will create a tensor which is 0.0 for + # positions we want to attend and -10000.0 for masked positions. + # Since we are adding it to the raw scores before the softmax, this is + # effectively the same as removing these entirely. + extended_attention_mask = extended_attention_mask.to(dtype=self.dtype) # fp16 compatibility + extended_attention_mask = (1.0 - extended_attention_mask) * -10000.0 + return extended_attention_mask + + def forward( + self, + query_embeds, + temporal_query_embeds=None, + attention_mask=None, + head_mask=None, + encoder_hidden_states=None, + encoder_attention_mask=None, + past_key_values=None, + output_attentions=None, + output_hidden_states=None, + return_dict=None, + ): + r""" + encoder_hidden_states (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, `optional`): + Sequence of hidden-states at the output of the last layer of the encoder. Used in the cross-attention if + the model is configured as a decoder. + encoder_attention_mask (`torch.FloatTensor` of shape `(batch_size, sequence_length)`, `optional`): + Mask to avoid performing attention on the padding token indices of the encoder input. This mask is used in + the cross-attention if the model is configured as a decoder. Mask values selected in `[0, 1]`: + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + past_key_values (`tuple(tuple(torch.FloatTensor))` of length `config.n_layers` with each tuple having 4 tensors of: + shape `(batch_size, num_heads, sequence_length - 1, embed_size_per_head)`): Contains precomputed key and + value hidden states of the attention blocks. Can be used to speed up decoding. If `past_key_values` are + used, the user can optionally input only the last `decoder_input_ids` (those that don't have their past key + value states given to this model) of shape `(batch_size, 1)` instead of all `decoder_input_ids` of shape + `(batch_size, sequence_length)`. + """ + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + T = encoder_hidden_states.size(1) + if T == 1 or temporal_query_embeds is None: + embedding_output = query_embeds + else: + embedding_output = torch.cat([query_embeds, temporal_query_embeds], dim=1) + input_shape = embedding_output.size()[:-1] + batch_size, seq_length = input_shape + device = embedding_output.device + + encoder_hidden_states = einops.rearrange(encoder_hidden_states, "b t n d -> b (t n) d") + + # We can provide a self-attention mask of dimensions [batch_size, from_seq_length, to_seq_length] + # ourselves in which case we just need to make it broadcastable to all heads. + if attention_mask is None: + attention_mask = torch.ones((embedding_output.shape[0], embedding_output.shape[1]), dtype=torch.long, device=embedding_output.device) + extended_attention_mask = self.get_extended_attention_mask(attention_mask, input_shape, device) + + # If a 2D or 3D attention mask is provided for the cross-attention + # we need to make broadcastable to [batch_size, num_heads, seq_length, seq_length] + if encoder_hidden_states is not None: + if type(encoder_hidden_states) == list: + encoder_batch_size, encoder_sequence_length, _ = encoder_hidden_states[0].size() + else: + ( + encoder_batch_size, + encoder_sequence_length, + _, + ) = encoder_hidden_states.size() + encoder_hidden_shape = (encoder_batch_size, encoder_sequence_length) + + if type(encoder_attention_mask) == list: + encoder_extended_attention_mask = [self.invert_attention_mask(mask) for mask in encoder_attention_mask] + elif encoder_attention_mask is None: + encoder_attention_mask = torch.ones(encoder_hidden_shape, device=device) + encoder_extended_attention_mask = self.invert_attention_mask(encoder_attention_mask) + else: + encoder_extended_attention_mask = self.invert_attention_mask(encoder_attention_mask) + else: + encoder_extended_attention_mask = None + + # Prepare head mask if needed + # 1.0 in head_mask indicate we keep the head + # attention_probs has shape bsz x n_heads x N x N + # input head_mask has shape [num_heads] or [num_hidden_layers x num_heads] + # and head_mask is converted to shape [num_hidden_layers x batch x num_heads x seq_length x seq_length] + head_mask = self.get_head_mask(head_mask, self.config.num_hidden_layers) + + encoder_outputs = self.encoder( + embedding_output, + attention_mask=extended_attention_mask, + head_mask=head_mask, + encoder_hidden_states=encoder_hidden_states, + encoder_attention_mask=encoder_extended_attention_mask, + past_key_values=past_key_values, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + sequence_output = encoder_outputs[0] + pooled_output = sequence_output[:, 0, :] + + if T == 1 or temporal_query_embeds is None: + temporal_sequence_output = None + else: + temporal_sequence_output = sequence_output[:, query_embeds.size(1) :] + sequence_output = sequence_output[:, : query_embeds.size(1)] + + sequence_output = self.visual_fc(sequence_output) + if temporal_sequence_output is not None: + sequence_output += self.temporal_visual_fc(temporal_sequence_output) + sequence_output = torch.cat([sequence_output, self.vit_eos.repeat(sequence_output.shape[0], 1, 1)], dim=1) + + return BaseModelOutputWithPooling( + last_hidden_state=sequence_output, + pooler_output=pooled_output, + hidden_states=encoder_outputs.hidden_states, + ) + + +@add_start_docstrings( + """ + mPLUG-Owl Model for generating text and image features. The model consists of a vision encoder, Querying Transformer + (Q-Former) and a language model. + """, + MPLUG_OWL_START_DOCSTRING, +) +class MplugOwlModel(MplugOwlPreTrainedModel): + config_class = MplugOwlConfig + main_input_name = "pixel_values" + + def __init__(self, config: MplugOwlConfig, *inputs, **kwargs): + super().__init__(config, *inputs, **kwargs) + + self.vision_model = MplugOwlVisionModel(config.vision_config) + + self.query_tokens = nn.Parameter(torch.zeros(1, config.num_query_tokens, config.visual_abstractor_config.hidden_size)) + self.temporal_query_tokens = nn.Parameter(torch.zeros(1, config.num_query_tokens, config.visual_abstractor_config.hidden_size)) + self.abstractor = MplugOwlVisualAbstractorModel(config.visual_abstractor_config, config.text_config.hidden_size) + + # if config.use_decoder_only_language_model: + # from llama.modeling_llama import LlamaForCausalLM + language_model = AutoModelForCausalLM.from_config(config.text_config) + # else: + # language_model = AutoModelForSeq2SeqLM.from_config(config.text_config) + self.language_model = language_model + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.language_model.get_input_embeddings() + + def set_input_embeddings(self, value): + self.language_model.set_input_embeddings(value) + + def set_output_embeddings(self, new_embeddings): + self.language_model.set_output_embeddings(new_embeddings) + + def get_output_embeddings(self) -> nn.Module: + return self.language_model.get_output_embeddings() + + def get_encoder(self): + return self.language_model.get_encoder() + + def get_decoder(self): + return self.language_model.get_decoder() + + def _tie_weights(self): + if not self.config.use_decoder_only_language_model: + self.language_model.encoder.embed_tokens = self.language_model.shared + self.language_model.decoder.embed_tokens = self.language_model.shared + + def get_text_features( + self, + input_ids: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.Tensor] = None, + decoder_input_ids: Optional[torch.Tensor] = None, + decoder_attention_mask: Optional[torch.Tensor] = None, + labels: Optional[torch.Tensor] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ): + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + if self.config.use_decoder_only_language_model: + text_outputs = self.language_model( + input_ids=input_ids, + attention_mask=attention_mask, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + else: + inputs_embeds = self.language_model.get_input_embeddings()(input_ids) + + text_outputs = self.language_model( + inputs_embeds=inputs_embeds, + attention_mask=attention_mask, + decoder_input_ids=decoder_input_ids, + decoder_attention_mask=decoder_attention_mask, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + labels=labels, + ) + + return text_outputs + + def get_image_features( + self, + pixel_values: Optional[torch.FloatTensor] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ): + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + vision_outputs = self.vision_model( + pixel_values=pixel_values, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + return vision_outputs + + +def get_media_indices(my_list): + if isinstance(my_list, torch.Tensor): + my_list = my_list.cpu().tolist() + result = [] + for i in range(len(my_list)): + if i == 0 and my_list[i] < 0: + result.append(i) + elif my_list[i] != my_list[i - 1] and my_list[i] < 0: + result.append(i) + return result + + +def get_media_types(tensors, positions): + if isinstance(tensors, torch.Tensor): + tensors = tensors.cpu().tolist() + result = [] + for pos in positions: + result.append(tensors[pos]) + return result + + +@add_start_docstrings( + """ + mPLUG-Owl Model for generating text given an image and an optional text prompt. + """, + MPLUG_OWL_START_DOCSTRING, +) +class MplugOwlForConditionalGeneration(MplugOwlPreTrainedModel): + config_class = MplugOwlConfig + main_input_name = "pixel_values" + + def __init__(self, config: MplugOwlConfig): + super().__init__(config) + + self.vision_model = MplugOwlVisionModel(config.vision_config) + + self.query_tokens = nn.Parameter(torch.zeros(1, config.num_query_tokens, config.visual_abstractor_config.hidden_size)) + self.temporal_query_tokens = nn.Parameter(torch.zeros(1, config.num_query_tokens, config.visual_abstractor_config.hidden_size)) + self.abstractor = MplugOwlVisualAbstractorModel(config.visual_abstractor_config, config.text_config.hidden_size) + + # if config.use_decoder_only_language_model: + # from llama.modeling_llama import LlamaForCausalLM + language_model = AutoModelForCausalLM.from_config(config.text_config) + # else: + # language_model = AutoModelForSeq2SeqLM.from_config(config.text_config) + self.language_model = language_model + + # Initialize weights and apply final processing + self.post_init() + self.main_input_name = "input_ids" + from transformers import GenerationConfig + + self.generation_config = GenerationConfig(max_length=512, do_sample=True, top_k=3, pad_token_id=0, unk_token_id=0, bos_token_id=1, eos_token_id=2) + + # Hack Bloom + if config.text_config.model_type == "bloom": + bound_method = bloom_forward.__get__(self.language_model.transformer, self.language_model.transformer.__class__) + setattr(self.language_model.transformer, "forward", bound_method) + + def get_input_embeddings(self): + return self.language_model.get_input_embeddings() + + def set_input_embeddings(self, value): + self.language_model.set_input_embeddings(value) + + def set_output_embeddings(self, new_embeddings): + self.language_model.set_output_embeddings(new_embeddings) + + def get_output_embeddings(self) -> nn.Module: + return self.language_model.get_output_embeddings() + + def get_encoder(self): + return self.language_model.get_encoder() + + def get_decoder(self): + return self.language_model.get_decoder() + + def _tie_weights(self): + if not self.config.use_decoder_only_language_model: + self.language_model.encoder.embed_tokens = self.language_model.shared + self.language_model.decoder.embed_tokens = self.language_model.shared + + def _preprocess_accelerate(self): + r""" + Some pre-processing hacks to make the model `accelerate` compatible. Check + https://github.com/huggingface/transformers/pull/21707 for more details. + """ + hf_device_map = self.hf_device_map + + if len(hf_device_map) > 1 and "language_model" not in hf_device_map and torch.cuda.device_count() > 1: + # warn users about unexpected behavior when using multi-GPU + mPLUG-Owl + `accelerate`. + logger.warning( + "The `language_model` is not in the `hf_device_map` dictionary and you are running your script" + " in a multi-GPU environment. this may lead to unexpected behavior when using `accelerate`." + " Please pass a `device_map` that contains `language_model` to remove this warning." + " Please refer to https://github.com/huggingface/blog/blob/main/accelerate-large-models.md for" + " more details on creating a `device_map` for large models.", + ) + + if hasattr(self.language_model, "_hf_hook"): + self.language_model._hf_hook.io_same_device = True # For `generate` compatibility + + @add_start_docstrings_to_model_forward(MPLUG_OWL_INPUTS_DOCSTRING) + @replace_return_docstrings(output_type=MplugOwlForConditionalGenerationModelOutput, config_class=MplugOwlVisionConfig) + def forward( + self, + pixel_values: torch.FloatTensor, + video_pixel_values: torch.FloatTensor, + input_ids: torch.FloatTensor, + num_images, + num_videos, + non_padding_mask: Optional[torch.LongTensor] = None, + non_media_mask: Optional[torch.LongTensor] = None, + prompt_mask: Optional[torch.LongTensor] = None, + attention_mask: Optional[torch.LongTensor] = None, + decoder_input_ids: Optional[torch.LongTensor] = None, + decoder_attention_mask: Optional[torch.LongTensor] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + labels: Optional[torch.LongTensor] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, MplugOwlForConditionalGenerationModelOutput]: + r""" + Returns: + + Examples: + + Image captioning (without providing a text prompt): + + ```python + >>> from PIL import Image + >>> import requests + >>> from transformers import MplugOwlProcessor, MplugOwlForConditionalGeneration + >>> import torch + + >>> device = "cuda" if torch.cuda.is_available() else "cpu" + + >>> processor = MplugOwlProcessor.from_pretrained("x-plug/x_plug-llama-7b") + >>> model = MplugOwlForConditionalGeneration.from_pretrained( + ... "x-plug/x_plug-llama-7b", torch_dtype=torch.float16 + ... ) + >>> model.to(device) # doctest: +IGNORE_RESULT + + >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg" + >>> image = Image.open(requests.get(url, stream=True).raw) + + >>> inputs = processor(images=image, return_tensors="pt").to(device, torch.float16) + + >>> generated_ids = model.generate(**inputs) + >>> generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0].strip() + >>> print(generated_text) + two cats laying on a couch + ``` + + Visual question answering (prompt = question): + + ```python + >>> from PIL import Image + >>> import requests + >>> from transformers import MplugOwlProcessor, MplugOwlForConditionalGeneration + >>> import torch + + >>> device = "cuda" if torch.cuda.is_available() else "cpu" + + >>> processor = MplugOwlProcessor.from_pretrained("x-plug/x_plug-llama-7b") + >>> model = MplugOwlForConditionalGeneration.from_pretrained( + ... "x-plug/x_plug-llama-7b", torch_dtype=torch.float16 + ... ) + >>> model.to(device) # doctest: +IGNORE_RESULT + + >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg" + >>> image = Image.open(requests.get(url, stream=True).raw) + + >>> prompt = "Question: how many cats are there? Answer:" + >>> inputs = processor(images=image, text=prompt, return_tensors="pt").to(device, torch.float16) + + >>> generated_ids = model.generate(**inputs) + >>> generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0].strip() + >>> print(generated_text) + two + ```""" + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # get text embedding + text_tokens_ = input_ids.clone() + batch_size = input_ids.shape[0] + # labels = text_tokens_[:, 1:].clone().contiguous() + + media_token_indices = [ + # [:-1] since we would not use the last token for embedding + get_media_indices(text_tokens_[i][:-1]) + for i in range(batch_size) + ] + + media_token_types = [get_media_types(text_tokens_[i][:-1], media_token_indices[i]) for i in range(batch_size)] + + text_tokens_[text_tokens_ < 0] = 1 # Not used + # text_tokens = text_tokens_[:, :-1].contiguous() + text_embeds = self.get_input_embeddings()(text_tokens_) # Temporally Embedding + + if pixel_values is not None: + image_embeds = self.vision_model(pixel_values, return_dict=True).last_hidden_state + + image_attention_mask = torch.ones(image_embeds.size()[:-1], dtype=torch.long, device=image_embeds.device) + query_tokens = self.query_tokens.expand(image_embeds.shape[0], -1, -1) + temporal_query_tokens = self.temporal_query_tokens.expand(image_embeds.shape[0], -1, -1) + + query_features = self.abstractor( + query_embeds=query_tokens, + encoder_hidden_states=image_embeds, + encoder_attention_mask=image_attention_mask, + )["last_hidden_state"] + img_seq_length = query_features.shape[1] + + if video_pixel_values is not None: + video_embeds = self.vision_model(video_pixel_values, return_dict=True).last_hidden_state + + video_attention_mask = torch.ones(video_embeds.size()[:-1], dtype=torch.long, device=video_embeds.device) + video_attention_mask = einops.rearrange(video_attention_mask, "b t n -> b (t n)") + query_tokens = self.query_tokens.expand(video_embeds.shape[0], -1, -1) + temporal_query_tokens = self.temporal_query_tokens.expand(video_embeds.shape[0], -1, -1) + + video_query_features = self.abstractor( + query_embeds=query_tokens, + temporal_query_embeds=temporal_query_tokens, + encoder_hidden_states=video_embeds, + encoder_attention_mask=video_attention_mask, + )["last_hidden_state"] + vid_seq_length = video_query_features.shape[1] + + num_images_per_sample = num_images.long().cpu().tolist() + num_videos_per_sample = num_videos.long().cpu().tolist() + + text_chunk_embeds = [] + img_idx = 0 + for b in range(batch_size): + start = 0 + result = [] + if len(media_token_indices[b]) > 0: + for i, pos in enumerate(media_token_indices[b]): + if pos > start: + result.append(text_embeds[b, start:pos]) + result.append(query_features[img_idx + i]) + start = pos + img_seq_length + if start < text_embeds.shape[1]: + result.append(text_embeds[b, start:]) + + img_idx += num_images_per_sample[b] + text_chunk_embeds.append(torch.cat(result, dim=0)) + + # Actual Input Embeddings + input_embeds = torch.stack(text_chunk_embeds, dim=0) + + # if pixel_values is None and self.language_model.is_gradient_checkpointing: + # # Hack here when gradient checkpoint is enable. + # # Keep the compute graph static + # image_embeds = self.vision_model(torch.zeros(1,3,224,224,device=input_embeds.device,dtype=input_embeds.dtype), return_dict=True).last_hidden_state + # query_tokens = self.query_tokens.expand( + # image_embeds.shape[0], -1, -1) + # query_features = self.abstractor(query_embeds=query_tokens, + # encoder_hidden_states=image_embeds,)['last_hidden_state'] + + # input_embeds = input_embeds + query_features.mean()*0 + + # Create causal mask and position ids + _, loss_mask, position_ids = get_ltor_masks_and_position_ids_from_embeddings(input_embeds) + + # Calculate the loss_mask + non_padding_mask = non_padding_mask.long() + non_media_mask = non_media_mask.long() + prompt_mask = prompt_mask.long() # TODO How to deal with prompt mask + # from icecream import ic + # non_padding_mask = non_padding_mask[:,:-1] + # non_media_mask = non_media_mask[:,:-1] + # prompt_mask = prompt_mask[:,:-1] + # attention_mask = attention_mask[:,:-1] + loss_mask = loss_mask[:, :-1] + + loss_mask = loss_mask * non_padding_mask * non_media_mask * prompt_mask + labels[:, 1:][loss_mask != 1] = -100 + # Forward into GPT + outputs = self.language_model( + inputs_embeds=input_embeds, + attention_mask=attention_mask, + labels=labels, + return_dict=return_dict, + output_attentions=self.config.output_attentions, + ) + # outputs.loss = (outputs.loss * loss_mask.view(-1) + # ).sum()/loss_mask.sum() + return outputs + + @torch.no_grad() + def generate( + self, + pixel_values: torch.FloatTensor = None, + video_pixel_values: torch.FloatTensor = None, + input_ids: Optional[torch.LongTensor] = None, + attention_mask: Optional[torch.LongTensor] = None, + isdecoder=True, + **generate_kwargs, + ) -> torch.LongTensor: + """ + Overrides `generate` function to be able to use the model as a conditional generator. + + Args: + pixel_values (`torch.FloatTensor` of shape (batch_size, num_channels, height, width)): + Input images to be processed. + input_ids (`torch.LongTensor` of shape (batch_size, sequence_length), *optional*): + The sequence used as a prompt for the generation. + attention_mask (`torch.LongTensor` of shape (batch_size, sequence_length), *optional*): + Mask to avoid performing attention on padding token indices + + Returns: + captions (list): A list of strings of length batch_size * num_captions. + """ + if input_ids is None: + return self.language_model.generate(attention_mask=attention_mask, **generate_kwargs) + + if attention_mask is None: + attention_mask = input_ids.new_ones(*input_ids.shape) + + batch_size = input_ids.size(0) + media_token_indices = [get_media_indices(input_ids[i]) for i in range(batch_size)] + media_token_types = [get_media_types(input_ids[i], media_token_indices[i]) for i in range(batch_size)] + num_images_per_sample = [len([y for y in x if y == -1]) for x in media_token_types] + num_videos_per_sample = [len([y for y in x if y < -1]) for x in media_token_types] + input_ids = input_ids.clone() # prevent inplace modify + input_ids[input_ids < 0] = 0 # Not used + + if hasattr(self, "hf_device_map"): + # preprocess for `accelerate` + self._preprocess_accelerate() + batch_size = input_ids.shape[0] + # get text embedding + inputs_embeds = self.get_input_embeddings()(input_ids) + if hasattr(self.language_model, "transformer") and hasattr(self.language_model.transformer, "word_embeddings_layernorm"): + inputs_embeds = self.language_model.transformer.word_embeddings_layernorm(inputs_embeds) + # get visual embedding + if pixel_values is not None: + pixel_values = pixel_values.to(input_ids.device) + with torch.no_grad(): + image_embeds = self.vision_model(pixel_values, return_dict=True).last_hidden_state + image_attention_mask = torch.ones(image_embeds.size()[:-1], dtype=torch.long, device=image_embeds.device) + query_tokens = self.query_tokens.expand(image_embeds.shape[0], -1, -1) + query_outputs = self.abstractor( + query_embeds=query_tokens, + encoder_hidden_states=image_embeds, + encoder_attention_mask=image_attention_mask, + return_dict=True, + ) + query_output = query_outputs["last_hidden_state"] + image_embeds = query_output + img_seq_length = image_embeds.shape[1] + + if video_pixel_values is not None: + video_pixel_values = video_pixel_values.to(input_ids.device) + with torch.no_grad(): + video_embeds = self.vision_model(video_pixel_values, return_dict=True).last_hidden_state + video_attention_mask = torch.ones(video_embeds.size()[:-1], dtype=torch.long, device=video_embeds.device) + video_attention_mask = einops.rearrange(video_attention_mask, "b t n -> b (t n)") + query_tokens = self.query_tokens.expand(video_embeds.shape[0], -1, -1) + temporal_query_tokens = self.temporal_query_tokens.expand(video_embeds.shape[0], -1, -1) + query_outputs = self.abstractor( + query_embeds=query_tokens, + temporal_query_embeds=temporal_query_tokens, + encoder_hidden_states=video_embeds, + encoder_attention_mask=video_attention_mask, + return_dict=True, + ) + query_output = query_outputs["last_hidden_state"] + video_embeds = query_output + vid_seq_length = video_embeds.shape[1] + + # =================== + # Get actual input embeddings + # =================== + text_chunk_embeds = [] + text_chunk_attns = [] + img_idx = 0 + vid_idx = 0 + + for b in range(batch_size): + start = 0 + result = [] + result_attn = [] + for i, pos in enumerate(media_token_indices[b]): + curr_image_idx, curr_video_idx = 0, 0 + if pos > start: + result.append(inputs_embeds[b, start:pos]) + result_attn.append(attention_mask[b, start:pos]) + if media_token_types[b][i] == -1: + result.append(image_embeds[img_idx + curr_image_idx]) + result_attn.append(torch.ones(image_embeds[img_idx + curr_image_idx].shape[0], device=inputs_embeds.device)) + start = pos + img_seq_length + curr_image_idx += 1 + else: + result.append(video_embeds[vid_idx + curr_video_idx]) + result_attn.append(torch.ones(video_embeds[img_idx + curr_video_idx].shape[0], device=inputs_embeds.device)) + start = pos + vid_seq_length + curr_video_idx += 1 + if start < inputs_embeds.shape[1]: + result.append(inputs_embeds[b, start:]) + result_attn.append(attention_mask[b, start:]) + + img_idx += num_images_per_sample[b] + vid_idx += num_videos_per_sample[b] + text_chunk_embeds.append(torch.cat(result, dim=0)) + text_chunk_attns.append(torch.cat(result_attn, dim=0)) + inputs_embeds = torch.stack(text_chunk_embeds, dim=0) + attention_mask = torch.stack(text_chunk_attns, dim=0) + + outputs = self.language_model.generate( + inputs_embeds=inputs_embeds, + # input_ids=input_ids, + attention_mask=attention_mask, + **generate_kwargs, + ) + + return outputs + + def prepare_inputs_for_generation(self, input_ids, pixel_values=None, video_pixel_values=None, past_key_values=None, attention_mask=None, **model_kwargs): + input_shape = input_ids.shape + # if model is used as a decoder in encoder-decoder model, the decoder attention mask is created on the fly + if attention_mask is None: + attention_mask = input_ids.new_ones(input_shape) + + # # cut decoder_input_ids if past_key_values is used + # if past_key_values is not None: + # input_ids = input_ids[:, -1:] + + return { + "input_ids": input_ids, + "pixel_values": pixel_values, + "video_pixel_values": video_pixel_values, + "attention_mask": attention_mask, + # "past_key_values": past_key_values, + # "encoder_hidden_states": model_kwargs.get("encoder_hidden_states", None), + # "encoder_attention_mask": model_kwargs.get("encoder_attention_mask", None), + "is_decoder": True, + } + + +def bloom_forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]] = None, + attention_mask: Optional[torch.Tensor] = None, + head_mask: Optional[torch.LongTensor] = None, + inputs_embeds: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + **deprecated_arguments, +) -> Union[Tuple[torch.Tensor, ...], BaseModelOutputWithPastAndCrossAttentions]: + if deprecated_arguments.pop("position_ids", False) is not False: + # `position_ids` could have been `torch.Tensor` or `None` so defaulting pop to `False` allows to detect if users were passing explicitly `None` + warnings.warn( + "`position_ids` have no functionality in BLOOM and will be removed in v5.0.0. You can safely ignore" " passing `position_ids`.", + FutureWarning, + ) + if len(deprecated_arguments) > 0: + raise ValueError(f"Got unexpected arguments: {deprecated_arguments}") + + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + if input_ids is not None and inputs_embeds is not None: + raise ValueError("You cannot specify both input_ids and inputs_embeds at the same time") + elif input_ids is not None: + batch_size, seq_length = input_ids.shape + elif inputs_embeds is not None: + batch_size, seq_length, _ = inputs_embeds.shape + else: + raise ValueError("You have to specify either input_ids or inputs_embeds") + + if past_key_values is None: + past_key_values = tuple([None] * len(self.h)) + + # Prepare head mask if needed + # 1.0 in head_mask indicate we keep the head + # attention_probs has shape batch_size x num_heads x N x N + # head_mask has shape n_layer x batch x num_heads x N x N + head_mask = self.get_head_mask(head_mask, self.config.n_layer) + + if inputs_embeds is None: + inputs_embeds = self.word_embeddings(input_ids) + inputs_embeds = self.word_embeddings_layernorm(inputs_embeds) + + hidden_states = inputs_embeds + + presents = () if use_cache else None + all_self_attentions = () if output_attentions else None + all_hidden_states = () if output_hidden_states else None + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once("`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`...") + use_cache = False + + # Compute alibi tensor: check build_alibi_tensor documentation + seq_length_with_past = seq_length + past_key_values_length = 0 + if past_key_values[0] is not None: + past_key_values_length = past_key_values[0][0].shape[2] + seq_length_with_past = seq_length_with_past + past_key_values_length + if attention_mask is None: + attention_mask = torch.ones((batch_size, seq_length_with_past), device=hidden_states.device) + else: + attention_mask = attention_mask.to(hidden_states.device) + + alibi = self.build_alibi_tensor(attention_mask, self.num_heads, dtype=hidden_states.dtype) + + causal_mask = self._prepare_attn_mask( + attention_mask, + input_shape=(batch_size, seq_length), + past_key_values_length=past_key_values_length, + ) + + for i, (block, layer_past) in enumerate(zip(self.h, past_key_values)): + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + if self.gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module(*inputs, use_cache=use_cache, output_attentions=output_attentions) + + return custom_forward + + outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(block), + hidden_states, + alibi, + causal_mask, + layer_past, + head_mask[i], + ) + else: + outputs = block( + hidden_states, + layer_past=layer_past, + attention_mask=causal_mask, + head_mask=head_mask[i], + use_cache=use_cache, + output_attentions=output_attentions, + alibi=alibi, + ) + + hidden_states = outputs[0] + if use_cache is True: + presents = presents + (outputs[1],) + + if output_attentions: + all_self_attentions = all_self_attentions + (outputs[2 if use_cache else 1],) + + # Add last hidden state + hidden_states = self.ln_f(hidden_states) + + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + if not return_dict: + return tuple(v for v in [hidden_states, presents, all_hidden_states, all_self_attentions] if v is not None) + + return BaseModelOutputWithPastAndCrossAttentions( + last_hidden_state=hidden_states, + past_key_values=presents, + hidden_states=all_hidden_states, + attentions=all_self_attentions, + ) diff --git a/lmms_eval/models/mplug_owl_video/processing_mplug_owl.py b/lmms_eval/models/mplug_owl_video/processing_mplug_owl.py new file mode 100644 index 000000000..60a7dd7b0 --- /dev/null +++ b/lmms_eval/models/mplug_owl_video/processing_mplug_owl.py @@ -0,0 +1,263 @@ +import re +import torch +import torch.utils.checkpoint + +from transformers.processing_utils import ProcessorMixin +from transformers.tokenization_utils_base import BatchEncoding +from transformers.models.clip.image_processing_clip import CLIPImageProcessor +from .tokenization_mplug_owl import MplugOwlTokenizer + +from decord import VideoReader +import numpy as np +from PIL import Image +from lmms_eval.models.model_utils.load_video import read_video_pyav + + +def get_index(num_frames, num_segments): + seg_size = float(num_frames - 1) / num_segments + start = int(seg_size / 2) + offsets = np.array([start + int(np.round(seg_size * idx)) for idx in range(num_segments)]) + return offsets + + +def load_video(path, num_frames=4): + '''vr = VideoReader(path, height=224, width=224) + total_frames = len(vr) + frame_indices = get_index(total_frames, num_frames) + images_group = list() + for frame_index in frame_indices: + img = Image.fromarray(vr[frame_index].asnumpy()).convert("RGB") + images_group.append(img) + return images_group''' + # Change a bit here from the original code + # I use pyav instead of decord because it is much more safer + # The operations here are the same, we load video and return a list of PIL Image + # Load video frames + video_frames = read_video_pyav(path, num_frm=num_frames) + target_h, target_w = 224, 224 + # If image shape is not as target, resize it + if video_frames.shape[-3] != target_h or video_frames.shape[-2] != target_w: + video_frames = torch.from_numpy(video_frames).permute(0, 3, 1, 2).float() + video_frames = torch.nn.functional.interpolate(video_frames, size=(target_h, target_w)) + video_frames = video_frames.permute(0, 2, 3, 1).to(torch.uint8).numpy() + video_frames = [Image.fromarray(frame) for frame in video_frames] + if len(video_frames) > num_frames: + video_frames = video_frames[: num_frames] + return video_frames + + +class MplugOwlProcessor(ProcessorMixin): + attributes = [] + tokenizer_class = "MplugOwlTokenizer" + + def __init__(self, image_processor=None, tokenizer=None, **kwargs): + + super().__init__(**kwargs) + self.tokens_to_generate = 0 + self.image_processor = image_processor + self.tokenizer = tokenizer + self.add_BOS = True + + def __call__(self, text=None, images=None, videos=None, num_frames=4, return_tensors=None, **kwargs): + if text is None and images is None: + raise ValueError("You have to specify either text or images. Both cannot be none.") + + if text is not None: + encoding = tokenize_prompts( + prompts=text, + tokens_to_generate=self.tokens_to_generate, + add_BOS=self.add_BOS, + tokenizer=self.tokenizer, + ignore_dist=True, + **kwargs, + ) + # encoding = self.tokenizer(text, return_tensors=return_tensors, **kwargs) + + if images is not None: + image_features = self.image_processor(images, return_tensors=return_tensors, **kwargs) + + if videos is not None: + video_features = [] + for video in videos: + video_frames = load_video(video, num_frames) + video_feature = self.image_processor(video_frames, return_tensors=return_tensors, **kwargs)["pixel_values"] + video_features.append(video_feature) + video_features = torch.stack(video_features, dim=0) + video_features = video_features.permute(0, 2, 1, 3, 4) + + if text is not None and images is not None: + encoding["pixel_values"] = image_features.pixel_values + return encoding + if text is not None and videos is not None: + encoding["video_pixel_values"] = video_features + return encoding + elif text is not None: + return encoding + elif images is not None: + return BatchEncoding(data=dict(**image_features), tensor_type=return_tensors) + else: + return BatchEncoding(data=dict(video_pixel_values=video_pixel_values), tensor_type=return_tensors) + + def batch_decode(self, skip_special_tokens=True, *args, **kwargs): + """ + This method forwards all its arguments to CLIPTokenizerFast's [`~PreTrainedTokenizer.batch_decode`]. Please + refer to the docstring of this method for more information. + """ + return self.tokenizer.batch_decode(*args, skip_special_tokens=skip_special_tokens, **kwargs) + + def decode(self, skip_special_tokens=True, *args, **kwargs): + """ + This method forwards all its arguments to CLIPTokenizerFast's [`~PreTrainedTokenizer.decode`]. Please refer to + the docstring of this method for more information. + """ + return self.tokenizer.decode(*args, skip_special_tokens=skip_special_tokens, **kwargs) + + +class MplugOwlImageProcessor(CLIPImageProcessor): + pass + + +def detokenize_generations(tokens_gpu_tensor, lengths_gpu_tensor, return_segments, tokenizer): + """Detokenize the generated tokens.""" + + prompts_plus_generations = [] + if return_segments: + prompts_plus_generations_segments = [] + + tokens = tokens_gpu_tensor.cpu().numpy().tolist() + lengths = lengths_gpu_tensor.cpu().numpy().tolist() + for sequence_tokens, length in zip(tokens, lengths): + sequence_tokens = sequence_tokens[:length] + prompts_plus_generations.append(tokenizer.detokenize(sequence_tokens)) + if return_segments: + from tokenizers.decoders import Metaspace + + if hasattr(tokenizer, "tokenizer"): + if isinstance(tokenizer.tokenizer.decoder, Metaspace): + words = tokenizer.tokenizer.decode(sequence_tokens) + else: + words = [] + for token in sequence_tokens: + word = tokenizer.tokenizer.decoder[token] + word = bytearray([tokenizer.tokenizer.byte_decoder[c] for c in word]).decode("utf-8", errors="replace") + words.append(word) + prompts_plus_generations_segments.append(words) + else: + words = tokenizer.detokenize(sequence_tokens) + # else: + # words = [] + # for token in sequence_tokens: + # word = tokenizer.tokenizer.decoder[token] + # word = bytearray( + # [tokenizer.tokenizer.byte_decoder[c] for c in word]).decode( + # 'utf-8', errors='replace') + # words.append(word) + prompts_plus_generations_segments.append(words) + + if return_segments: + return tokens, prompts_plus_generations, prompts_plus_generations_segments + + return tokens, prompts_plus_generations + + +def tokenize_prompts(prompts=None, tokens_to_generate=None, add_BOS=None, rank=0, tokenizer=None, ignore_dist=False, **kwargs): + """Tokenize prompts and make them avaiable on all ranks.""" + + # On all ranks set to None so we can pass them to functions + prompts_tokens_cuda_long_tensor = None + prompts_length_cuda_long_tensor = None + + # On the specified rank, build the above. + attention_mask = None + if ignore_dist or torch.distributed.get_rank() == rank: + assert prompts is not None + assert tokens_to_generate is not None + # Tensor of tokens padded and their unpadded length. + prompts_tokens_cuda_long_tensor, prompts_length_cuda_long_tensor, attention_mask = _tokenize_prompts_and_batch(prompts, tokens_to_generate, add_BOS, tokenizer, **kwargs) + # We need the sizes of these tensors for the boradcast + [ + prompts_tokens_cuda_long_tensor.size(0), # Batch size + prompts_tokens_cuda_long_tensor.size(1), + ] # Sequence lenght + + return { + "input_ids": prompts_tokens_cuda_long_tensor, + "attention_mask": attention_mask, + # "prompt_length": prompts_length_cuda_long_tensor, + } + + +def _tokenize_prompts_and_batch(prompts, tokens_to_generate, add_BOS, tokenizer, **kwargs): + """Given a set of prompts and number of tokens to generate: + - tokenize prompts + - set the sequence length to be the max of length of prompts + plus the number of tokens we would like to generate + - pad all the sequences to this length so we can convert them + into a 2D tensor. + """ + + # Tokenize all the prompts. + # if add_BOS: + # prompts_tokens = [[tokenizer.bos] + tokenizer.tokenize(prompt) + # for prompt in prompts] + # else: + # prompts_tokens = [tokenizer.tokenize(prompt) for prompt in prompts] + + prompts_tokens = [_tokenize_prompt(prompt, tokenizer, add_BOS, **kwargs) for prompt in prompts] + + # Now we have a list of list of tokens which each list has a different + # size. We want to extend this list to: + # - incorporate the tokens that need to be generated + # - make all the sequences equal length. + # Get the prompts length. + prompts_length = [len(prompt_tokens) for prompt_tokens in prompts_tokens] + # Get the max prompts length. + max_prompt_len = max(prompts_length) + # Number of tokens in the each sample of the batch. + samples_length = max_prompt_len + tokens_to_generate + # Now update the list of list to be of the same size: samples_length. + for prompt_tokens, prompt_length in zip(prompts_tokens, prompts_length): + padding_size = samples_length - prompt_length + prompt_tokens.extend([tokenizer.eos_token_id] * padding_size) + + # Now we are in a structured format, we can convert to tensors. + prompts_tokens_tensor = torch.LongTensor(prompts_tokens) + prompts_length_tensor = torch.LongTensor(prompts_length) + attention_mask = torch.zeros(prompts_tokens_tensor.shape[:2]) + for i, l in enumerate(prompts_length_tensor): + attention_mask[i, :l] = 1 + return prompts_tokens_tensor, prompts_length_tensor, attention_mask + + +def _tokenize_prompt(prompt, tokenizer, add_BOS=False, media_info={"": 65, "<|video|>": 65}, **kwargs): + media_tokens = {k: -int(i + 1) for i, k in enumerate(media_info.keys())} + media_lengths = media_info.copy() + + if add_BOS: + prompt_chunk = [tokenizer.bos_token_id] + else: + prompt_chunk = [] + + # Pure Text + if all([media_token not in prompt for media_token in media_tokens.keys()]): + enc_chunk = prompt_chunk + tokenizer(prompt, add_special_tokens=False, **kwargs)["input_ids"] + + # Multi-Modal Text + else: + enc_chunk = prompt_chunk + pattern = "|".join(map(re.escape, list(media_tokens.keys()))) + chunk_strs = re.split(f"({pattern})", prompt) + chunk_strs = [x for x in chunk_strs if len(x) > 0] + for idx, chunk_str in enumerate(chunk_strs): + if chunk_str in media_tokens: + enc_chunk += [media_tokens[chunk_str]] * media_lengths[chunk_str] + else: + tmp_chunk = tokenizer(chunk_str, add_special_tokens=False)["input_ids"] + # if idx < len(chunk_strs) - 1: # Last chunk should not have eos + # tmp_chunk += [tokenizer.eod_id] + enc_chunk += tmp_chunk + return enc_chunk + + +if __name__ == "__main__": + pass diff --git a/lmms_eval/models/mplug_owl_video/tokenization_mplug_owl.py b/lmms_eval/models/mplug_owl_video/tokenization_mplug_owl.py new file mode 100644 index 000000000..22384b443 --- /dev/null +++ b/lmms_eval/models/mplug_owl_video/tokenization_mplug_owl.py @@ -0,0 +1,62 @@ +# coding=utf-8 +# Copyright 2022 x-plug and The HuggingFace Inc. team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tokenization classes for MplugOwl.""" + +from transformers.utils import logging +from transformers.models.llama.tokenization_llama import LlamaTokenizer + + +logger = logging.get_logger(__name__) + +VOCAB_FILES_NAMES = {"vocab_file": "vocab.txt"} + +PRETRAINED_VOCAB_FILES_MAP = { + "vocab_file": { + "MAGAer13/mplug-owl-llama-7b": "https://huggingface.co/MAGAer13/mplug-owl-llama-7b/resolve/main/vocab.txt", + }, +} + +PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES = { + "MAGAer13/mplug-owl-llama-7b": 2048, +} + + +class MplugOwlTokenizer(LlamaTokenizer): + def __init__( + self, + vocab_file, + unk_token="", + bos_token="", + eos_token="", + pad_token="", + sp_model_kwargs=None, + add_bos_token=False, + add_eos_token=False, + clean_up_tokenization_spaces=False, + **kwargs, + ): + super().__init__( + vocab_file, + unk_token, + bos_token, + eos_token, + pad_token, + sp_model_kwargs, + add_bos_token, + add_eos_token, + clean_up_tokenization_spaces, + **kwargs, + ) + self.eod_id = self.eos_token_id From b421c16c2b0208ee53d8303b95455725d888504c Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 10 Jun 2024 02:36:24 +0000 Subject: [PATCH 130/181] Add mplug owl to model __init__ file --- lmms_eval/models/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lmms_eval/models/__init__.py b/lmms_eval/models/__init__.py index c6c13032e..4a78c742a 100755 --- a/lmms_eval/models/__init__.py +++ b/lmms_eval/models/__init__.py @@ -26,6 +26,7 @@ "reka": "Reka", "llava_onevision": "Llava_OneVision", "from_log": "FromLog", + "mplugOwlVideo": "mplug_Owl", } for model_name, model_class in AVAILABLE_MODELS.items(): From 8d2fc90bedb136aa52d38f5e112fc38a71820e48 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 10 Jun 2024 03:17:39 +0000 Subject: [PATCH 131/181] Pop out force_download in load dataset, otherwise a lot error --- lmms_eval/api/task.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index 304b0a35b..a938c9bee 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -774,6 +774,8 @@ def _download_from_youtube(path): dataset_kwargs.pop("cache_dir") dataset_kwargs.pop("video") + if "force_download" in dataset_kwargs: + dataset_kwargs.pop("force_download") # Don't use force download here, sometimes get error self.dataset = datasets.load_dataset( path=self.DATASET_PATH, name=self.DATASET_NAME, From 809a3a960a4c77e4415eced96156eef02ec55ab2 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Mon, 10 Jun 2024 03:20:24 +0000 Subject: [PATCH 132/181] chore: Update dataset paths and dependencies --- lmms_eval/api/task.py | 168 +++++++++--------- .../activitynetqa/_default_template_yaml | 1 + lmms_eval/tasks/vatex/_default_template_yaml | 8 +- lmms_eval/tasks/vatex/vatex_test.yaml | 2 +- lmms_eval/tasks/vatex/vatex_val_ZH.yaml | 2 +- pyproject.toml | 1 + 6 files changed, 96 insertions(+), 86 deletions(-) diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index 304b0a35b..1e2b5ebe0 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -12,10 +12,6 @@ from tqdm import tqdm import datasets - -datasets.config.STREAMING_READ_MAX_RETRIES = 20 # default -datasets.config.STREAMING_READ_RETRY_INTERVAL = 5 # default - from datasets import Image, Sequence import numpy as np from PIL import ImageFile @@ -688,102 +684,114 @@ def _prepare_metric_and_aggregation(self): def download(self, dataset_kwargs=None) -> None: # If the dataset is a video dataset, # Recursively search whether their is a zip and unzip it to the huggingface home - if "From_YouTube" in dataset_kwargs: - import subprocess - import json - - def _download_from_youtube(path): - try: - for video in tqdm(self.all_dataset[split]): - video_id = video["videoID"] - target_path = os.path.join(path, f"{video_id}.mp4") - command = f"yt-dlp -o {target_path} -f mp4 https://www.youtube.com/watch?v={video_id}" - subprocess.run(command, shell=True) - with open(os.path.join(cache_path, f"{task}_download_status.json"), "w") as f: - f.write(json.dumps({task: "downloaded"})) - except Exception as e: - eval_logger.error(f"Error while downloading {task} data: {e}") - with open(os.path.join(cache_path, f"{task}_download_status.json"), "w") as f: - f.write(json.dumps({task: "not downloaded"})) - - hf_home = os.getenv("HF_HOME", "~/.cache/huggingface/") - accelerator = Accelerator() - if accelerator.is_main_process: - dataset_kwargs.pop("From_YouTube") - self.all_dataset = datasets.load_dataset( - path=self.DATASET_PATH, - name=self.DATASET_NAME, - download_mode=datasets.DownloadMode.REUSE_DATASET_IF_EXISTS, - **dataset_kwargs if dataset_kwargs is not None else {}, - ) - dataset_kwargs["From_YouTube"] = True - cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset") # download_parquet - split = vars(self.config)["test_split"] - task = vars(self.config)["task"] - - video_path = os.path.join(hf_home, task) - if os.path.exists(os.path.join(cache_path, f"{task}_download_status.json")): - download_status = json.load(open(os.path.join(cache_path, f"{task}_download_status.json"), "r")) - if download_status[task] == "downloaded": - eval_logger.info(f"Data for {task} already download!") + download_config = DownloadConfig() + download_config.max_retries = dataset_kwargs.get("max_retries", 10) if dataset_kwargs is not None else 10 + download_config.num_proc = dataset_kwargs.get("num_proc", 8) if dataset_kwargs is not None else 8 + download_config.local_files_only = dataset_kwargs.get("local_files_only", False) if dataset_kwargs is not None else False + if dataset_kwargs is not None: + if "From_YouTube" in dataset_kwargs: + import subprocess + import json + import shutil + + def _download_from_youtube(path): + try: + for video in tqdm(self.all_dataset[split]): + video_id = video["videoID"] + target_path = os.path.join(path, f"{video_id}.mp4") + assert shutil.which("yt-dlp") is not None, "yt-dlp must be installed and available in the system's PATH" + command = f"yt-dlp -o {target_path} -f mp4 https://www.youtube.com/watch?v={video_id}" + subprocess.run(command, shell=True) + with open(os.path.join(cache_path, f"{task}_download_status.json"), "w") as f: + f.write(json.dumps({task: "downloaded"})) + except Exception as e: + eval_logger.error(f"Error while downloading {task} data: {e}") + with open(os.path.join(cache_path, f"{task}_download_status.json"), "w") as f: + f.write(json.dumps({task: "not downloaded"})) + + hf_home = os.getenv("HF_HOME", "~/.cache/huggingface/") + accelerator = Accelerator() + if accelerator.is_main_process: + dataset_kwargs.pop("From_YouTube") + self.all_dataset = datasets.load_dataset( + path=self.DATASET_PATH, + name=self.DATASET_NAME, + download_mode=datasets.DownloadMode.REUSE_DATASET_IF_EXISTS, + **dataset_kwargs if dataset_kwargs is not None else {}, + ) + dataset_kwargs["From_YouTube"] = True + cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset") # download_parquet + split = vars(self.config)["test_split"] + task = vars(self.config)["task"] + + video_path = os.path.join(hf_home, task) + if os.path.exists(os.path.join(cache_path, f"{task}_download_status.json")): + download_status = json.load(open(os.path.join(cache_path, f"{task}_download_status.json"), "r")) + if download_status[task] == "downloaded": + eval_logger.info(f"Data for {task} already download!") + else: + eval_logger.info(f"Start downloading YouTube data to {video_path}...") + _download_from_youtube(video_path) else: eval_logger.info(f"Start downloading YouTube data to {video_path}...") _download_from_youtube(video_path) - else: - eval_logger.info(f"Start downloading YouTube data to {video_path}...") - _download_from_youtube(video_path) - accelerator.wait_for_everyone() - if "builder_script" in dataset_kwargs: - builder_script = dataset_kwargs["builder_script"] - self.DATASET_PATH = os.path.join(cache_path, builder_script) - dataset_kwargs.pop("builder_script") - download_config = DownloadConfig() - download_config.max_retries = dataset_kwargs.get("max_retries", 3) if dataset_kwargs is not None else 3 - download_config.num_proc = dataset_kwargs.get("num_proc", 8) if dataset_kwargs is not None else 8 - - downloaded_video_ids = [i.split(".mp4")[0] for i in os.listdir(os.path.expanduser(video_path)) if i.endswith(".mp4")] - # Filtered the existing dataset with the downloaded video ids - self.dataset = datasets.DatasetDict({split: self.all_dataset[split].filter(lambda x: x["videoID"] in downloaded_video_ids)}) - - self.dataset_no_image = self.dataset - dataset_kwargs.pop("From_YouTube") - return - - if dataset_kwargs is not None and "video" in dataset_kwargs and dataset_kwargs["video"]: - hf_home = os.getenv("HF_HOME", "~/.cache/huggingface/") - cache_dir = dataset_kwargs["cache_dir"] - cache_dir = os.path.join(hf_home, cache_dir) - accelerator = Accelerator() - if accelerator.is_main_process: - force_download = dataset_kwargs.get("force_download", False) - cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset", force_download=force_download) - zip_files = glob(os.path.join(cache_path, "**/*.zip"), recursive=True) - - if force_download or (not os.path.exists(cache_dir) and len(zip_files) > 0): - for zip_file in zip_files: - eval_logger.info(f"Unzipping {zip_file} to {cache_dir}") - shutil.unpack_archive(zip_file, cache_dir) - - accelerator.wait_for_everyone() + accelerator.wait_for_everyone() + if "builder_script" in dataset_kwargs: + builder_script = dataset_kwargs["builder_script"] + self.DATASET_PATH = os.path.join(cache_path, builder_script) + dataset_kwargs.pop("builder_script") + + downloaded_video_ids = [i.split(".mp4")[0] for i in os.listdir(os.path.expanduser(video_path)) if i.endswith(".mp4")] + # Filtered the existing dataset with the downloaded video ids + self.dataset = datasets.DatasetDict({split: self.all_dataset[split].filter(lambda x: x["videoID"] in downloaded_video_ids)}) + + self.dataset_no_image = self.dataset + dataset_kwargs.pop("From_YouTube") + return + + if "video" in dataset_kwargs and dataset_kwargs["video"]: + hf_home = os.getenv("HF_HOME", "~/.cache/huggingface/") + cache_dir = dataset_kwargs["cache_dir"] + cache_dir = os.path.join(hf_home, cache_dir) + accelerator = Accelerator() + if accelerator.is_main_process: + force_download = dataset_kwargs.get("force_download", False) + cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset", force_download=force_download) + zip_files = glob(os.path.join(cache_path, "**/*.zip"), recursive=True) + + if force_download or (not os.path.exists(cache_dir) and len(zip_files) > 0): + for zip_file in zip_files: + eval_logger.info(f"Unzipping {zip_file} to {cache_dir}") + shutil.unpack_archive(zip_file, cache_dir) + + accelerator.wait_for_everyone() + dataset_kwargs.pop("cache_dir") + dataset_kwargs.pop("video") if "builder_script" in dataset_kwargs: builder_script = dataset_kwargs["builder_script"] self.DATASET_PATH = os.path.join(cache_path, builder_script) dataset_kwargs.pop("builder_script") - dataset_kwargs.pop("cache_dir") - dataset_kwargs.pop("video") + if "force_download" in dataset_kwargs: + dataset_kwargs.pop("force_download") + + if "local_files_only" in dataset_kwargs: + dataset_kwargs.pop("local_files_only") + self.dataset = datasets.load_dataset( path=self.DATASET_PATH, name=self.DATASET_NAME, download_mode=datasets.DownloadMode.REUSE_DATASET_IF_EXISTS, + download_config=download_config, **dataset_kwargs if dataset_kwargs is not None else {}, ) self.dataset_no_image = datasets.load_dataset( path=self.DATASET_PATH, name=self.DATASET_NAME, download_mode=datasets.DownloadMode.REUSE_DATASET_IF_EXISTS, + download_config=download_config, **dataset_kwargs if dataset_kwargs is not None else {}, ) for doc_name in self.dataset_no_image: diff --git a/lmms_eval/tasks/activitynetqa/_default_template_yaml b/lmms_eval/tasks/activitynetqa/_default_template_yaml index adec677a9..69b410a84 100644 --- a/lmms_eval/tasks/activitynetqa/_default_template_yaml +++ b/lmms_eval/tasks/activitynetqa/_default_template_yaml @@ -3,6 +3,7 @@ dataset_kwargs: token: True video: True force_download: False + local_files_only: False cache_dir: activitynetqa model_specific_prompt_kwargs: default: diff --git a/lmms_eval/tasks/vatex/_default_template_yaml b/lmms_eval/tasks/vatex/_default_template_yaml index 2e54b9bca..847b421cb 100755 --- a/lmms_eval/tasks/vatex/_default_template_yaml +++ b/lmms_eval/tasks/vatex/_default_template_yaml @@ -1,5 +1,5 @@ dataset_kwargs: - token:True - # video: False #skip download video from hf - # cache_dir: vatex - From_YouTube: True + token: True + video: True #skip download video from hf + cache_dir: vatex + # From_YouTube: True diff --git a/lmms_eval/tasks/vatex/vatex_test.yaml b/lmms_eval/tasks/vatex/vatex_test.yaml index 8e1e9f471..6609c1066 100644 --- a/lmms_eval/tasks/vatex/vatex_test.yaml +++ b/lmms_eval/tasks/vatex/vatex_test.yaml @@ -1,4 +1,4 @@ -dataset_path: lmms-lab/vatex_from_url +dataset_path: lmms-lab/VATEX dataset_name: vatex_test task: vatex_test test_split: test diff --git a/lmms_eval/tasks/vatex/vatex_val_ZH.yaml b/lmms_eval/tasks/vatex/vatex_val_ZH.yaml index 643059354..e79e6b2a7 100755 --- a/lmms_eval/tasks/vatex/vatex_val_ZH.yaml +++ b/lmms_eval/tasks/vatex/vatex_val_ZH.yaml @@ -1,4 +1,4 @@ -dataset_path: lmms-lab/vatex_from_url +dataset_path: lmms-lab/VATEX dataset_name: vatex_val_zh task: vatex_val_zh test_split: validation diff --git a/pyproject.toml b/pyproject.toml index c93eeb126..350899334 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,6 +37,7 @@ dependencies = [ "sqlitedict", "torch>=2.1.0", # to enable sdpa mode for running 34B model on one 80GB GPU "openai>=1.0.0", + "yt-dlp", "google-generativeai", "pycocoevalcap", "tqdm-multiprocess", From 844c73468ff3162edcb18caf7e3d8fa3d9e376f1 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Mon, 10 Jun 2024 04:48:54 +0000 Subject: [PATCH 133/181] chore: Update dataset paths and dependencies --- lmms_eval/api/task.py | 56 +++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 31 deletions(-) diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index 1e2b5ebe0..4deb27224 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -1,49 +1,40 @@ import abc -from dataclasses import dataclass, field, asdict - -import itertools -import os -import re import ast +import itertools +import json import logging +import os import random -from glob import glob +import re import shutil -from tqdm import tqdm +import subprocess +from collections.abc import Callable +from dataclasses import dataclass, field, asdict +from glob import glob +from typing import Any, List, Union import datasets -from datasets import Image, Sequence import numpy as np from PIL import ImageFile - -from accelerate import Accelerator -from datasets import DownloadConfig -from typing import Union, List, Any -from collections.abc import Callable -from tenacity import retry, stop_after_attempt, wait_fixed, stop_after_delay +from datasets import DownloadConfig, Image, Sequence from huggingface_hub import snapshot_download +from tenacity import retry, stop_after_attempt, wait_fixed, stop_after_delay +from tqdm import tqdm +from accelerate import Accelerator from lmms_eval import utils from lmms_eval.api import samplers from lmms_eval.api.instance import Instance - -from lmms_eval.filters import build_filter_ensemble from lmms_eval.api.registry import ( - get_aggregation, - get_metric_aggregation, - is_higher_better, + AGGREGATION_REGISTRY, DEFAULT_METRIC_REGISTRY, METRIC_REGISTRY, OUTPUT_TYPE_REGISTRY, - AGGREGATION_REGISTRY, + get_aggregation, + get_metric_aggregation, + is_higher_better, ) - -ALL_OUTPUT_TYPES = [ - "loglikelihood", - "multiple_choice", - "generate_until", -] - +from lmms_eval.filters import build_filter_ensemble eval_logger = logging.getLogger("lmms-eval") @@ -51,6 +42,12 @@ # Include this inside code block to avoid error ImageFile.LOAD_TRUNCATED_IMAGES = True +ALL_OUTPUT_TYPES = [ + "loglikelihood", + "multiple_choice", + "generate_until", +] + @dataclass class TaskConfig(dict): @@ -690,9 +687,6 @@ def download(self, dataset_kwargs=None) -> None: download_config.local_files_only = dataset_kwargs.get("local_files_only", False) if dataset_kwargs is not None else False if dataset_kwargs is not None: if "From_YouTube" in dataset_kwargs: - import subprocess - import json - import shutil def _download_from_youtube(path): try: @@ -757,7 +751,7 @@ def _download_from_youtube(path): accelerator = Accelerator() if accelerator.is_main_process: force_download = dataset_kwargs.get("force_download", False) - cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset", force_download=force_download) + cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset", force_download=force_download, etag_timeout=60) zip_files = glob(os.path.join(cache_path, "**/*.zip"), recursive=True) if force_download or (not os.path.exists(cache_dir) and len(zip_files) > 0): From f905a513e60e71e59fe0fc3a01fb783faed5335f Mon Sep 17 00:00:00 2001 From: Bo Li Date: Mon, 10 Jun 2024 05:50:34 +0000 Subject: [PATCH 134/181] chore: Remove unused VATEX validation configuration file --- lmms_eval/tasks/vatex/{vatex_val_ZH.yaml => vatex_val_zh.yaml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename lmms_eval/tasks/vatex/{vatex_val_ZH.yaml => vatex_val_zh.yaml} (98%) diff --git a/lmms_eval/tasks/vatex/vatex_val_ZH.yaml b/lmms_eval/tasks/vatex/vatex_val_zh.yaml similarity index 98% rename from lmms_eval/tasks/vatex/vatex_val_ZH.yaml rename to lmms_eval/tasks/vatex/vatex_val_zh.yaml index e79e6b2a7..342690aac 100755 --- a/lmms_eval/tasks/vatex/vatex_val_ZH.yaml +++ b/lmms_eval/tasks/vatex/vatex_val_zh.yaml @@ -1,6 +1,6 @@ dataset_path: lmms-lab/VATEX dataset_name: vatex_val_zh -task: vatex_val_zh +task: vatex_val_ZH test_split: validation output_type: generate_until doc_to_visual: !function utils.vatex_ZH_doc_to_visual From a000a601d73081711f99824b5870877200d535ce Mon Sep 17 00:00:00 2001 From: Hukairui <71913595+KairuiHu@users.noreply.github.com> Date: Mon, 10 Jun 2024 14:24:31 +0800 Subject: [PATCH 135/181] Align CVRR and Tempcompass, Align GPT_Eval model name, Align Tempcompass rule-based matching (#120) * Resolve conflict when merge the kr_ego with internal_main_dev * fix the bug of file overwrite * Optimize the inference of videochatgpt dataset * Resolve conflict * delete repeated line * reformat the code * rename the file name for inference results * group the same task together for cvrr and videochatgpt * group the same task together for videochatgpt and cvrr * reformat the code * fix the bug of videochatgpt_consistency multiocessing * Rename the metric from submission to subtask * fix the bug of consistency where different answers agre generated in pred2 * add accuracy into the evaluation of cvrr * add accuracy metric to cvrr dataset * remove duplicate rows when merging from main branch * Refactor videochatgpt_gen and videochatgpt_temporal for correct score parsing * enable the webm video loader for llavavid as required in cvrr dataset * Refactor process_results function to handle full_docs in videochatgpt task * add tqdm to consistency gpt_eval * Refactor the cvrr for correct aggregate logic * change backend to decord for videochatgpt eval * Fix for mkv video path * add perceptiontest dataset test split * doublecheck and optimize the code in egoschema * rename metric name of perceptiontest * add perceptiontest_validation dataset * remove egoschema aggregate function name * add temcompass mc dataset * remove redundant files * add tempcompass yes_no, captioning, caption_matching subsets * add all the 5 aspects as metrics * reformat the output dict for successful match * remove redundant aggregation function in videochatgpt and rename some function names * remove redundant aggregation function in activitynetqa and video_detail_description * remove redundant aggregate functions in cvrr * remove redundant rows in perception test * use black ./ to reformat code * debug: load webm file is now successful * Remove perceptiontest and perceptiontest_val default template YAML files * put post prompt in yaml for empcompass dataset * align gpt eval model name for cvrr and debug the tempcompass in case match is unsuccessful --------- Co-authored-by: Bo Li Co-authored-by: kcz358 --- lmms_eval/tasks/cvrr/_default_template_yaml | 2 +- .../tasks/tempcompass/_default_template_yaml | 7 ++++++- lmms_eval/tasks/tempcompass/utils.py | 19 ++++++------------- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/lmms_eval/tasks/cvrr/_default_template_yaml b/lmms_eval/tasks/cvrr/_default_template_yaml index cce57e12a..333946a31 100644 --- a/lmms_eval/tasks/cvrr/_default_template_yaml +++ b/lmms_eval/tasks/cvrr/_default_template_yaml @@ -10,4 +10,4 @@ model_specific_prompt_kwargs: metadata: version: 0.0 - gpt_eval_model_name: gpt-3.5-turbo-0613 \ No newline at end of file + gpt_eval_model_name: gpt-3.5-turbo-0125 \ No newline at end of file diff --git a/lmms_eval/tasks/tempcompass/_default_template_yaml b/lmms_eval/tasks/tempcompass/_default_template_yaml index 4588c201d..404701d30 100644 --- a/lmms_eval/tasks/tempcompass/_default_template_yaml +++ b/lmms_eval/tasks/tempcompass/_default_template_yaml @@ -6,4 +6,9 @@ dataset_kwargs: model_specific_prompt_kwargs: default: pre_prompt: "" - post_prompt: "" \ No newline at end of file + post_prompt: { + "multi-choice": "\nPlease directly give the best option:", + "yes_no": "\nPlease answer yes or no:", + "caption_matching": "\nPlease directly give the best option:", + "captioning": "" +} \ No newline at end of file diff --git a/lmms_eval/tasks/tempcompass/utils.py b/lmms_eval/tasks/tempcompass/utils.py index 53afaf3e7..4ded139fe 100644 --- a/lmms_eval/tasks/tempcompass/utils.py +++ b/lmms_eval/tasks/tempcompass/utils.py @@ -72,11 +72,9 @@ def tempcompass_doc_to_text_multi_choice(doc, model_specific_prompt_kwargs=None) if "pre_prompt" in model_specific_prompt_kwargs: pre_prompt = model_specific_prompt_kwargs["pre_prompt"] if "post_prompt" in model_specific_prompt_kwargs: - post_prompt = model_specific_prompt_kwargs["post_prompt"] + post_prompt = model_specific_prompt_kwargs["post_prompt"]["multi-choice"] question = doc["question"] - post_prompt = "\nPlease directly give the best option:" - return f"{pre_prompt}{question}{post_prompt}" @@ -88,11 +86,9 @@ def tempcompass_doc_to_text_yes_no(doc, model_specific_prompt_kwargs=None): if "pre_prompt" in model_specific_prompt_kwargs: pre_prompt = model_specific_prompt_kwargs["pre_prompt"] if "post_prompt" in model_specific_prompt_kwargs: - post_prompt = model_specific_prompt_kwargs["post_prompt"] + post_prompt = model_specific_prompt_kwargs["post_prompt"]["yes_no"] question = doc["question"] - post_prompt = "\nPlease answer yes or no:" - return f"{pre_prompt}{question}{post_prompt}" @@ -104,11 +100,9 @@ def tempcompass_doc_to_text_caption_matching(doc, model_specific_prompt_kwargs=N if "pre_prompt" in model_specific_prompt_kwargs: pre_prompt = model_specific_prompt_kwargs["pre_prompt"] if "post_prompt" in model_specific_prompt_kwargs: - post_prompt = model_specific_prompt_kwargs["post_prompt"] + post_prompt = model_specific_prompt_kwargs["post_prompt"]["caption_matching"] question = doc["question"] - post_prompt = "\nPlease directly give the best option:" - return f"{pre_prompt}{question}{post_prompt}" @@ -120,10 +114,9 @@ def tempcompass_doc_to_text_captioning(doc, model_specific_prompt_kwargs=None): if "pre_prompt" in model_specific_prompt_kwargs: pre_prompt = model_specific_prompt_kwargs["pre_prompt"] if "post_prompt" in model_specific_prompt_kwargs: - post_prompt = model_specific_prompt_kwargs["post_prompt"] + post_prompt = model_specific_prompt_kwargs["post_prompt"]["captioning"] question = doc["question"] - return f"{pre_prompt}{question}{post_prompt}" @@ -395,13 +388,13 @@ def parse_llm_output_for_captioning(llm_output, gt_answer): # Check if the chatgpt answer is the ground-truth answer answer_counts = sum(eval_result["chatgpt-answer"].count(prefix) for prefix in ["A.", "B.", "C.", "D."]) # calculate the number of 'A.', 'B.', 'C.', 'D.' in chatgpt-answer answer_counts += sum(eval_result["chatgpt-answer"].count(prefix) for prefix in ["A:", "B:", "C:", "D:"]) - match = re.search(r"Information (\w+)", eval_result["chatgpt-answer"]) + match = re.search(r"Information (\w+)", eval_result["chatgpt-answer"]) if eval_result["chatgpt-answer"].startswith("Information") else None # If the gpt answer starts with "A."" if eval_result["chatgpt-answer"].split(". ")[0] == gt_answer.split(". ")[0] and answer_counts == 1: eval_result["rating"] = 1 # If the gpt answer starts with "Information A" - elif match.group(1) == gt_answer.split(". ")[0] and answer_counts == 1: + elif match is not None and match.group(1) == gt_answer.split(". ")[0] and answer_counts == 1: eval_result["rating"] = 1 # If the gpt answer starts with "Information A:" elif eval_result["chatgpt-answer"].split(": ")[0][-1] == gt_answer.split(". ")[0] and answer_counts == 1: From 0c1350d6aa3b43d0c1fff1cbbb95a6f8021af417 Mon Sep 17 00:00:00 2001 From: Shuai Liu <76559926+choiszt@users.noreply.github.com> Date: Mon, 10 Jun 2024 15:09:47 +0800 Subject: [PATCH 136/181] add Video-MME (#119) * Resolve conflict when merge the kr_ego with internal_main_dev * fix the bug of file overwrite * Optimize the inference of videochatgpt dataset * Resolve conflict * delete repeated line * reformat the code * rename the file name for inference results * group the same task together for cvrr and videochatgpt * group the same task together for videochatgpt and cvrr * reformat the code * fix the bug of videochatgpt_consistency multiocessing * Rename the metric from submission to subtask * fix the bug of consistency where different answers agre generated in pred2 * add accuracy into the evaluation of cvrr * add accuracy metric to cvrr dataset * remove duplicate rows when merging from main branch * Refactor videochatgpt_gen and videochatgpt_temporal for correct score parsing * enable the webm video loader for llavavid as required in cvrr dataset * Refactor process_results function to handle full_docs in videochatgpt task * add tqdm to consistency gpt_eval * Refactor the cvrr for correct aggregate logic * change backend to decord for videochatgpt eval * Fix for mkv video path * add data feature * update vatex * add vatex task * update * update VATEX and evaluation matrices * new * update utils * update vatex * new * update load vatex from url * update vatex from url * Delete lmms_eval/models/gpt4v.py * update vatex from url * update videomme * add videomme --------- Co-authored-by: KairuiHu Co-authored-by: Bo Li Co-authored-by: kcz358 Co-authored-by: SHUAI LIU Co-authored-by: choiszt --- .gitignore | 2 +- 1.txt | 1620 +++++++++++++++++++++++ lmms_eval/models/gpt4v.py | 1 - lmms_eval/tasks/vatex/vatex_val_ZH.yaml | 35 + lmms_eval/tasks/videomme/utils.py | 247 ++++ lmms_eval/tasks/videomme/videomme.yaml | 41 + tools/make_vatex.py | 11 +- 7 files changed, 1953 insertions(+), 4 deletions(-) create mode 100644 1.txt create mode 100755 lmms_eval/tasks/vatex/vatex_val_ZH.yaml create mode 100755 lmms_eval/tasks/videomme/utils.py create mode 100755 lmms_eval/tasks/videomme/videomme.yaml diff --git a/.gitignore b/.gitignore index dd8efe3d7..64e7ec0dc 100755 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,4 @@ logs/ vatex/ data/ llava-video/ -!lmms_eval/tasks/vatex \ No newline at end of file +Video-MME/ diff --git a/1.txt b/1.txt new file mode 100644 index 000000000..a20502abc --- /dev/null +++ b/1.txt @@ -0,0 +1,1620 @@ + - metric: videomme_short_Knowledge_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Knowledge_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Film & Television_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Sports Competition_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Artistic Performance_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Life Record_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_short_Multilingual_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Knowledge_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Film & Television_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Sports Competition_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Artistic Performance_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Life Record_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_medium_Multilingual_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Knowledge_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Film & Television_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Sports Competition_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Artistic Performance_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Life Record_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Humanity & History_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Literature & Art_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Biology & Medicine_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Finance & Commerce_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Astronomy_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Geography_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Law_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Life Tip_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Technology_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Animation_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Movie & TV Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Documentary_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_News Report_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Esports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Basketball_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Football_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Athletics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Other Sports_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Stage Play_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Magic Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Variety Show_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Acrobatics_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Handicraft_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Food_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Fashion_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Daily Life_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Travel_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Pet & Animal_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Exercise_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true + - metric: videomme_long_Multilingual_Multilingual_Information Synopsis + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true diff --git a/lmms_eval/models/gpt4v.py b/lmms_eval/models/gpt4v.py index 1245bdb21..d22097e77 100755 --- a/lmms_eval/models/gpt4v.py +++ b/lmms_eval/models/gpt4v.py @@ -168,7 +168,6 @@ def generate_until(self, requests) -> List[str]: for attempt in range(5): try: - # content="一个戴着红色帽子的男子,用一个工具把自己的腰系住,往下面慢慢的在走。";break#Choiszt:just for test response = url_requests.post(API_URL, headers=headers, json=payload, timeout=self.timeout) response_data = response.json() diff --git a/lmms_eval/tasks/vatex/vatex_val_ZH.yaml b/lmms_eval/tasks/vatex/vatex_val_ZH.yaml new file mode 100755 index 000000000..643059354 --- /dev/null +++ b/lmms_eval/tasks/vatex/vatex_val_ZH.yaml @@ -0,0 +1,35 @@ +dataset_path: lmms-lab/vatex_from_url +dataset_name: vatex_val_zh +task: vatex_val_zh +test_split: validation +output_type: generate_until +doc_to_visual: !function utils.vatex_ZH_doc_to_visual +doc_to_text: !function utils.vatex_doc_to_text +doc_to_target: "answer" +generation_kwargs: + max_new_tokens: 64 + temperature: 0 + top_p: 1.0 + num_beams: 1 + do_sample: false +model_specific_prompt_kwargs: + default: + prompt: 请为提供的视频提供一句话简短的字幕。 +process_results: !function utils.vatex_process_CN_result +# Note that the metric name can be either a registed metric function (such as the case for GQA) or a key name returned by process_results +metric_list: + - metric: vatex_Bleu_4 + aggregation : !function utils.vatex_bleu4 + higher_is_better : true + - metric: vatex_METEOR + aggregation : !function utils.vatex_meteor + higher_is_better : true + - metric: vatex_ROUGE_L + aggregation : !function utils.vatex_rougel + higher_is_better : true + - metric: vatex_CIDEr + aggregation : !function utils.vatex_cider + higher_is_better : true +metadata: + - version: 0.0 +include: _default_template_yaml \ No newline at end of file diff --git a/lmms_eval/tasks/videomme/utils.py b/lmms_eval/tasks/videomme/utils.py new file mode 100755 index 000000000..1421abfbd --- /dev/null +++ b/lmms_eval/tasks/videomme/utils.py @@ -0,0 +1,247 @@ +from collections import defaultdict +import os +import datetime +import json +from lmms_eval.tasks._task_utils.file_utils import generate_submission_file + +import logging +from pathlib import Path +import yaml +import sys +from typing import List, Dict, Optional, Union +import re + +eval_logger = logging.getLogger("lmms-eval") + +VIDEO_TYPE=["short","medium","long"] +CATEGORIES = [ + "Knowledge", + "Film & Television", + "Sports Competition", + "Artistic Performance", + "Life Record", + "Multilingual" +] + +SUB_CATEGORIES = [ + "Humanity & History", + "Literature & Art", + "Biology & Medicine", + "Finance & Commerce", + "Astronomy", + "Geography", + "Law", + "Life Tip", + "Technology", + "Animation", + "Movie & TV Show", + "Documentary", + "News Report", + "Esports", + "Basketball", + "Football", + "Athletics", + "Other Sports", + "Stage Play", + "Magic Show", + "Variety Show", + "Acrobatics", + "Handicraft", + "Food", + "Fashion", + "Daily Life", + "Travel", + "Pet & Animal", + "Exercise", + "Multilingual" +] + +TASK_CATEGORIES = [ + "Temporal Perception", + "Spatial Perception", + "Attribute Perception", + "Action Recognition", + "Object Recognition", + "OCR Problems", + "Counting Problem", + "Temporal Reasoning", + "Spatial Reasoning", + "Action Reasoning", + "Object Reasoning", + "Information Synopsis", +] + +replace_prompt = " Please answer yes or no." + +# with open(Path(__file__).parent / "_default_template_yaml", "r") as f: +# raw_data = f.readlines() +# safe_data = [] +# for i, line in enumerate(raw_data): +# # remove function definition since yaml load cannot handle it +# if "!function" not in line: +# safe_data.append(line) + +# config = yaml.safe_load("".join(safe_data)) + +hf_home = os.getenv("HF_HOME", "~/.cache/huggingface/") +# cache_dir = os.path.join(hf_home, cache_dir) +# base_cache_dir = config["dataset_kwargs"]["cache_dir"] +base_cache_dir=os.path.expanduser(hf_home) + +def videomme_doc_to_visual(doc): + with open(Path(__file__).parent / "videomme.yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + # remove function definition since yaml load cannot handle it + if "!function" not in line: + safe_data.append(line) + taskname= yaml.safe_load("".join(safe_data))['task'] + cache_dir=os.path.join(base_cache_dir,taskname) + video_path = doc["videoID"] + ".mp4" + video_path = os.path.join(cache_dir, video_path) + if os.path.exists(video_path): + video_path = video_path + elif os.path.exists(video_path.replace("mp4", "MP4")): + video_path = video_path.replace("mp4", "MP4") + elif os.path.exists(video_path.replace("mp4", "mkv")): + video_path = video_path.replace("mp4", "mkv") + else: + sys.exit(f"video path:{video_path} does not exist, please check") + return [video_path] + + +def videomme_doc_to_text(doc, model_specific_prompt_kwargs=None): + question = doc['question'] + option = str(doc['options']) + question=question+"\n"+option + if "pre_prompt" in model_specific_prompt_kwargs and model_specific_prompt_kwargs["pre_prompt"] != "": + question = question.replace(replace_prompt, "") + question = f"{model_specific_prompt_kwargs['pre_prompt']}{question}" + if "post_prompt" in model_specific_prompt_kwargs and model_specific_prompt_kwargs["post_prompt"] != "": + question = question.replace(replace_prompt, "") + question = f"{question}{model_specific_prompt_kwargs['post_prompt']}" + return question + +#Brought from videomme eval +def extract_characters_regex(s): + s = s.strip() + answer_prefixes = [ + "The best answer is", + "The correct answer is", + "The answer is", + "The answer", + "The best option is" + "The correct option is", + "Best answer:" + "Best option:", + ] + for answer_prefix in answer_prefixes: + s = s.replace(answer_prefix, "") + + if len(s.split()) > 10 and not re.search("[ABCD]", s): + return "" + matches = re.search(r'[ABCD]', s) + if matches is None: + return "" + return matches[0] + +matrices=[] +for i in VIDEO_TYPE: + for j in CATEGORIES: + for k in SUB_CATEGORIES: + for l in TASK_CATEGORIES: + matrices.append(f"{i}_{j}_{k}_{l}") + +def videomme_process_results(doc, results): + """ + Args: + doc: a instance of the eval dataset + results: [pred] + Returns: + a dictionary with key: metric name (in this case videomme score), value: metric value + """ + pred = results[0] + pred_ans = extract_characters_regex(pred) + # gt_ans = doc["answer"].lower().strip().replace(".", "") + category=doc["domain"] + sub_category=doc["sub_category"] + task_category=doc['task_type'] + data_dict= {"question_id": doc["question_id"],"duration":doc["duration"] ,"category": category,\ + "sub_category":sub_category,"task_category":task_category,\ + "pred_answer": pred_ans,"answer":doc['answer']} + # return {f"videomme_percetion_score": data_dict for metric in matrices} + return {f"videomme_percetion_score": data_dict} + + + +def videomme_aggregate_results(results): + """ + Args: + results: a list of values returned by process_results + Returns: + A score + """ + category2score = {} + + for video_type in VIDEO_TYPE: + for category in CATEGORIES: + for sub_category in SUB_CATEGORIES: + for task_category in TASK_CATEGORIES: + key=f"{video_type}_{category}_{sub_category}_{task_category}" + category2score[key] = {'correct': 0, "answered": 0} + + for result in results: + video_type=result['duration'] + category=result['category'] + sub_category=result['sub_category'] + task_category=result['task_category'] + key=f"{video_type}_{category}_{sub_category}_{task_category}" + category2score[key]['answered']+=1 + category2score[key]['correct']+=result['pred_answer']==result['answer'] + + + for video_type in VIDEO_TYPE: + total_correct=0 + total_answered=0 + for k,v in category2score.items(): + if video_type in k: + total_correct+=v['correct'] + total_answered+=v['answered'] + eval_logger.info(f"Evaluation on video Type: {video_type}: {100 * total_correct / total_answered if total_answered > 0 else 0 : .1f}%") + + + for category in CATEGORIES: + total_correct=0 + total_answered=0 + for k,v in category2score.items(): + if category in k: + total_correct+=v['correct'] + total_answered+=v['answered'] + eval_logger.info(f"Evaluation on Categories: {category}: {100 * total_correct / total_answered if total_answered > 0 else 0 : .1f}%") + + for sub_cate in SUB_CATEGORIES: + total_correct=0 + total_answered=0 + for k,v in category2score.items(): + if sub_cate in k: + total_correct+=v['correct'] + total_answered+=v['answered'] + eval_logger.info(f"Evaluation on Video Sub Categories: {sub_cate}: {100 * total_correct / total_answered if total_answered > 0 else 0 : .1f}%") + + for task_cate in TASK_CATEGORIES: + total_correct=0 + total_answered=0 + for k,v in category2score.items(): + if task_cate in k: + total_correct+=v['correct'] + total_answered+=v['answered'] + eval_logger.info(f"Evaluation on Task Categories: {task_cate}: {100 * total_correct / total_answered if total_answered > 0 else 0 : .1f}%") + + total_correct=0 + total_answered=0 + for k,v in category2score.items(): + total_correct+=v['correct'] + total_answered+=v['answered'] + eval_logger.info(f"Overall Performance: {100 * total_correct / total_answered if total_answered > 0 else 0 : .1f}%") + return 100 * total_correct / total_answered if total_answered > 0 else 0 \ No newline at end of file diff --git a/lmms_eval/tasks/videomme/videomme.yaml b/lmms_eval/tasks/videomme/videomme.yaml new file mode 100755 index 000000000..3025bc5f0 --- /dev/null +++ b/lmms_eval/tasks/videomme/videomme.yaml @@ -0,0 +1,41 @@ +dataset_path: lmms-lab/Video-MME_from_url +dataset_kwargs: + token: True + From_YouTube: True +task: videomme +test_split: test +output_type: generate_until +doc_to_visual: !function utils.videomme_doc_to_visual +doc_to_text: !function utils.videomme_doc_to_text +doc_to_target: "answer" +generation_kwargs: + max_new_tokens: 16 + temperature: 0 + top_p: 1.0 + num_beams: 1 + do_sample: false +# The return value of process_results will be used by metrics +process_results: !function utils.videomme_process_results +# Note that the metric name can be either a registed metric function (such as the case for GQA) or a key name returned by process_results +metric_list: + - metric: videomme_percetion_score + aggregation: !function utils.videomme_aggregate_results + higher_is_better: true +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "\nAnswer the question with A, B, C, or D." + gpt4v: + pre_prompt: "" + post_prompt: "\nAnswer the question with A, B, C, or D." + qwen_vl: + pre_prompt: "" + post_prompt: " Answer:" + otterhd: + pre_prompt: "" + post_prompt: " Answer:" + xcomposer2_4khd: + pre_prompt: "[UNUSED_TOKEN_146]user\n" + post_prompt: " Answer this question briefly[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n" +metadata: + - version: 0.0 diff --git a/tools/make_vatex.py b/tools/make_vatex.py index 681c3a81e..482f4980d 100644 --- a/tools/make_vatex.py +++ b/tools/make_vatex.py @@ -3,6 +3,9 @@ import json with open("data/vatex_public_test_english_v1.1.json", "r") as f: data = json.load(f) + +for da in data: + da["url"] = "https://www.youtube.com/watch?v=" + da["videoID"] vatex_dataset=Dataset.from_list(data) # vatex_dataset.rename_columns({ @@ -10,11 +13,13 @@ # 'enCap': 'caption' # }) #if change name is needed hub_dataset_path = "lmms-lab/vatex_from_url" -vatex_dataset.push_to_hub(repo_id=hub_dataset_path,split="test", config_name = "vatex_test",token="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") +vatex_dataset.push_to_hub(repo_id=hub_dataset_path,split="test", config_name = "vatex_test",token=True) with open("data/vatex_validation_v1.0.json", "r") as f: data = json.load(f) +for da in data: + da["url"] = "https://www.youtube.com/watch?v=" + da["videoID"] vatex_dataset=Dataset.from_list(data) # vatex_dataset.rename_columns({ @@ -22,4 +27,6 @@ # 'enCap': 'caption' # }) #if change name is needed hub_dataset_path = "lmms-lab/vatex_from_url" -vatex_dataset.push_to_hub(repo_id=hub_dataset_path,split="validation", config_name = "vatex_val_zh",token="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") \ No newline at end of file + +vatex_dataset.push_to_hub(repo_id=hub_dataset_path,split="validation", config_name = "vatex_val_zh",token=True) + From b675ceeaa223e858b19426a05bf653ac6fdbbd38 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 10 Jun 2024 09:00:58 +0000 Subject: [PATCH 137/181] More robust get time for video --- tools/get_video_avg_time.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/tools/get_video_avg_time.py b/tools/get_video_avg_time.py index 2c490a7b5..f84ccde27 100644 --- a/tools/get_video_avg_time.py +++ b/tools/get_video_avg_time.py @@ -5,8 +5,25 @@ from av.codec.context import CodecContext tasks = ["worldqa_gen", "activitynetqa", "nextqa_oe_val", "nextqa_oe_test", "videochatgpt_gen", "egoschema"] -# tasks = ["activitynetqa"] +# tasks = ["nextqa_oe_val"] data_stats = {} + +# This one is faster +def record_video_length_stream(container): + video = container.streams.video[0] + video_length = (float(video.duration * video.time_base)) # in seconds + return video_length + +# This one works for all types of video +def record_video_length_packet(container): + video_length = 0 + # context = CodecContext.create("libvpx-vp9", "r") + for packet in container.demux(video=0): + for frame in packet.decode(): + video_length = frame.time # The last frame time represent the video time + + return video_length + if __name__ == "__main__": initialize_tasks() @@ -22,15 +39,14 @@ for doc in tqdm(docs, desc=f"Processing {task_name}"): video_path = doc_to_visual(doc) container = av.open(video_path[0]) + if "webm" not in video_path[0] and "mkv" not in video_path[0]: - video = container.streams.video[0] - video_length = (float(video.duration * video.time_base)) # in seconds + try: + video_length = record_video_length_stream(container) # in seconds + except: + video_length = record_video_length_packet(container) else: - video_length = 0 - # context = CodecContext.create("libvpx-vp9", "r") - for packet in container.demux(video=0): - for frame in packet.decode(): - video_length = frame.time # The last frame time represent the video time + video_length = record_video_length_packet(container) data_stats[task_name] += video_length data_stats[task_name] /= len(docs) # into seconds From 55d6a36c6569830fb13be57af0ae018fe262ba4a Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 10 Jun 2024 13:19:04 +0000 Subject: [PATCH 138/181] Remove os.chdir in mmmu group image --- lmms_eval/tasks/mmmu/utils_group_img.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lmms_eval/tasks/mmmu/utils_group_img.py b/lmms_eval/tasks/mmmu/utils_group_img.py index 81e1c8de3..ed7008342 100644 --- a/lmms_eval/tasks/mmmu/utils_group_img.py +++ b/lmms_eval/tasks/mmmu/utils_group_img.py @@ -13,10 +13,6 @@ from PIL import Image, ImageDraw, ImageFont import numpy as np -import os - -script_dir = os.path.dirname(__file__) -os.chdir(script_dir) def add_order_label(image, label, font_size=40): From 77a7d8e39df6d4a849ebf1c7583c9d7b446fbf2a Mon Sep 17 00:00:00 2001 From: Hukairui <71913595+KairuiHu@users.noreply.github.com> Date: Tue, 11 Jun 2024 11:13:02 +0800 Subject: [PATCH 139/181] Add matching rule for egoschema generation task (mplug cannot follow instructions), and Optimize Tempcompass captioning matching rules (#121) * Resolve conflict when merge the kr_ego with internal_main_dev * fix the bug of file overwrite * Optimize the inference of videochatgpt dataset * Resolve conflict * delete repeated line * reformat the code * rename the file name for inference results * group the same task together for cvrr and videochatgpt * group the same task together for videochatgpt and cvrr * reformat the code * fix the bug of videochatgpt_consistency multiocessing * Rename the metric from submission to subtask * fix the bug of consistency where different answers agre generated in pred2 * add accuracy into the evaluation of cvrr * add accuracy metric to cvrr dataset * remove duplicate rows when merging from main branch * Refactor videochatgpt_gen and videochatgpt_temporal for correct score parsing * enable the webm video loader for llavavid as required in cvrr dataset * Refactor process_results function to handle full_docs in videochatgpt task * add tqdm to consistency gpt_eval * Refactor the cvrr for correct aggregate logic * change backend to decord for videochatgpt eval * Fix for mkv video path * add perceptiontest dataset test split * doublecheck and optimize the code in egoschema * rename metric name of perceptiontest * add perceptiontest_validation dataset * remove egoschema aggregate function name * add temcompass mc dataset * remove redundant files * add tempcompass yes_no, captioning, caption_matching subsets * add all the 5 aspects as metrics * reformat the output dict for successful match * remove redundant aggregation function in videochatgpt and rename some function names * remove redundant aggregation function in activitynetqa and video_detail_description * remove redundant aggregate functions in cvrr * remove redundant rows in perception test * use black ./ to reformat code * debug: load webm file is now successful * Remove perceptiontest and perceptiontest_val default template YAML files * put post prompt in yaml for empcompass dataset * align gpt eval model name for cvrr and debug the tempcompass in case match is unsuccessful * "debug tempcompass captioning for multi-choice, and optimze matching rule in egoschema" * "add a period to each option in egoschema becuase mplugowl always end with period" --------- Co-authored-by: Bo Li Co-authored-by: kcz358 --- lmms_eval/tasks/egoschema/utils.py | 40 +++++++++++++++++++++++----- lmms_eval/tasks/tempcompass/utils.py | 23 +++++----------- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/lmms_eval/tasks/egoschema/utils.py b/lmms_eval/tasks/egoschema/utils.py index 18f8a76c0..2fa272c61 100755 --- a/lmms_eval/tasks/egoschema/utils.py +++ b/lmms_eval/tasks/egoschema/utils.py @@ -86,12 +86,40 @@ def egoschema_process_results(doc, result): # Process result for mcq answer generation def egoschema_process_results_generation(doc, result): - pred = result[0] # string prediction "A", "B", "C", "D", or "E" - - # Map the prediction to an index - pred_to_index = {"A": 0, "B": 1, "C": 2, "D": 3, "E": 4} - index = pred_to_index.get(pred, -1) # Default to -1 if the prediction is not found - + pred = result[0] + + # Determine whether the video LLM output is correct, based on word matching rules + # Ensure each option string ends with a period + option_strs = [opt if opt.endswith(".") else opt + "." for opt in doc["option"]] # Complete option strings + option_sents = [opt.split(". ")[1] if ". " in opt else opt for opt in option_strs] # Option sentence + option_inds = [opt.split(". ")[0] if ". " in opt else opt for opt in option_strs] # Option letter, e.g., A, B, C, D, E + + video_llm_pred = None + index = -1 + + # Check if the prediction matches any of the complete option strings + for idx, option_str in enumerate(option_strs): + if pred == option_str: + video_llm_pred = option_str + index = idx + break + + # Check if the prediction matches any of the option sentences + if not video_llm_pred: + for idx, option_sent in enumerate(option_sents): + if pred == option_sent: + video_llm_pred = option_sent + index = idx + break + + # Check if the prediction matches any of the option letters + if not video_llm_pred: + for idx, option_ind in enumerate(option_inds): + if pred == option_ind or pred == option_ind.replace(".", ""): + video_llm_pred = option_ind + index = idx + break + return {"submission": {doc["video_idx"]: index}, "score": {"pred": index, "ground_truth": doc["answer"]}} diff --git a/lmms_eval/tasks/tempcompass/utils.py b/lmms_eval/tasks/tempcompass/utils.py index 4ded139fe..312581a7a 100644 --- a/lmms_eval/tasks/tempcompass/utils.py +++ b/lmms_eval/tasks/tempcompass/utils.py @@ -335,8 +335,8 @@ def tempcompass_process_results_captioning(doc, result): ``` """ - prompt = f"""{caption_evaluation_prompt}\nVideo Description:{pred}\nMulti-Choice Question:\n{doc["question"]}\nAnswer:""" - eval_result = get_eval_result_for_captioning(prompt, mc_answer=doc["answer"]) + prompt = f"""{caption_evaluation_prompt}\nVideo Description:{pred}\nMulti-Choice Question:\n{doc["mc_question"]}\nAnswer:""" + eval_result = get_eval_result_for_captioning(prompt, mc_answer=doc["mc_answer"]) return { "avg_accuracy": { @@ -345,7 +345,7 @@ def tempcompass_process_results_captioning(doc, result): "chatgpt-reasoning": eval_result["chatgpt-reasoning"], "chatgpt-answer": eval_result["chatgpt-answer"], "video-llm-prediction": pred, - "gt-answer": doc["answer"], + "gt-answer": doc["mc_answer"], "rating": eval_result["rating"], "dim": doc["dim"], }, @@ -356,7 +356,7 @@ def tempcompass_process_results_captioning(doc, result): "chatgpt-reasoning": eval_result["chatgpt-reasoning"], "chatgpt-answer": eval_result["chatgpt-answer"], "video-llm-prediction": pred, - "gt-answer": doc["answer"], + "gt-answer": doc["mc_answer"], "rating": eval_result["rating"], "dim": doc["dim"], }, @@ -387,18 +387,9 @@ def parse_llm_output_for_captioning(llm_output, gt_answer): # Check if the chatgpt answer is the ground-truth answer answer_counts = sum(eval_result["chatgpt-answer"].count(prefix) for prefix in ["A.", "B.", "C.", "D."]) # calculate the number of 'A.', 'B.', 'C.', 'D.' in chatgpt-answer - answer_counts += sum(eval_result["chatgpt-answer"].count(prefix) for prefix in ["A:", "B:", "C:", "D:"]) - match = re.search(r"Information (\w+)", eval_result["chatgpt-answer"]) if eval_result["chatgpt-answer"].startswith("Information") else None - - # If the gpt answer starts with "A."" + if eval_result["chatgpt-answer"].split(". ")[0] == gt_answer.split(". ")[0] and answer_counts == 1: eval_result["rating"] = 1 - # If the gpt answer starts with "Information A" - elif match is not None and match.group(1) == gt_answer.split(". ")[0] and answer_counts == 1: - eval_result["rating"] = 1 - # If the gpt answer starts with "Information A:" - elif eval_result["chatgpt-answer"].split(": ")[0][-1] == gt_answer.split(". ")[0] and answer_counts == 1: - eval_result["rating"] = 1 else: eval_result["rating"] = 0 return eval_result @@ -408,7 +399,7 @@ def parse_llm_output_for_captioning(llm_output, gt_answer): def get_llm_output_for_captioning(prompt): data = { "max_tokens": 128, - "model": "gpt-3.5-turbo", + "model": "gpt-3.5-turbo-1106", "temperature": 1.0, "top_p": 1, "presence_penalty": 1, @@ -501,7 +492,7 @@ def get_eval_result(prompt, maxtry=10, sys_prompt=None): def get_llm_output(prompt, sys_prompt, max_tokens=128): if sys_prompt is None: sys_prompt = "You are an AI assistant for question answering." - data = {"max_tokens": max_tokens, "model": "gpt-3.5-turbo", "temperature": 1.0, "top_p": 1, "presence_penalty": 1, "messages": [{"role": "system", "content": sys_prompt}, {"role": "user", "content": prompt}]} + data = {"max_tokens": max_tokens, "model": "gpt-3.5-turbo-1106", "temperature": 1.0, "top_p": 1, "presence_penalty": 1, "messages": [{"role": "system", "content": sys_prompt}, {"role": "user", "content": prompt}]} response = requests.post(API_URL, headers=headers, data=json.dumps(data).encode("utf-8")) result = response.content.decode("utf-8") dict_result = json.loads(result) From 1903fd42d38dcbe02efbbaa5f563d8e448fc387c Mon Sep 17 00:00:00 2001 From: kcz358 Date: Tue, 11 Jun 2024 06:35:48 +0000 Subject: [PATCH 140/181] Use data packet to load video in pyav --- lmms_eval/models/model_utils/load_video.py | 49 +++++++++++----------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/lmms_eval/models/model_utils/load_video.py b/lmms_eval/models/model_utils/load_video.py index a0e6e2b65..1a3cfc611 100644 --- a/lmms_eval/models/model_utils/load_video.py +++ b/lmms_eval/models/model_utils/load_video.py @@ -2,32 +2,33 @@ from av.codec.context import CodecContext import numpy as np +# This one is faster +def record_video_length_stream(container, indices): + frames = [] + start_index = indices[0] + end_index = indices[-1] + for i, frame in enumerate(container.decode(video=0)): + if i > end_index: + break + if i >= start_index and i in indices: + frames.append(frame) + return frames -def read_video_pyav(video_path, num_frm=8): +# This one works for all types of video +def record_video_length_packet(container): frames = [] + # context = CodecContext.create("libvpx-vp9", "r") + for packet in container.demux(video=0): + for frame in packet.decode(): + frames.append(frame) + return frames + +def read_video_pyav(video_path, num_frm=8): container = av.open(video_path) - if "webm" not in video_path and "mkv" not in video_path: - total_frames = container.streams.video[0].frames - num_frm = min(total_frames, num_frm) - indices = np.linspace(0, total_frames - 1, num_frm, dtype=int) - container.seek(0) - start_index = indices[0] - end_index = indices[-1] - for i, frame in enumerate(container.decode(video=0)): - if i > end_index: - break - if i >= start_index and i in indices: - frames.append(frame) - else: - # https://github.com/PyAV-Org/PyAV/issues/1269 - # https://www.cnblogs.com/beyond-tester/p/17641872.html - # context = CodecContext.create("libvpx-vp9", "r") - for packet in container.demux(video=0): - for frame in packet.decode(): - frames.append(frame) - total_frames = len(frames) - num_frm = min(total_frames, num_frm) - indices = np.linspace(0, total_frames - 1, num_frm, dtype=int) - frames = [frames[i] for i in indices] + frames = record_video_length_packet(container) + total_frames = len(frames) + num_frm = min(total_frames, num_frm) + indices = np.linspace(0, total_frames - 1, num_frm, dtype=int) + frames = [frames[i] for i in indices] return np.stack([x.to_ndarray(format="rgb24") for x in frames]) From 327dc069abeb5fd23e336253edd4071303e10b8c Mon Sep 17 00:00:00 2001 From: Bo Li Date: Tue, 11 Jun 2024 08:04:49 +0000 Subject: [PATCH 141/181] chore: Update task name in egoschema_mcppl.yaml --- lmms_eval/tasks/egoschema/egoschema_mcppl.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lmms_eval/tasks/egoschema/egoschema_mcppl.yaml b/lmms_eval/tasks/egoschema/egoschema_mcppl.yaml index efc17f66c..7070fb883 100755 --- a/lmms_eval/tasks/egoschema/egoschema_mcppl.yaml +++ b/lmms_eval/tasks/egoschema/egoschema_mcppl.yaml @@ -1,5 +1,5 @@ dataset_name: "MC_PPL" -task: "egoschema_mc_ppl" +task: "egoschema_mcppl" test_split: test output_type: multiple_choice doc_to_visual: !function utils.egoschema_doc_to_visual From c8a67f1881351fa89dbba16aaf235e9be0b662ef Mon Sep 17 00:00:00 2001 From: kcz358 Date: Tue, 11 Jun 2024 09:12:55 +0000 Subject: [PATCH 142/181] Better load video utils --- lmms_eval/models/model_utils/load_video.py | 26 +++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/lmms_eval/models/model_utils/load_video.py b/lmms_eval/models/model_utils/load_video.py index 1a3cfc611..68c89b544 100644 --- a/lmms_eval/models/model_utils/load_video.py +++ b/lmms_eval/models/model_utils/load_video.py @@ -17,6 +17,8 @@ def record_video_length_stream(container, indices): # This one works for all types of video def record_video_length_packet(container): frames = [] + # https://github.com/PyAV-Org/PyAV/issues/1269 + # https://www.cnblogs.com/beyond-tester/p/17641872.html # context = CodecContext.create("libvpx-vp9", "r") for packet in container.demux(video=0): for frame in packet.decode(): @@ -26,9 +28,23 @@ def record_video_length_packet(container): def read_video_pyav(video_path, num_frm=8): container = av.open(video_path) - frames = record_video_length_packet(container) - total_frames = len(frames) - num_frm = min(total_frames, num_frm) - indices = np.linspace(0, total_frames - 1, num_frm, dtype=int) - frames = [frames[i] for i in indices] + if "webm" not in video_path and "mkv" not in video_path: + # For mp4, we try loading with stream first + try: + total_frames = container.streams.video[0].frames + num_frm = min(total_frames, num_frm) + indices = np.linspace(0, total_frames - 1, num_frm, dtype=int) + frames = record_video_length_stream(container, indices) + except: + frames = record_video_length_packet(container) + total_frames = len(frames) + num_frm = min(total_frames, num_frm) + indices = np.linspace(0, total_frames - 1, num_frm, dtype=int) + frames = [frames[i] for i in indices] + else: + frames = record_video_length_packet(container) + total_frames = len(frames) + num_frm = min(total_frames, num_frm) + indices = np.linspace(0, total_frames - 1, num_frm, dtype=int) + frames = [frames[i] for i in indices] return np.stack([x.to_ndarray(format="rgb24") for x in frames]) From 0a589d624c2fd8a97e978304a41ca9a9609cf7ba Mon Sep 17 00:00:00 2001 From: Bo Li Date: Tue, 11 Jun 2024 10:09:39 +0000 Subject: [PATCH 143/181] chore: Update video_decode_backend to "decord" in LlavaVid class --- lmms_eval/models/llava_vid.py | 13 +++++++++---- lmms_eval/tasks/nextqa/utils.py | 8 ++++++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/lmms_eval/models/llava_vid.py b/lmms_eval/models/llava_vid.py index f809f511c..90d90fa03 100755 --- a/lmms_eval/models/llava_vid.py +++ b/lmms_eval/models/llava_vid.py @@ -17,9 +17,12 @@ from lmms_eval.models.model_utils.load_video import read_video_pyav eval_logger = logging.getLogger("lmms-eval") -import sys;sys.path.append("llava-video") +import sys + +sys.path.append("llava-video") try: from llavavid.model.language_model.llava_llama import LlavaConfig + # from llavavid.model.language_model.llava_qwen import LlavaQwenConfig from llavavid.model.builder import load_pretrained_model from llavavid.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria @@ -34,6 +37,7 @@ try: from llavavid.model.language_model.llava_qwen import LlavaQwenConfig + AutoConfig.register("llava_qwen", LlavaQwenConfig) except: eval_logger.debug("") @@ -64,7 +68,7 @@ def __init__( mm_spatial_pool_out_channels: int = 1024, mm_spatial_pool_mode: str = "average", overwrite: bool = True, - video_decode_backend: str = "pyav", + video_decode_backend: str = "decord", **kwargs, ) -> None: super().__init__() @@ -115,10 +119,11 @@ def __init__( overwrite_config["rope_scaling"] = {"factor": float(scaling_factor), "type": "linear"} overwrite_config["max_sequence_length"] = 4096 * scaling_factor overwrite_config["tokenizer_model_max_length"] = 4096 * scaling_factor - - if "v1.5" in pretrained: # A hardcode solution here to load v1.5 model, otherwise it will use LlavaConfig from hf transformers + + if "v1.5" in pretrained: # A hardcode solution here to load v1.5 model, otherwise it will use LlavaConfig from hf transformers from transformers import AutoTokenizer from llavavid.model.language_model.llava_llama import LlavaConfig, LlavaLlamaForCausalLM + self._tokenizer = AutoTokenizer.from_pretrained(pretrained, use_fast=False) cfg_pretrained = LlavaConfig.from_pretrained(pretrained) if overwrite_config is not None: diff --git a/lmms_eval/tasks/nextqa/utils.py b/lmms_eval/tasks/nextqa/utils.py index a5ef8f1e3..1c535e5e2 100644 --- a/lmms_eval/tasks/nextqa/utils.py +++ b/lmms_eval/tasks/nextqa/utils.py @@ -10,12 +10,16 @@ try: from pywsd.utils import lemmatize_sentence + from nltk.tokenize import word_tokenize + from nltk.corpus import wordnet + import nltk + + nltk.download("averaged_perceptron_tagger") + nltk.download("wordnet") except ImportError: eval_logger.debug("pywsd not installed. Please install pywsd to use this module. You can install it by running 'pip install pywsd'") from lmms_eval.tasks._task_utils.video_loader import get_cache_dir, get_video -from nltk.tokenize import word_tokenize -from nltk.corpus import wordnet import numpy as np From 5cd09d0f2c07458c2782d08d709dc70349b0babb Mon Sep 17 00:00:00 2001 From: Hukairui <71913595+KairuiHu@users.noreply.github.com> Date: Tue, 11 Jun 2024 18:39:40 +0800 Subject: [PATCH 144/181] Add readme to EgoSchema (#122) * Resolve conflict when merge the kr_ego with internal_main_dev * fix the bug of file overwrite * Optimize the inference of videochatgpt dataset * Resolve conflict * delete repeated line * reformat the code * rename the file name for inference results * group the same task together for cvrr and videochatgpt * group the same task together for videochatgpt and cvrr * reformat the code * fix the bug of videochatgpt_consistency multiocessing * Rename the metric from submission to subtask * fix the bug of consistency where different answers agre generated in pred2 * add accuracy into the evaluation of cvrr * add accuracy metric to cvrr dataset * remove duplicate rows when merging from main branch * Refactor videochatgpt_gen and videochatgpt_temporal for correct score parsing * enable the webm video loader for llavavid as required in cvrr dataset * Refactor process_results function to handle full_docs in videochatgpt task * add tqdm to consistency gpt_eval * Refactor the cvrr for correct aggregate logic * change backend to decord for videochatgpt eval * Fix for mkv video path * add perceptiontest dataset test split * doublecheck and optimize the code in egoschema * rename metric name of perceptiontest * add perceptiontest_validation dataset * remove egoschema aggregate function name * add temcompass mc dataset * remove redundant files * add tempcompass yes_no, captioning, caption_matching subsets * add all the 5 aspects as metrics * reformat the output dict for successful match * remove redundant aggregation function in videochatgpt and rename some function names * remove redundant aggregation function in activitynetqa and video_detail_description * remove redundant aggregate functions in cvrr * remove redundant rows in perception test * use black ./ to reformat code * debug: load webm file is now successful * Remove perceptiontest and perceptiontest_val default template YAML files * put post prompt in yaml for empcompass dataset * align gpt eval model name for cvrr and debug the tempcompass in case match is unsuccessful * "debug tempcompass captioning for multi-choice, and optimze matching rule in egoschema" * "add a period to each option in egoschema becuase mplugowl always end with period" * "add readme for egoschema" * "change readme citation for egoschema" --------- Co-authored-by: Bo Li Co-authored-by: kcz358 --- lmms_eval/tasks/egoschema/README.md | 46 +++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 lmms_eval/tasks/egoschema/README.md diff --git a/lmms_eval/tasks/egoschema/README.md b/lmms_eval/tasks/egoschema/README.md new file mode 100644 index 000000000..92255bcb0 --- /dev/null +++ b/lmms_eval/tasks/egoschema/README.md @@ -0,0 +1,46 @@ +# EgoSchema + +## Task Description + +
    EgoSchema is a diagnostic benchmark for very long-form video language understanding. The task format for EgoSchema is Multi-choice Question Answering. + +- Questions: For each MCQ in the dataset, we provide a post prompt:`\nAnswer with the option's letter from the given choices directly.` + +- Answers: As required by the official website, we match the generated option letter into index, i.e., `A: 0, B: 1, C: 2, D: 3, E: 4.` Many models like LLaVA can follow the instructions well and generate only the option letter. However, in case model may generate redundant information (e.g., the entire option string, the option sentence, etc.), we also parse these outputs based on some pre-defined rule-based matching. + +## Evaluation + +### Full set: Submission + +EgoSchema is intended for a 0-shot evaluation benchmark, hence the entire correct answer file will not be make public. + +`lmms-eval` will automatically generate a submission file `inference_results_egoschema_{taskname}_{now_date_time}.json` under `logs/`. To evaluate on the entire benchmark, please submit the generated submission file using CURL: + +`curl -X POST -H "Content-Type: application/json" -d @ https://validation-server.onrender.com/api/upload/` + +### Subset: Direct Scoring + +EgoSchema also release the correct answers to only 500 of the EgoSchema questions provided in the subset_answers.json file intended for offline experimentation and performance tracking. Hence,`lmms-eval` will automatically generate the score for subset. + +# Tasks + +- `egoschema`: Standard MCQA for Full set. +- `egoschema_mc_ppl`: MCQA Perplexity task format for Full set. +- `egoschema_subset`: Standard MCQA for Subset. +- `egoschema_subset_mcppl`: MCQA Perplexity task format for Subset. + +## Citation + +```bibtex +@inproceedings{NEURIPS2023_90ce332a, + author = {Mangalam, Karttikeya and Akshulakov, Raiymbek and Malik, Jitendra}, + booktitle = {Advances in Neural Information Processing Systems}, + editor = {A. Oh and T. Naumann and A. Globerson and K. Saenko and M. Hardt and S. Levine}, + pages = {46212--46244}, + publisher = {Curran Associates, Inc.}, + title = {EgoSchema: A Diagnostic Benchmark for Very Long-form Video Language Understanding}, + url = {https://proceedings.neurips.cc/paper_files/paper/2023/file/90ce332aff156b910b002ce4e6880dec-Paper-Datasets_and_Benchmarks.pdf}, + volume = {36}, + year = {2023} +} +``` \ No newline at end of file From 0995342b953b047669ddec0bc42289a04c9afe1d Mon Sep 17 00:00:00 2001 From: Shuai Liu <76559926+choiszt@users.noreply.github.com> Date: Tue, 11 Jun 2024 19:25:02 +0800 Subject: [PATCH 145/181] Update vatex_test and vatex_val_zh (#123) * Resolve conflict when merge the kr_ego with internal_main_dev * fix the bug of file overwrite * Optimize the inference of videochatgpt dataset * Resolve conflict * delete repeated line * reformat the code * rename the file name for inference results * group the same task together for cvrr and videochatgpt * group the same task together for videochatgpt and cvrr * reformat the code * fix the bug of videochatgpt_consistency multiocessing * Rename the metric from submission to subtask * fix the bug of consistency where different answers agre generated in pred2 * add accuracy into the evaluation of cvrr * add accuracy metric to cvrr dataset * remove duplicate rows when merging from main branch * Refactor videochatgpt_gen and videochatgpt_temporal for correct score parsing * enable the webm video loader for llavavid as required in cvrr dataset * Refactor process_results function to handle full_docs in videochatgpt task * add tqdm to consistency gpt_eval * Refactor the cvrr for correct aggregate logic * change backend to decord for videochatgpt eval * Fix for mkv video path * add data feature * update vatex * add vatex task * update * update VATEX and evaluation matrices * new * update utils * update vatex * new * update load vatex from url * update vatex from url * Delete lmms_eval/models/gpt4v.py * update vatex from url * update videomme * add videomme * update vatex_val_zh * modified task vatex_test * chore: Update dataset paths and dependencies * update yaml * update yaml * update several typos * chore: Fix typo in makecvrr.ipynb --------- Co-authored-by: KairuiHu Co-authored-by: Bo Li Co-authored-by: kcz358 Co-authored-by: SHUAI LIU Co-authored-by: choiszt --- .gitignore | 2 +- download.sh | 1 - lmms_eval/api/task.py | 1 + lmms_eval/evaluator.py | 2 +- lmms_eval/models/gpt4v.py | 3 +- lmms_eval/models/mini_gemini.py | 36 ++++++-------- lmms_eval/models/mplugOwlVideo.py | 4 +- .../mplug_owl_video/processing_mplug_owl.py | 7 ++- .../vatex/__pycache__/utils.cpython-310.pyc | Bin 0 -> 7171 bytes lmms_eval/tasks/vatex/_default_template_yaml | 5 -- lmms_eval/tasks/vatex/utils.py | 45 +++++++++++------- lmms_eval/tasks/vatex/vatex_test.yaml | 15 ++++-- lmms_eval/tasks/vatex/vatex_val_zh.yaml | 18 +++++-- lmms_eval/tasks/videomme/utils.py | 16 +++++-- setup.py | 1 + tools/get_video_avg_time.py | 12 ++--- tools/make_vatex.py | 13 +++-- tools/makecvrr.ipynb | 2 +- utils/cal_avg_length.py | 9 ++-- utils/download_vatex.py | 8 ++-- utils/upload_data.py | 2 +- utils/upload_to_hf.py | 20 ++++---- 22 files changed, 127 insertions(+), 95 deletions(-) delete mode 100644 download.sh create mode 100644 lmms_eval/tasks/vatex/__pycache__/utils.cpython-310.pyc delete mode 100755 lmms_eval/tasks/vatex/_default_template_yaml diff --git a/.gitignore b/.gitignore index 64e7ec0dc..df2f23612 100755 --- a/.gitignore +++ b/.gitignore @@ -32,7 +32,7 @@ LLaVA/ temp/ InternVL/ logs/ -vatex/ data/ llava-video/ Video-MME/ +VATEX/ diff --git a/download.sh b/download.sh deleted file mode 100644 index 5eea121a6..000000000 --- a/download.sh +++ /dev/null @@ -1 +0,0 @@ -yt-dlp https://www.youtube.com/watch?v=G9zN5TTuGO4_000179_000189 \ No newline at end of file diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index 4deb27224..b3fa54bd8 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -751,6 +751,7 @@ def _download_from_youtube(path): accelerator = Accelerator() if accelerator.is_main_process: force_download = dataset_kwargs.get("force_download", False) + # cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset", force_download=force_download, etag_timeout=60,ignore_patterns=["*.zip"]) cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset", force_download=force_download, etag_timeout=60) zip_files = glob(os.path.join(cache_path, "**/*.zip"), recursive=True) diff --git a/lmms_eval/evaluator.py b/lmms_eval/evaluator.py index e6fbcd6cd..7554130f4 100755 --- a/lmms_eval/evaluator.py +++ b/lmms_eval/evaluator.py @@ -468,7 +468,7 @@ def evaluate( else: # Bo: for models only need agg items results[task_name][metric_key] = agg_fn(items) - + results[task_name]["samples"] = len(items) # hotfix: bleu, chrf, ter seem to be really expensive to bootstrap diff --git a/lmms_eval/models/gpt4v.py b/lmms_eval/models/gpt4v.py index d22097e77..d28c1b001 100755 --- a/lmms_eval/models/gpt4v.py +++ b/lmms_eval/models/gpt4v.py @@ -129,8 +129,7 @@ def generate_until(self, requests) -> List[str]: img = self.encode_image(visual) imgs.append(img) elif self.modality == "video": - # frames = self.encode_video(visual, self.max_frames_for_video) - frames="hi" + frames = self.encode_video(visual, self.max_frames_for_video) imgs.extend(frames) payload = {"model": self.model_version, "messages": []} diff --git a/lmms_eval/models/mini_gemini.py b/lmms_eval/models/mini_gemini.py index 8a40a5d3e..24c7aadbe 100644 --- a/lmms_eval/models/mini_gemini.py +++ b/lmms_eval/models/mini_gemini.py @@ -11,8 +11,7 @@ import numpy as np import math from datetime import timedelta -from transformers import AutoConfig,AutoModelForCausalLM,GenerationConfig, \ - LlamaConfig, LlamaModel, LlamaForCausalLM +from transformers import AutoConfig, AutoModelForCausalLM, GenerationConfig, LlamaConfig, LlamaModel, LlamaForCausalLM from huggingface_hub import snapshot_download from lmms_eval import utils @@ -54,7 +53,7 @@ def split_list(lst, n): """Split a list into n (roughly) equal-sized chunks""" chunk_size = math.ceil(len(lst) / n) # integer division - return [lst[i:i+chunk_size] for i in range(0, len(lst), chunk_size)] + return [lst[i : i + chunk_size] for i in range(0, len(lst), chunk_size)] def get_chunk(lst, n, k): @@ -75,16 +74,16 @@ def eval_model(args): os.makedirs(os.path.dirname(answers_file), exist_ok=True) ans_file = open(answers_file, "w") - if 'plain' in args.conv_mode and 'finetune' not in model_name.lower() and 'mmtag' not in args.conv_mode: - args.conv_mode = args.conv_mode + '_mmtag' - print(f'It seems that this is a plain model, but it is not using a mmtag prompt, auto switching to {args.conv_mode}.') + if "plain" in args.conv_mode and "finetune" not in model_name.lower() and "mmtag" not in args.conv_mode: + args.conv_mode = args.conv_mode + "_mmtag" + print(f"It seems that this is a plain model, but it is not using a mmtag prompt, auto switching to {args.conv_mode}.") data_loader = create_data_loader(questions, args.image_folder, tokenizer, image_processor, model.config) for (input_ids, image_tensor, image_tensor_aux), line in tqdm(zip(data_loader, questions), total=len(questions)): idx = line["question_id"] cur_prompt = line["text"] - + input_ids = input_ids.to(device=model.device, non_blocking=True) if hasattr(model, "update_prompt"): model.update_prompt([[cur_prompt]]) @@ -92,12 +91,12 @@ def eval_model(args): terminators = tokenizer.eos_token_id if "llama_3" in args.conv_mode: terminators = [terminators, tokenizer.convert_tokens_to_ids("<|eot_id|>")] - + with torch.inference_mode(): output_ids = model.generate( input_ids, images=image_tensor.to(dtype=model.dtype, device=model.device, non_blocking=True), - images_aux=image_tensor_aux.to(dtype=model.dtype, device=model.device, non_blocking=True) if len(image_tensor_aux)>0 else None, + images_aux=image_tensor_aux.to(dtype=model.dtype, device=model.device, non_blocking=True) if len(image_tensor_aux) > 0 else None, do_sample=True if args.temperature > 0 else False, temperature=args.temperature, top_p=args.top_p, @@ -106,22 +105,17 @@ def eval_model(args): bos_token_id=tokenizer.bos_token_id, # Begin of sequence token eos_token_id=terminators, # End of sequence token pad_token_id=tokenizer.pad_token_id, # Pad token - use_cache=True) + use_cache=True, + ) outputs = tokenizer.batch_decode(output_ids, skip_special_tokens=True)[0].strip() ans_id = shortuuid.uuid() - ans_file.write(json.dumps({"question_id": idx, - "prompt": cur_prompt, - "text": outputs, - "answer_id": ans_id, - "model_id": model_name, - "metadata": {}}) + "\n") + ans_file.write(json.dumps({"question_id": idx, "prompt": cur_prompt, "text": outputs, "answer_id": ans_id, "model_id": model_name, "metadata": {}}) + "\n") # ans_file.flush() ans_file.close() - @register_model("mini_gemini") class MGM7B(lmms): config_class = MGMConfig @@ -156,11 +150,11 @@ class MGM7B(lmms): └── InternVL-Chat-V1-5 """ - # + # # The above steps can be optional, I add snapshot download, so now can just use hf repo_id # model_args pretrained=OpenGVLab/InternVL-Chat-V1-5 # - + """ InternVL-Chat-V1-5 Model for OpenGVLab https://github.com/OpenGVLab/InternVL/blob/main/internvl_chat/internvl/model/internvl_chat/modeling_internvl_chat.py Example usage: @@ -219,7 +213,7 @@ def __init__( model_name = get_model_name_from_path(pretrained) - config=MGMConfig.from_pretrained(pretrained) + config = MGMConfig.from_pretrained(pretrained) overwrite_config = {} overwrite_config["mm_vision_tower"] = "openai/clip-vit-large-patch14-336" overwrite_config["mm_vision_tower_aux"] = "openai/openclip-convnext-large-d-320-laion2B-s29B-b131K-ft-soup" @@ -228,7 +222,7 @@ def __init__( # overwrite_config["mm_spatial_pool_out_channels"] = self.mm_spatial_pool_out_channels # overwrite_config["mm_spatial_pool_mode"] = self.mm_spatial_pool_mode # overwrite_config["patchify_video_feature"] = False - tokenizer, model, image_processor, context_len = load_pretrained_model(pretrained, None, model_name, load_8bit=load_in_8bit,config=config) + tokenizer, model, image_processor, context_len = load_pretrained_model(pretrained, None, model_name, load_8bit=load_in_8bit, config=config) # config = InternVLChatConfig.from_pretrained(cache_dir) # tokenizer = AutoTokenizer.from_pretrained(cache_dir, trust_remote_code=True, use_fast=False) # model = InternVLChatModel.from_pretrained(cache_dir, low_cpu_mem_usage=True, config=config, torch_dtype=torch.bfloat16, load_in_8bit=load_in_8bit).eval() diff --git a/lmms_eval/models/mplugOwlVideo.py b/lmms_eval/models/mplugOwlVideo.py index b0ba5c3f5..bfc52d23c 100644 --- a/lmms_eval/models/mplugOwlVideo.py +++ b/lmms_eval/models/mplugOwlVideo.py @@ -32,14 +32,14 @@ def __init__( num_frames: Union[str, int] = 4, **kwargs, ) -> None: - ''' + """ Install instructions: 1. Install lmms-eval cd lmms-eval pip install -e .; 2. Install other packages with restricted versions pip install av sentencepiece protobuf==3.20 transformers==4.28.1 einops; - ''' + """ super().__init__() accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) diff --git a/lmms_eval/models/mplug_owl_video/processing_mplug_owl.py b/lmms_eval/models/mplug_owl_video/processing_mplug_owl.py index 60a7dd7b0..38cbf023f 100644 --- a/lmms_eval/models/mplug_owl_video/processing_mplug_owl.py +++ b/lmms_eval/models/mplug_owl_video/processing_mplug_owl.py @@ -21,14 +21,14 @@ def get_index(num_frames, num_segments): def load_video(path, num_frames=4): - '''vr = VideoReader(path, height=224, width=224) + """vr = VideoReader(path, height=224, width=224) total_frames = len(vr) frame_indices = get_index(total_frames, num_frames) images_group = list() for frame_index in frame_indices: img = Image.fromarray(vr[frame_index].asnumpy()).convert("RGB") images_group.append(img) - return images_group''' + return images_group""" # Change a bit here from the original code # I use pyav instead of decord because it is much more safer # The operations here are the same, we load video and return a list of PIL Image @@ -42,7 +42,7 @@ def load_video(path, num_frames=4): video_frames = video_frames.permute(0, 2, 3, 1).to(torch.uint8).numpy() video_frames = [Image.fromarray(frame) for frame in video_frames] if len(video_frames) > num_frames: - video_frames = video_frames[: num_frames] + video_frames = video_frames[:num_frames] return video_frames @@ -51,7 +51,6 @@ class MplugOwlProcessor(ProcessorMixin): tokenizer_class = "MplugOwlTokenizer" def __init__(self, image_processor=None, tokenizer=None, **kwargs): - super().__init__(**kwargs) self.tokens_to_generate = 0 self.image_processor = image_processor diff --git a/lmms_eval/tasks/vatex/__pycache__/utils.cpython-310.pyc b/lmms_eval/tasks/vatex/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa94c27e0c30996bc9660aaa5e3f7ba1b08f7e81 GIT binary patch literal 7171 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 10 and not re.search("[ABCD]", s): return "" + matches = re.search(r'[ABCD]', s) if matches is None: return "" return matches[0] + matrices=[] + for i in VIDEO_TYPE: for j in CATEGORIES: for k in SUB_CATEGORIES: for l in TASK_CATEGORIES: matrices.append(f"{i}_{j}_{k}_{l}") + def videomme_process_results(doc, results): """ Args: @@ -164,17 +171,18 @@ def videomme_process_results(doc, results): pred = results[0] pred_ans = extract_characters_regex(pred) # gt_ans = doc["answer"].lower().strip().replace(".", "") + category=doc["domain"] sub_category=doc["sub_category"] task_category=doc['task_type'] data_dict= {"question_id": doc["question_id"],"duration":doc["duration"] ,"category": category,\ "sub_category":sub_category,"task_category":task_category,\ "pred_answer": pred_ans,"answer":doc['answer']} + # return {f"videomme_percetion_score": data_dict for metric in matrices} return {f"videomme_percetion_score": data_dict} - def videomme_aggregate_results(results): """ Args: @@ -183,7 +191,7 @@ def videomme_aggregate_results(results): A score """ category2score = {} - + for video_type in VIDEO_TYPE: for category in CATEGORIES: for sub_category in SUB_CATEGORIES: @@ -244,4 +252,4 @@ def videomme_aggregate_results(results): total_correct+=v['correct'] total_answered+=v['answered'] eval_logger.info(f"Overall Performance: {100 * total_correct / total_answered if total_answered > 0 else 0 : .1f}%") - return 100 * total_correct / total_answered if total_answered > 0 else 0 \ No newline at end of file + return 100 * total_correct / total_answered if total_answered > 0 else 0 diff --git a/setup.py b/setup.py index 159f778ab..dbe4675d0 100755 --- a/setup.py +++ b/setup.py @@ -1,3 +1,4 @@ import setuptools + # This is to make sure that the package supports editable installs setuptools.setup() diff --git a/tools/get_video_avg_time.py b/tools/get_video_avg_time.py index f84ccde27..164d0c62d 100644 --- a/tools/get_video_avg_time.py +++ b/tools/get_video_avg_time.py @@ -32,7 +32,7 @@ def record_video_length_packet(container): task_obj = task_dict[task_name] if type(task_obj) == tuple: group, task_obj = task_obj - + docs = task_obj.test_docs() doc_to_visual = task_obj.doc_to_visual data_stats[task_name] = 0 @@ -47,11 +47,11 @@ def record_video_length_packet(container): video_length = record_video_length_packet(container) else: video_length = record_video_length_packet(container) + data_stats[task_name] += video_length - - data_stats[task_name] /= len(docs) # into seconds + + data_stats[task_name] /= len(docs) # into seconds # data_stats[task_name] /= 60 # into minutes - - with(open("./video_benchmarks_stats.json", "w")) as f: - json.dump(data_stats, f, indent=4, ensure_ascii=False) + with open("./video_benchmarks_stats.json", "w") as f: + json.dump(data_stats, f, indent=4, ensure_ascii=False) diff --git a/tools/make_vatex.py b/tools/make_vatex.py index 482f4980d..9b661016c 100644 --- a/tools/make_vatex.py +++ b/tools/make_vatex.py @@ -1,17 +1,21 @@ - -from datasets import load_dataset,Dataset +from datasets import load_dataset, Dataset import json + with open("data/vatex_public_test_english_v1.1.json", "r") as f: data = json.load(f) for da in data: da["url"] = "https://www.youtube.com/watch?v=" + da["videoID"] -vatex_dataset=Dataset.from_list(data) +for da in data: + da["url"] = "https://www.youtube.com/watch?v=" + da["videoID"] + +vatex_dataset = Dataset.from_list(data) # vatex_dataset.rename_columns({ # 'videoID': 'video_name', # 'enCap': 'caption' # }) #if change name is needed + hub_dataset_path = "lmms-lab/vatex_from_url" vatex_dataset.push_to_hub(repo_id=hub_dataset_path,split="test", config_name = "vatex_test",token=True) @@ -21,7 +25,7 @@ for da in data: da["url"] = "https://www.youtube.com/watch?v=" + da["videoID"] -vatex_dataset=Dataset.from_list(data) +vatex_dataset = Dataset.from_list(data) # vatex_dataset.rename_columns({ # 'videoID': 'video_name', # 'enCap': 'caption' @@ -29,4 +33,3 @@ hub_dataset_path = "lmms-lab/vatex_from_url" vatex_dataset.push_to_hub(repo_id=hub_dataset_path,split="validation", config_name = "vatex_val_zh",token=True) - diff --git a/tools/makecvrr.ipynb b/tools/makecvrr.ipynb index 0a06894c9..6b364a667 100644 --- a/tools/makecvrr.ipynb +++ b/tools/makecvrr.ipynb @@ -628,7 +628,7 @@ ], "source": [ "hub_dataset_path = \"lmms-lab/CVRR-ES\"\n", - "dataset.push_to_hub(repo_id=hub_dataset_path, split=\"test\", config_name = \"unusual_and_physically_anomalous_activities\")" + "dataset.push_to_hub(repo_id=hub_dataset_path, split=\"test\", config_name=\"unusual_and_physically_anomalous_activities\")" ] }, { diff --git a/utils/cal_avg_length.py b/utils/cal_avg_length.py index 5f7abb7f1..6ce6443bf 100644 --- a/utils/cal_avg_length.py +++ b/utils/cal_avg_length.py @@ -2,6 +2,7 @@ import datetime import cv2 + def get_video_duration(video_path): cap = cv2.VideoCapture(video_path) fps = cap.get(cv2.CAP_PROP_FPS) @@ -10,11 +11,12 @@ def get_video_duration(video_path): cap.release() return duration + def calculate_average_duration(directory): total_duration = 0 video_count = 0 for filename in os.listdir(directory): - if filename.endswith('.mp4'): + if filename.endswith(".mp4"): video_path = os.path.join(directory, filename) duration = get_video_duration(video_path) total_duration += duration @@ -25,10 +27,11 @@ def calculate_average_duration(directory): else: return 0 -directory = 'data/test_video' + +directory = "data/test_video" # calculate average duration average_duration = calculate_average_duration(directory) -print(f"Avg duration of '{directory}' : {datetime.timedelta(seconds=average_duration)}") \ No newline at end of file +print(f"Avg duration of '{directory}' : {datetime.timedelta(seconds=average_duration)}") diff --git a/utils/download_vatex.py b/utils/download_vatex.py index 74663252f..92e69db8f 100644 --- a/utils/download_vatex.py +++ b/utils/download_vatex.py @@ -2,9 +2,9 @@ import json from tqdm import tqdm -with open("data/vatex_public_test_english_v1.1.json",'r')as f: - testvideo=json.load(f) +with open("data/vatex_public_test_english_v1.1.json", "r") as f: + testvideo = json.load(f) for video in tqdm(testvideo): - video_id = video['videoID'] + video_id = video["videoID"] command = f"yt-dlp -o data/test_video/{video_id}.mp4 -f mp4 https://www.youtube.com/watch?v={video_id}" - subprocess.run(command, shell=True) \ No newline at end of file + subprocess.run(command, shell=True) diff --git a/utils/upload_data.py b/utils/upload_data.py index cbbcd5fcf..c255233b6 100644 --- a/utils/upload_data.py +++ b/utils/upload_data.py @@ -1,6 +1,6 @@ from huggingface_hub import HfApi -api=HfApi() +api = HfApi() api.upload_file( path_or_fileobj="data/vatex_val.zip", path_in_repo="vatex_val.zip", diff --git a/utils/upload_to_hf.py b/utils/upload_to_hf.py index e7d4ae8f6..4db177a4d 100644 --- a/utils/upload_to_hf.py +++ b/utils/upload_to_hf.py @@ -1,19 +1,20 @@ import zipfile import os + def chunk_zip(input_zip_path, output_folder, max_size_mb): if not os.path.exists(output_folder): os.makedirs(output_folder) - + # Open the zip file - with zipfile.ZipFile(input_zip_path, 'r') as zfile: + with zipfile.ZipFile(input_zip_path, "r") as zfile: # Get a list of all archived file names from the zip all_files = zfile.namelist() total_size = 0 count = 1 # Create a new zip file with three-digit formatting - chunk_zip = zipfile.ZipFile(os.path.join(output_folder, f'videos_chunked_{count:02d}.zip'), 'w') + chunk_zip = zipfile.ZipFile(os.path.join(output_folder, f"videos_chunked_{count:02d}.zip"), "w") for file in all_files: # Get file size in MB @@ -24,17 +25,18 @@ def chunk_zip(input_zip_path, output_folder, max_size_mb): # Close current chunk and start a new one chunk_zip.close() count += 1 - chunk_zip = zipfile.ZipFile(os.path.join(output_folder, f'videos_chunked_{count:02d}.zip'), 'w') + chunk_zip = zipfile.ZipFile(os.path.join(output_folder, f"videos_chunked_{count:02d}.zip"), "w") total_size = 0 # Write the file to the chunk - + chunk_zip.writestr(zfile.getinfo(file), zfile.read(file)) total_size += file_size chunk_zip.close() -input_zip_path = 'data/vatex_test.zip' -output_folder = 'data/hf_upload' -max_size_mb = 25*1024 # for 25GB -chunk_zip(input_zip_path, output_folder, max_size_mb) \ No newline at end of file + +input_zip_path = "data/vatex_test.zip" +output_folder = "data/hf_upload" +max_size_mb = 25 * 1024 # for 25GB +chunk_zip(input_zip_path, output_folder, max_size_mb) From 1a58ef854fc97d1803197328b4e2f45e475ed439 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Tue, 11 Jun 2024 11:29:25 +0000 Subject: [PATCH 146/181] chore: Update nltk dependencies and download missing resources --- lmms_eval/tasks/nextqa/utils.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lmms_eval/tasks/nextqa/utils.py b/lmms_eval/tasks/nextqa/utils.py index 1c535e5e2..a7016ffdf 100644 --- a/lmms_eval/tasks/nextqa/utils.py +++ b/lmms_eval/tasks/nextqa/utils.py @@ -9,13 +9,16 @@ eval_logger = logging.getLogger("lmms-eval") try: - from pywsd.utils import lemmatize_sentence + import nltk from nltk.tokenize import word_tokenize from nltk.corpus import wordnet - import nltk + from pywsd.utils import lemmatize_sentence + + if not nltk.data.find("taggers/averaged_perceptron_tagger"): + nltk.download("averaged_perceptron_tagger") - nltk.download("averaged_perceptron_tagger") - nltk.download("wordnet") + if not nltk.data.find("corpora/wordnet"): + nltk.download("wordnet") except ImportError: eval_logger.debug("pywsd not installed. Please install pywsd to use this module. You can install it by running 'pip install pywsd'") From faf6c17f4b71223ff5d17424002ae95355f1d2c0 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Tue, 11 Jun 2024 13:18:19 +0000 Subject: [PATCH 147/181] chore: Update nltk dependencies and download missing resources --- lmms_eval/tasks/nextqa/utils.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lmms_eval/tasks/nextqa/utils.py b/lmms_eval/tasks/nextqa/utils.py index a7016ffdf..e49c29323 100644 --- a/lmms_eval/tasks/nextqa/utils.py +++ b/lmms_eval/tasks/nextqa/utils.py @@ -14,11 +14,8 @@ from nltk.corpus import wordnet from pywsd.utils import lemmatize_sentence - if not nltk.data.find("taggers/averaged_perceptron_tagger"): - nltk.download("averaged_perceptron_tagger") - - if not nltk.data.find("corpora/wordnet"): - nltk.download("wordnet") + nltk.download("averaged_perceptron_tagger", quiet=True) + nltk.download("wordnet", quiet=True) except ImportError: eval_logger.debug("pywsd not installed. Please install pywsd to use this module. You can install it by running 'pip install pywsd'") From 7e5347115d6fdb1f5f92b311104df748b8eb0a75 Mon Sep 17 00:00:00 2001 From: Shuai Liu <76559926+choiszt@users.noreply.github.com> Date: Tue, 11 Jun 2024 22:20:23 +0800 Subject: [PATCH 148/181] Delete 1.txt --- 1.txt | 1620 --------------------------------------------------------- 1 file changed, 1620 deletions(-) delete mode 100644 1.txt diff --git a/1.txt b/1.txt deleted file mode 100644 index a20502abc..000000000 --- a/1.txt +++ /dev/null @@ -1,1620 +0,0 @@ - - metric: videomme_short_Knowledge_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Knowledge_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Film & Television_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Sports Competition_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Artistic Performance_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Life Record_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_short_Multilingual_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Knowledge_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Film & Television_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Sports Competition_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Artistic Performance_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Life Record_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_medium_Multilingual_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Knowledge_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Film & Television_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Sports Competition_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Artistic Performance_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Life Record_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Humanity & History_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Literature & Art_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Biology & Medicine_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Finance & Commerce_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Astronomy_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Geography_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Law_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Life Tip_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Technology_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Animation_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Movie & TV Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Documentary_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_News Report_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Esports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Basketball_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Football_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Athletics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Other Sports_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Stage Play_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Magic Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Variety Show_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Acrobatics_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Handicraft_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Food_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Fashion_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Daily Life_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Travel_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Pet & Animal_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Exercise_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true - - metric: videomme_long_Multilingual_Multilingual_Information Synopsis - aggregation: !function utils.videomme_aggregate_results - higher_is_better: true From b6813927bd393dcf4f077d1c9549467c3a39706a Mon Sep 17 00:00:00 2001 From: Shuai Liu <76559926+choiszt@users.noreply.github.com> Date: Tue, 11 Jun 2024 22:21:57 +0800 Subject: [PATCH 149/181] Delete utils directory --- utils/cal_avg_length.py | 37 ------------------------------------ utils/download_vatex.py | 10 ---------- utils/upload_data.py | 9 --------- utils/upload_to_hf.py | 42 ----------------------------------------- 4 files changed, 98 deletions(-) delete mode 100644 utils/cal_avg_length.py delete mode 100644 utils/download_vatex.py delete mode 100644 utils/upload_data.py delete mode 100644 utils/upload_to_hf.py diff --git a/utils/cal_avg_length.py b/utils/cal_avg_length.py deleted file mode 100644 index 6ce6443bf..000000000 --- a/utils/cal_avg_length.py +++ /dev/null @@ -1,37 +0,0 @@ -import os -import datetime -import cv2 - - -def get_video_duration(video_path): - cap = cv2.VideoCapture(video_path) - fps = cap.get(cv2.CAP_PROP_FPS) - frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT) - duration = frame_count / fps - cap.release() - return duration - - -def calculate_average_duration(directory): - total_duration = 0 - video_count = 0 - for filename in os.listdir(directory): - if filename.endswith(".mp4"): - video_path = os.path.join(directory, filename) - duration = get_video_duration(video_path) - total_duration += duration - video_count += 1 - if video_count > 0: - average_duration = total_duration / video_count - return average_duration - else: - return 0 - - -directory = "data/test_video" - -# calculate average duration -average_duration = calculate_average_duration(directory) - - -print(f"Avg duration of '{directory}' : {datetime.timedelta(seconds=average_duration)}") diff --git a/utils/download_vatex.py b/utils/download_vatex.py deleted file mode 100644 index 92e69db8f..000000000 --- a/utils/download_vatex.py +++ /dev/null @@ -1,10 +0,0 @@ -import subprocess -import json -from tqdm import tqdm - -with open("data/vatex_public_test_english_v1.1.json", "r") as f: - testvideo = json.load(f) -for video in tqdm(testvideo): - video_id = video["videoID"] - command = f"yt-dlp -o data/test_video/{video_id}.mp4 -f mp4 https://www.youtube.com/watch?v={video_id}" - subprocess.run(command, shell=True) diff --git a/utils/upload_data.py b/utils/upload_data.py deleted file mode 100644 index c255233b6..000000000 --- a/utils/upload_data.py +++ /dev/null @@ -1,9 +0,0 @@ -from huggingface_hub import HfApi - -api = HfApi() -api.upload_file( - path_or_fileobj="data/vatex_val.zip", - path_in_repo="vatex_val.zip", - repo_id="lmms-lab/vatex", - repo_type="dataset", -) diff --git a/utils/upload_to_hf.py b/utils/upload_to_hf.py deleted file mode 100644 index 4db177a4d..000000000 --- a/utils/upload_to_hf.py +++ /dev/null @@ -1,42 +0,0 @@ -import zipfile -import os - - -def chunk_zip(input_zip_path, output_folder, max_size_mb): - if not os.path.exists(output_folder): - os.makedirs(output_folder) - - # Open the zip file - with zipfile.ZipFile(input_zip_path, "r") as zfile: - # Get a list of all archived file names from the zip - all_files = zfile.namelist() - total_size = 0 - count = 1 - - # Create a new zip file with three-digit formatting - chunk_zip = zipfile.ZipFile(os.path.join(output_folder, f"videos_chunked_{count:02d}.zip"), "w") - - for file in all_files: - # Get file size in MB - file_size = zfile.getinfo(file).file_size / 1024 / 1024 - - # Check if adding the file to current chunk will exceed the max size - if total_size + file_size > max_size_mb and total_size > 0: - # Close current chunk and start a new one - chunk_zip.close() - count += 1 - chunk_zip = zipfile.ZipFile(os.path.join(output_folder, f"videos_chunked_{count:02d}.zip"), "w") - total_size = 0 - - # Write the file to the chunk - - chunk_zip.writestr(zfile.getinfo(file), zfile.read(file)) - total_size += file_size - - chunk_zip.close() - - -input_zip_path = "data/vatex_test.zip" -output_folder = "data/hf_upload" -max_size_mb = 25 * 1024 # for 25GB -chunk_zip(input_zip_path, output_folder, max_size_mb) From 595a1b103451608b93f4ddd0e540dfc2353c8e98 Mon Sep 17 00:00:00 2001 From: Shuai Liu <76559926+choiszt@users.noreply.github.com> Date: Tue, 11 Jun 2024 22:22:56 +0800 Subject: [PATCH 150/181] Delete tools/make_vatex.py --- tools/make_vatex.py | 35 ----------------------------------- 1 file changed, 35 deletions(-) delete mode 100644 tools/make_vatex.py diff --git a/tools/make_vatex.py b/tools/make_vatex.py deleted file mode 100644 index 9b661016c..000000000 --- a/tools/make_vatex.py +++ /dev/null @@ -1,35 +0,0 @@ -from datasets import load_dataset, Dataset -import json - -with open("data/vatex_public_test_english_v1.1.json", "r") as f: - data = json.load(f) - -for da in data: - da["url"] = "https://www.youtube.com/watch?v=" + da["videoID"] - -for da in data: - da["url"] = "https://www.youtube.com/watch?v=" + da["videoID"] - -vatex_dataset = Dataset.from_list(data) -# vatex_dataset.rename_columns({ -# 'videoID': 'video_name', -# 'enCap': 'caption' -# }) #if change name is needed - -hub_dataset_path = "lmms-lab/vatex_from_url" - -vatex_dataset.push_to_hub(repo_id=hub_dataset_path,split="test", config_name = "vatex_test",token=True) - -with open("data/vatex_validation_v1.0.json", "r") as f: - data = json.load(f) -for da in data: - da["url"] = "https://www.youtube.com/watch?v=" + da["videoID"] - -vatex_dataset = Dataset.from_list(data) -# vatex_dataset.rename_columns({ -# 'videoID': 'video_name', -# 'enCap': 'caption' -# }) #if change name is needed -hub_dataset_path = "lmms-lab/vatex_from_url" - -vatex_dataset.push_to_hub(repo_id=hub_dataset_path,split="validation", config_name = "vatex_val_zh",token=True) From f1149c563e6c5f41874dd0232986a8b5200c6c98 Mon Sep 17 00:00:00 2001 From: Shuai Liu <76559926+choiszt@users.noreply.github.com> Date: Tue, 11 Jun 2024 22:25:15 +0800 Subject: [PATCH 151/181] Delete lmms_eval/models/mini_gemini.py --- lmms_eval/models/mini_gemini.py | 542 -------------------------------- 1 file changed, 542 deletions(-) delete mode 100644 lmms_eval/models/mini_gemini.py diff --git a/lmms_eval/models/mini_gemini.py b/lmms_eval/models/mini_gemini.py deleted file mode 100644 index 24c7aadbe..000000000 --- a/lmms_eval/models/mini_gemini.py +++ /dev/null @@ -1,542 +0,0 @@ -import argparse -import os -import json -import shortuuid -import logging -from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs -from accelerate.state import AcceleratorState -from typing import List, Optional, Union, Tuple -import torch -from tqdm import tqdm -import numpy as np -import math -from datetime import timedelta -from transformers import AutoConfig, AutoModelForCausalLM, GenerationConfig, LlamaConfig, LlamaModel, LlamaForCausalLM -from huggingface_hub import snapshot_download - -from lmms_eval import utils -from lmms_eval.api.instance import Instance -from lmms_eval.api.model import lmms -from lmms_eval.api.registry import register_model -from lmms_eval.utils import stop_sequences_criteria -from PIL import Image - -import subprocess -import sys - -from torch.utils.data import Dataset, DataLoader - -eval_logger = logging.getLogger("lmms-eval") - -import warnings -from typing import Any, List, Optional, Tuple, Union - -import torch.utils.checkpoint - -from peft import LoraConfig, get_peft_model -from torch import nn -from transformers import AutoTokenizer -import re -from huggingface_hub import snapshot_download - -try: - from mgm.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN - from mgm.conversation import conv_templates, SeparatorStyle - from mgm.model.language_model.mgm_llama import MGMConfig, MGMLlamaModel, MGMLlamaForCausalLM - from mgm.model.builder import load_pretrained_model - from mgm.utils import disable_torch_init - from mgm.mm_utils import tokenizer_image_token, process_images, get_model_name_from_path -except ImportError: - eval_logger.error("InternVL is not installed. Please install InternVL to use this model.") - - -def split_list(lst, n): - """Split a list into n (roughly) equal-sized chunks""" - chunk_size = math.ceil(len(lst) / n) # integer division - return [lst[i : i + chunk_size] for i in range(0, len(lst), chunk_size)] - - -def get_chunk(lst, n, k): - chunks = split_list(lst, n) - return chunks[k] - - -def eval_model(args): - # Model - disable_torch_init() - model_path = os.path.expanduser(args.model_path) - model_name = get_model_name_from_path(model_path) - tokenizer, model, image_processor, context_len = load_pretrained_model(model_path, args.model_base, model_name, load_8bit=args.load_8bit) - - questions = [json.loads(q) for q in open(os.path.expanduser(args.question_file), "r")] - questions = get_chunk(questions, args.num_chunks, args.chunk_idx) - answers_file = os.path.expanduser(args.answers_file) - os.makedirs(os.path.dirname(answers_file), exist_ok=True) - ans_file = open(answers_file, "w") - - if "plain" in args.conv_mode and "finetune" not in model_name.lower() and "mmtag" not in args.conv_mode: - args.conv_mode = args.conv_mode + "_mmtag" - print(f"It seems that this is a plain model, but it is not using a mmtag prompt, auto switching to {args.conv_mode}.") - - data_loader = create_data_loader(questions, args.image_folder, tokenizer, image_processor, model.config) - - for (input_ids, image_tensor, image_tensor_aux), line in tqdm(zip(data_loader, questions), total=len(questions)): - idx = line["question_id"] - cur_prompt = line["text"] - - input_ids = input_ids.to(device=model.device, non_blocking=True) - if hasattr(model, "update_prompt"): - model.update_prompt([[cur_prompt]]) - - terminators = tokenizer.eos_token_id - if "llama_3" in args.conv_mode: - terminators = [terminators, tokenizer.convert_tokens_to_ids("<|eot_id|>")] - - with torch.inference_mode(): - output_ids = model.generate( - input_ids, - images=image_tensor.to(dtype=model.dtype, device=model.device, non_blocking=True), - images_aux=image_tensor_aux.to(dtype=model.dtype, device=model.device, non_blocking=True) if len(image_tensor_aux) > 0 else None, - do_sample=True if args.temperature > 0 else False, - temperature=args.temperature, - top_p=args.top_p, - num_beams=args.num_beams, - max_new_tokens=args.max_new_tokens, - bos_token_id=tokenizer.bos_token_id, # Begin of sequence token - eos_token_id=terminators, # End of sequence token - pad_token_id=tokenizer.pad_token_id, # Pad token - use_cache=True, - ) - - outputs = tokenizer.batch_decode(output_ids, skip_special_tokens=True)[0].strip() - - ans_id = shortuuid.uuid() - ans_file.write(json.dumps({"question_id": idx, "prompt": cur_prompt, "text": outputs, "answer_id": ans_id, "model_id": model_name, "metadata": {}}) + "\n") - # ans_file.flush() - ans_file.close() - - -@register_model("mini_gemini") -class MGM7B(lmms): - config_class = MGMConfig - main_input_name = "pixel_values" - _no_split_modules = ["InternVisionEncoderLayer", "LlamaDecoderLayer"] - - """ - 0. Install lmms-eval - cd lmms-eval - pip install -e . - - How to Install InternVL: - 1. Clone the InternVL repository: - git clone https://github.com/OpenGVLab/InternVL.git - - 2. Install the requirements: - pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118 - - 3. Install flash-attn==2.3.6: - pip install flash-attn==2.3.6 --no-build-isolation - """ - - """ - How to download the pretrained model: - 1. Download the pretrained model from hugginface: - cd pretrained/ - # pip install -U huggingface_hub - huggingface-cli download --resume-download --local-dir-use-symlinks False OpenGVLab/InternVL-Chat-V1-5 --local-dir InternVL-Chat-V1-5 - - 2. the pretrained model should be in the following directory: - pretrained - └── InternVL-Chat-V1-5 - """ - - # - # The above steps can be optional, I add snapshot download, so now can just use hf repo_id - # model_args pretrained=OpenGVLab/InternVL-Chat-V1-5 - # - - """ - InternVL-Chat-V1-5 Model for OpenGVLab https://github.com/OpenGVLab/InternVL/blob/main/internvl_chat/internvl/model/internvl_chat/modeling_internvl_chat.py - Example usage: - - accelerate launch --num_processes=8 --main_process_port 12345 -m lmms_eval \ - --model internvl \ - --model_args pretrained=OpenGVLab/InternVL-Chat-V1-5 \ - --tasks mme \ - --batch_size 1 \ - --output_path ./logs/ \ - --log_samples - """ - - def __init__( - self, - config: Optional[MGMConfig] = None, - pretrained: str = "OpenGVLab/InternVL-Chat-V1-5", - truncation: Optional[bool] = True, - device: Optional[str] = "cuda:0", - dtype: Optional[Union[str, torch.dtype]] = "auto", - batch_size: Optional[Union[int, str]] = 1, - trust_remote_code: Optional[bool] = False, - revision=None, - device_map="cuda:0", - conv_template="vicuna_v1", - use_cache=True, - truncate_context=False, # whether to truncate the context in generation, set it False for LLaVA-1.6 - customized_config=None, # ends in json - dynamic=True, - load_in_8bit=False, - vision_model=None, - language_model=None, - max_num=12, - **kwargs, - ) -> None: - super().__init__() - - assert kwargs == {}, f"Unexpected kwargs: {kwargs}" - - accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) - accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) - if accelerator.num_processes > 1: - self._device = torch.device(f"cuda:{accelerator.local_process_index}") - self.device_map = f"cuda:{accelerator.local_process_index}" - elif accelerator.num_processes == 1 and device_map == "auto": - self._device = torch.device(device) - self.device_map = device_map - else: - self._device = torch.device(f"cuda:{accelerator.local_process_index}") - self.device_map = f"cuda:{accelerator.local_process_index}" - - self.dynamic = dynamic # dynamic image_size - self.max_num = max_num - - accelerator.wait_for_everyone() - - model_name = get_model_name_from_path(pretrained) - - config = MGMConfig.from_pretrained(pretrained) - overwrite_config = {} - overwrite_config["mm_vision_tower"] = "openai/clip-vit-large-patch14-336" - overwrite_config["mm_vision_tower_aux"] = "openai/openclip-convnext-large-d-320-laion2B-s29B-b131K-ft-soup" - setattr(config, "mm_vision_tower", overwrite_config["mm_vision_tower"]) - setattr(config, "mm_vision_tower_aux", overwrite_config["mm_vision_tower_aux"]) - # overwrite_config["mm_spatial_pool_out_channels"] = self.mm_spatial_pool_out_channels - # overwrite_config["mm_spatial_pool_mode"] = self.mm_spatial_pool_mode - # overwrite_config["patchify_video_feature"] = False - tokenizer, model, image_processor, context_len = load_pretrained_model(pretrained, None, model_name, load_8bit=load_in_8bit, config=config) - # config = InternVLChatConfig.from_pretrained(cache_dir) - # tokenizer = AutoTokenizer.from_pretrained(cache_dir, trust_remote_code=True, use_fast=False) - # model = InternVLChatModel.from_pretrained(cache_dir, low_cpu_mem_usage=True, config=config, torch_dtype=torch.bfloat16, load_in_8bit=load_in_8bit).eval() - if not load_in_8bit: - model = model.cuda() - # self.model=model - # self.device=self._device - self._tokenizer = tokenizer - # self.tokenizer=tokenizer - self._model = model - self._config = self._model.config - self.use_thumbnail = self.model.config.use_thumbnail - self.model.eval() - self.model.tie_weights() - self.truncation = truncation - self.batch_size_per_gpu = int(batch_size) - self.conv_template = conv_template - self.use_cache = use_cache - self.truncate_context = truncate_context - if accelerator.num_processes > 1: - assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." - # If you want to use DistributedType.DEEPSPEED, you have to run accelerate config before using the model - # Also, you have to select zero stage 0 (equivalent to DDP) in order to make the prepare model works - # I tried to set different parameters in the kwargs to let default zero 2 stage works, but it didn't work. - if accelerator.distributed_type == DistributedType.DEEPSPEED: - kwargs = { - "train_micro_batch_size_per_gpu": self.batch_size_per_gpu, - "train_batch_size": self.batch_size_per_gpu * accelerator.num_processes, - } - AcceleratorState().deepspeed_plugin.deepspeed_config_process(must_match=True, **kwargs) - eval_logger.info("Detected that you are using DistributedType.DEEPSPEED. Make sure you run `accelerate config` and set zero stage to 0") - - if accelerator.distributed_type == DistributedType.FSDP or accelerator.distributed_type == DistributedType.DEEPSPEED: - self._model = accelerator.prepare(self.model) - else: - self._model = accelerator.prepare_model(self.model, evaluation_mode=True) - self.accelerator = accelerator - if self.accelerator.is_local_main_process: - eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") - self._rank = self.accelerator.local_process_index - self._world_size = self.accelerator.num_processes - elif accelerator.num_processes == 1 and device_map == "auto": - eval_logger.info(f"Using {accelerator.num_processes} devices with tensor parallelism") - self._rank = 0 - self._word_size = 1 - else: - eval_logger.info(f"Using single device: {self._device}") - self.model.to(self._device) - self._rank = 0 - self._world_size = 1 - - # from internvl model - - self.image_size = config.force_image_size or config.vision_config.image_size - - def wrap_backbone_lora(self, r=128, lora_alpha=256, lora_dropout=0.05): - lora_config = LoraConfig( - r=r, - target_modules=["attn.qkv", "attn.proj", "mlp.fc1", "mlp.fc2"], - lora_alpha=lora_alpha, - lora_dropout=lora_dropout, - ) - self.vision_model = get_peft_model(self.vision_model, lora_config) - self.vision_model.print_trainable_parameters() - - def wrap_llm_lora(self, r=128, lora_alpha=256, lora_dropout=0.05): - lora_config = LoraConfig( - r=r, target_modules=["self_attn.q_proj", "self_attn.k_proj", "self_attn.v_proj", "self_attn.o_proj", "mlp.gate_proj", "mlp.down_proj", "mlp.up_proj"], lora_alpha=lora_alpha, lora_dropout=lora_dropout, task_type="CAUSAL_LM" - ) - self.language_model = get_peft_model(self.language_model, lora_config) - self.language_model.enable_input_require_grads() - self.language_model.print_trainable_parameters() - - def pixel_shuffle(self, x, scale_factor=0.5): - n, w, h, c = x.size() - # N, W, H, C --> N, W, H * scale, C // scale - x = x.view(n, w, int(h * scale_factor), int(c / scale_factor)) - # N, W, H * scale, C // scale --> N, H * scale, W, C // scale - x = x.permute(0, 2, 1, 3).contiguous() - # N, H * scale, W, C // scale --> N, H * scale, W * scale, C // (scale ** 2) - x = x.view(n, int(h * scale_factor), int(w * scale_factor), int(c / (scale_factor * scale_factor))) - if self.ps_version == "v1": - warnings.warn("In ps_version 'v1', the height and width have not been swapped back, " "which results in a transposed image.") - else: - x = x.permute(0, 2, 1, 3).contiguous() - return x - - def noised_embed(self, vit_embeds, noise_alpha=5): - dims = torch.tensor(vit_embeds.size(1) * vit_embeds.size(2)) - mag_norm = noise_alpha / torch.sqrt(dims) - noise = torch.zeros_like(vit_embeds).uniform_(-mag_norm, mag_norm) - return vit_embeds + noise - - def extract_feature(self, pixel_values): - if self.select_layer == -1: - vit_embeds = self.vision_model(pixel_values=pixel_values, output_hidden_states=False, return_dict=True).last_hidden_state - else: - vit_embeds = self.vision_model(pixel_values=pixel_values, output_hidden_states=True, return_dict=True).hidden_states[self.select_layer] - vit_embeds = vit_embeds[:, 1:, :] - - if self.training and self.neftune_alpha is not None: - vit_embeds = self.noised_embed(vit_embeds, self.neftune_alpha) - - h = w = int(vit_embeds.shape[1] ** 0.5) - vit_embeds = vit_embeds.reshape(vit_embeds.shape[0], h, w, -1) - vit_embeds = self.pixel_shuffle(vit_embeds, scale_factor=self.downsample_ratio) - vit_embeds = vit_embeds.reshape(vit_embeds.shape[0], -1, vit_embeds.shape[-1]) - vit_embeds = self.mlp1(vit_embeds) # .to(pixel_values.device) - return vit_embeds - - def multi_image_chat(self, tokenizer, pixel_values, image_counts, question, generation_config, history=None, return_history=False, IMG_START_TOKEN="", IMG_END_TOKEN="", IMG_CONTEXT_TOKEN=""): - img_context_token_id = tokenizer.convert_tokens_to_ids(IMG_CONTEXT_TOKEN) - self.img_context_token_id = img_context_token_id - if tokenizer.convert_tokens_to_ids("<|im_end|>") != 0: - eos_token_id = tokenizer.convert_tokens_to_ids("<|im_end|>") # 92542, InternLM2 - else: - eos_token_id = tokenizer.eos_token_id - - from internvl.conversation import get_conv_template - - template = get_conv_template(self.template) - - if history is None: - history = [] - image_tokens = "" - image_bs = pixel_values.shape[0] - # print(f"dynamic ViT batch size: {image_bs}, image_counts: {image_counts}") - for idx, image_count in enumerate(image_counts): - image_tokens += f" (图{idx+1}):" + IMG_START_TOKEN + IMG_CONTEXT_TOKEN * self.num_image_token * image_count + IMG_END_TOKEN - question = image_tokens + "\n" + question - else: - for old_question, old_answer in history: - template.append_message(template.roles[0], old_question) - template.append_message(template.roles[1], old_answer) - template.append_message(template.roles[0], question) - template.append_message(template.roles[1], None) - query = template.get_prompt() - model_inputs = tokenizer(query, return_tensors="pt") - input_ids = model_inputs["input_ids"].cuda() - attention_mask = model_inputs["attention_mask"].cuda() - generation_config["eos_token_id"] = eos_token_id - - generation_output = self.generate(pixel_values=pixel_values, input_ids=input_ids, attention_mask=attention_mask, **generation_config) - response = tokenizer.batch_decode(generation_output, skip_special_tokens=True)[0] - response = response.split("<|im_end|>")[0].strip() # for InternLM2 - history.append((question, response)) - if return_history: - return response, history - else: - query_to_print = query.replace(image_tokens, "") - # print(query_to_print, response) - return response - return response - - @property - def tokenizer(self): - return self._tokenizer - - @property - def model(self): - # returns the model, unwrapping it if using Accelerate - if hasattr(self, "accelerator"): - return self.accelerator.unwrap_model(self._model) - else: - return self._model - - @property - def batch_size(self): - return self.batch_size_per_gpu - - @property - def device(self): - return self._device - - @property - def rank(self): - return self._rank - - @property - def world_size(self): - return self._world_size - - def tok_encode(self, string: str, left_truncate_len=None, add_special_tokens=None) -> List[int]: - """ """ - add_special_tokens = False if add_special_tokens is None else add_special_tokens - encoding = self.tokenizer.encode(string, add_special_tokens=add_special_tokens) - # left-truncate the encoded context to be at most `left_truncate_len` tokens long - if left_truncate_len: - encoding = encoding[-left_truncate_len:] - return encoding - - def tok_decode(self, tokens): - try: - return self.tokenizer.decode(tokens) - except: - return self.tokenizer.decode([tokens]) - - def post_processing(self, response): - response = response.replace("\n", "").replace("不是", "No").replace("是", "Yes").replace("否", "No") - response = response.lower().replace("true", "yes").replace("false", "no") - pattern = re.compile(r"[\u4e00-\u9fa5]") - response = re.sub(pattern, "", response) - return response - - @torch.no_grad() - def generate( - self, - pixel_values: Optional[torch.FloatTensor] = None, - input_ids: Optional[torch.FloatTensor] = None, - attention_mask: Optional[torch.LongTensor] = None, - visual_features: Optional[torch.FloatTensor] = None, - generation_config: Optional[GenerationConfig] = None, - output_hidden_states: Optional[bool] = None, - return_dict: Optional[bool] = None, - **generate_kwargs, - ) -> torch.LongTensor: - assert self.img_context_token_id is not None - if pixel_values is not None: - if visual_features is not None: - vit_embeds = visual_features - else: - vit_embeds = self.extract_feature(pixel_values) - - input_embeds = self.language_model.get_input_embeddings()(input_ids) - B, N, C = input_embeds.shape - input_embeds = input_embeds.reshape(B * N, C) - - input_ids = input_ids.reshape(B * N) - selected = input_ids == self.img_context_token_id - assert selected.sum() != 0 - input_embeds[selected] = vit_embeds.reshape(-1, C).to(input_embeds.device) - - input_embeds = input_embeds.reshape(B, N, C) - else: - input_embeds = self.language_model.get_input_embeddings()(input_ids) - - outputs = self.language_model.generate( - inputs_embeds=input_embeds, - attention_mask=attention_mask, - generation_config=generation_config, - output_hidden_states=output_hidden_states, - return_dict=return_dict, - use_cache=True, - **generate_kwargs, - ) - - return outputs - - def flatten(self, input): - new_list = [] - for i in input: - for j in i: - new_list.append(j) - return new_list - - def load_image(self, flattened_visuals, input_size=224): - assert flattened_visuals[0].mode == "RGB" - image = flattened_visuals[0].convert("RGB") - transform = build_transform(is_train=False, input_size=input_size) - if self.dynamic: - images = dynamic_preprocess(image, image_size=input_size, use_thumbnail=self.use_thumbnail, max_num=self.max_num) - else: - images = [image] - pixel_values = [transform(image) for image in images] - pixel_values = torch.stack(pixel_values) - return pixel_values - - def generate_until(self, requests: List[Instance]) -> List[str]: - res = [] - - def _collate(x): - # the negative sign on len(toks) sorts descending - this has a few advantages: - # - time estimates will always be over not underestimates, which is more useful for planning - # - to know the size of a batch when going through the list, you know the first one is always the batch - # padded context length. this is useful to simplify the batching logic and more importantly to make - # automatic adaptive batches much much easier to implement - # - any OOMs will happen right away rather than near the end - toks = self.tok_encode(x[0]) - return -len(toks), x[0] - - # we group requests by their generation_kwargs, - # so that we don't try to execute e.g. greedy sampling and temp=0.8 sampling - # in the same batch. - re_ords = utils.Collator([reg.args for reg in requests], _collate, grouping=True) - chunks = re_ords.get_batched(n=self.batch_size, batch_fn=None) - num_iters = len(requests) // self.batch_size if len(requests) % self.batch_size == 0 else len(requests) // self.batch_size + 1 - pbar = tqdm(total=num_iters, disable=(self.rank != 0), desc="Model Responding") - for chunk in chunks: - contexts, all_gen_kwargs, doc_to_visual, doc_id, task, split = zip(*chunk) - task = task[0] - split = split[0] - batched_visuals = [doc_to_visual[0](self.task_dict[task][split][ids]) for ids in doc_id] # [B, N] - flattened_visuals = self.flatten(batched_visuals) - pixel_values = self.load_image(flattened_visuals, self.image_size).cuda().to(torch.bfloat16) - gen_kwargs = all_gen_kwargs[0] - - generation_config = dict( - do_sample=False, - top_k=50, - top_p=0.9, - num_beams=5, - max_new_tokens=20, - eos_token_id=self.tokenizer.eos_token_id, - ) - question = contexts[0] - response = self.model.chat(tokenizer=self.tokenizer, pixel_values=pixel_values, question=question, generation_config=generation_config) - # TODO(choiszt) try batch_chat for multiple inputs - response = self.post_processing(response) - res.append(response) - self.cache_hook.add_partial("generate_until", (question, gen_kwargs), response) - pbar.update(1) - res = re_ords.get_original(res) - return res - # print(chunk) - - def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: - pass From bf18c40550bc0766cf4e1ed04ba8e8fde6234cb4 Mon Sep 17 00:00:00 2001 From: Shuai Liu <76559926+choiszt@users.noreply.github.com> Date: Tue, 11 Jun 2024 22:27:33 +0800 Subject: [PATCH 152/181] Delete lmms_eval/tasks/vatex/vatex_val_ZH.yaml --- lmms_eval/tasks/vatex/vatex_val_ZH.yaml | 35 ------------------------- 1 file changed, 35 deletions(-) delete mode 100755 lmms_eval/tasks/vatex/vatex_val_ZH.yaml diff --git a/lmms_eval/tasks/vatex/vatex_val_ZH.yaml b/lmms_eval/tasks/vatex/vatex_val_ZH.yaml deleted file mode 100755 index 643059354..000000000 --- a/lmms_eval/tasks/vatex/vatex_val_ZH.yaml +++ /dev/null @@ -1,35 +0,0 @@ -dataset_path: lmms-lab/vatex_from_url -dataset_name: vatex_val_zh -task: vatex_val_zh -test_split: validation -output_type: generate_until -doc_to_visual: !function utils.vatex_ZH_doc_to_visual -doc_to_text: !function utils.vatex_doc_to_text -doc_to_target: "answer" -generation_kwargs: - max_new_tokens: 64 - temperature: 0 - top_p: 1.0 - num_beams: 1 - do_sample: false -model_specific_prompt_kwargs: - default: - prompt: 请为提供的视频提供一句话简短的字幕。 -process_results: !function utils.vatex_process_CN_result -# Note that the metric name can be either a registed metric function (such as the case for GQA) or a key name returned by process_results -metric_list: - - metric: vatex_Bleu_4 - aggregation : !function utils.vatex_bleu4 - higher_is_better : true - - metric: vatex_METEOR - aggregation : !function utils.vatex_meteor - higher_is_better : true - - metric: vatex_ROUGE_L - aggregation : !function utils.vatex_rougel - higher_is_better : true - - metric: vatex_CIDEr - aggregation : !function utils.vatex_cider - higher_is_better : true -metadata: - - version: 0.0 -include: _default_template_yaml \ No newline at end of file From b995e13247019df9fe012fd70c111b256f56a76d Mon Sep 17 00:00:00 2001 From: Shuai Liu <76559926+choiszt@users.noreply.github.com> Date: Tue, 11 Jun 2024 22:29:08 +0800 Subject: [PATCH 153/181] Update utils.py --- lmms_eval/tasks/videomme/utils.py | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/lmms_eval/tasks/videomme/utils.py b/lmms_eval/tasks/videomme/utils.py index 5cec7274d..5cd873530 100755 --- a/lmms_eval/tasks/videomme/utils.py +++ b/lmms_eval/tasks/videomme/utils.py @@ -96,11 +96,9 @@ def videomme_doc_to_visual(doc): # remove function definition since yaml load cannot handle it if "!function" not in line: safe_data.append(line) - - taskname= yaml.safe_load("".join(safe_data))['task'] - cache_dir=os.path.join(base_cache_dir,taskname) - video_path = doc["videoID"] + ".mp4" - + cache_name = yaml.safe_load("".join(safe_data))["dataset_kwargs"]["cache_dir"] + cache_dir = os.path.join(base_cache_dir, cache_name) + video_path = doc["videoID"] + ".mp4" video_path = os.path.join(cache_dir, video_path) if os.path.exists(video_path): video_path = video_path @@ -114,16 +112,9 @@ def videomme_doc_to_visual(doc): def videomme_doc_to_text(doc, model_specific_prompt_kwargs=None): - question = doc['question'] - option = str(doc['options']) - question=question+"\n"+option - - if "pre_prompt" in model_specific_prompt_kwargs and model_specific_prompt_kwargs["pre_prompt"] != "": - question = question.replace(replace_prompt, "") - question = f"{model_specific_prompt_kwargs['pre_prompt']}{question}" - if "post_prompt" in model_specific_prompt_kwargs and model_specific_prompt_kwargs["post_prompt"] != "": - question = question.replace(replace_prompt, "") - question = f"{question}{model_specific_prompt_kwargs['post_prompt']}" + question = doc["question"] + option = str(doc["options"]) + question = question + "\n" + option+model_specific_prompt_kwargs['post_prompt'] return question From 16de2ddee83b2ddafbcba37de6192051d1393639 Mon Sep 17 00:00:00 2001 From: Shuai Liu <76559926+choiszt@users.noreply.github.com> Date: Tue, 11 Jun 2024 22:29:23 +0800 Subject: [PATCH 154/181] Update videomme.yaml --- lmms_eval/tasks/videomme/videomme.yaml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lmms_eval/tasks/videomme/videomme.yaml b/lmms_eval/tasks/videomme/videomme.yaml index 3025bc5f0..0f88f01ad 100755 --- a/lmms_eval/tasks/videomme/videomme.yaml +++ b/lmms_eval/tasks/videomme/videomme.yaml @@ -1,7 +1,8 @@ -dataset_path: lmms-lab/Video-MME_from_url +dataset_path: lmms-lab/Video-MME dataset_kwargs: token: True - From_YouTube: True + cache_dir: videomme + # From_YouTube: True task: videomme test_split: test output_type: generate_until @@ -28,14 +29,14 @@ model_specific_prompt_kwargs: gpt4v: pre_prompt: "" post_prompt: "\nAnswer the question with A, B, C, or D." - qwen_vl: - pre_prompt: "" - post_prompt: " Answer:" - otterhd: - pre_prompt: "" - post_prompt: " Answer:" + # qwen_vl: + # pre_prompt: "" + # post_prompt: " Answer:" + # otterhd: + # pre_prompt: "" + # post_prompt: " Answer:" xcomposer2_4khd: pre_prompt: "[UNUSED_TOKEN_146]user\n" - post_prompt: " Answer this question briefly[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n" + post_prompt: " Answer this question with A, B, C, or D.[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n" metadata: - version: 0.0 From 4a32971f8b5af1097fec6aa28e9ffc50b92d73de Mon Sep 17 00:00:00 2001 From: Bo Li Date: Tue, 11 Jun 2024 14:41:55 +0000 Subject: [PATCH 155/181] chore: Update dataset paths and dependencies --- lmms_eval/api/task.py | 14 +++++--- lmms_eval/tasks/vatex/vatex_test.yaml | 45 +++++++++++++------------ lmms_eval/tasks/vatex/vatex_val_ZH.yaml | 35 ------------------- lmms_eval/tasks/vatex/vatex_val_zh.yaml | 44 ++++++++++++------------ 4 files changed, 56 insertions(+), 82 deletions(-) delete mode 100755 lmms_eval/tasks/vatex/vatex_val_ZH.yaml diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index b3fa54bd8..44c6dc9b5 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -751,14 +751,20 @@ def _download_from_youtube(path): accelerator = Accelerator() if accelerator.is_main_process: force_download = dataset_kwargs.get("force_download", False) - # cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset", force_download=force_download, etag_timeout=60,ignore_patterns=["*.zip"]) + force_unzip = dataset_kwargs.get("force_unzip", False) cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset", force_download=force_download, etag_timeout=60) zip_files = glob(os.path.join(cache_path, "**/*.zip"), recursive=True) - if force_download or (not os.path.exists(cache_dir) and len(zip_files) > 0): + def unzip_video_data(zip_file): + import zipfile + + with zipfile.ZipFile(zip_file, "r") as zip_ref: + zip_ref.extractall(cache_dir) + eval_logger.info(f"Extracted all files from {zip_file} to {cache_dir}") + + if force_unzip or (not os.path.exists(cache_dir) and len(zip_files) > 0): for zip_file in zip_files: - eval_logger.info(f"Unzipping {zip_file} to {cache_dir}") - shutil.unpack_archive(zip_file, cache_dir) + unzip_video_data(zip_file) accelerator.wait_for_everyone() dataset_kwargs.pop("cache_dir") diff --git a/lmms_eval/tasks/vatex/vatex_test.yaml b/lmms_eval/tasks/vatex/vatex_test.yaml index 54d0886c3..ab0c0ff75 100644 --- a/lmms_eval/tasks/vatex/vatex_test.yaml +++ b/lmms_eval/tasks/vatex/vatex_test.yaml @@ -6,39 +6,40 @@ output_type: generate_until doc_to_visual: !function utils.vatex_test_doc_to_visual doc_to_text: !function utils.vatex_test_doc_to_text doc_to_target: "answer" -model_specific_prompt_kwargs: - default: - prompt: Provide a one-sentence caption for the provided Video. - gemini_api: - prompt: Provide a brief single-sentence caption for the last video below. Do not give any reasoning, just the caption. You must follow the captioning style of the preceding videos. Do not start your response with "Output:", just provide the caption. - -generation_kwargs: - max_new_tokens: 64 - temperature: 0 - top_p: 1.0 - num_beams: 1 - do_sample: false + process_results: !function utils.vatex_process_result # Note that the metric name can be either a registed metric function (such as the case for GQA) or a key name returned by process_results metric_list: - - metric: vatex_Bleu_4 - aggregation : !function utils.vatex_bleu4 - higher_is_better : true + - metric: vatex_Bleu_4 + aggregation: !function utils.vatex_bleu4 + higher_is_better: true - metric: vatex_METEOR - aggregation : !function utils.vatex_meteor - higher_is_better : true + aggregation: !function utils.vatex_meteor + higher_is_better: true - metric: vatex_ROUGE_L - aggregation : !function utils.vatex_rougel - higher_is_better : true + aggregation: !function utils.vatex_rougel + higher_is_better: true - metric: vatex_CIDEr - aggregation : !function utils.vatex_cider - higher_is_better : true + aggregation: !function utils.vatex_cider + higher_is_better: true metadata: version: 0.0 -# include: _default_template_yaml dataset_kwargs: token: True video: True #skip download video from hf cache_dir: vatex_test # From_YouTube: True + +model_specific_prompt_kwargs: + default: + prompt: Provide a one-sentence caption for the provided Video. + gemini_api: + prompt: Provide a brief single-sentence caption for the last video below. Do not give any reasoning, just the caption. You must follow the captioning style of the preceding videos. Do not start your response with "Output:", just provide the caption. + +generation_kwargs: + max_new_tokens: 64 + temperature: 0 + top_p: 1.0 + num_beams: 1 + do_sample: false diff --git a/lmms_eval/tasks/vatex/vatex_val_ZH.yaml b/lmms_eval/tasks/vatex/vatex_val_ZH.yaml deleted file mode 100755 index 643059354..000000000 --- a/lmms_eval/tasks/vatex/vatex_val_ZH.yaml +++ /dev/null @@ -1,35 +0,0 @@ -dataset_path: lmms-lab/vatex_from_url -dataset_name: vatex_val_zh -task: vatex_val_zh -test_split: validation -output_type: generate_until -doc_to_visual: !function utils.vatex_ZH_doc_to_visual -doc_to_text: !function utils.vatex_doc_to_text -doc_to_target: "answer" -generation_kwargs: - max_new_tokens: 64 - temperature: 0 - top_p: 1.0 - num_beams: 1 - do_sample: false -model_specific_prompt_kwargs: - default: - prompt: 请为提供的视频提供一句话简短的字幕。 -process_results: !function utils.vatex_process_CN_result -# Note that the metric name can be either a registed metric function (such as the case for GQA) or a key name returned by process_results -metric_list: - - metric: vatex_Bleu_4 - aggregation : !function utils.vatex_bleu4 - higher_is_better : true - - metric: vatex_METEOR - aggregation : !function utils.vatex_meteor - higher_is_better : true - - metric: vatex_ROUGE_L - aggregation : !function utils.vatex_rougel - higher_is_better : true - - metric: vatex_CIDEr - aggregation : !function utils.vatex_cider - higher_is_better : true -metadata: - - version: 0.0 -include: _default_template_yaml \ No newline at end of file diff --git a/lmms_eval/tasks/vatex/vatex_val_zh.yaml b/lmms_eval/tasks/vatex/vatex_val_zh.yaml index 095d2c629..a70770a53 100755 --- a/lmms_eval/tasks/vatex/vatex_val_zh.yaml +++ b/lmms_eval/tasks/vatex/vatex_val_zh.yaml @@ -6,34 +6,22 @@ output_type: generate_until doc_to_visual: !function utils.vatex_ZH_doc_to_visual doc_to_text: !function utils.vatex_ZH_doc_to_text doc_to_target: "answer" -generation_kwargs: - max_new_tokens: 64 - temperature: 0 - top_p: 1.0 - num_beams: 1 - do_sample: false -model_specific_prompt_kwargs: - default: - prompt: 请为提供的视频提供一句话简短的字幕。 - - gemini_api: - prompt: 请为提供的视频提供简短的描述。不要给出任何理由,只提供描述。您必须沿用前面视频的描述样式。不需要以 "输出"开头,只需提供描述即可. process_results: !function utils.vatex_process_CN_result # Note that the metric name can be either a registed metric function (such as the case for GQA) or a key name returned by process_results metric_list: - - metric: vatex_Bleu_4 - aggregation : !function utils.vatex_bleu4 - higher_is_better : true + - metric: vatex_Bleu_4 + aggregation: !function utils.vatex_bleu4 + higher_is_better: true - metric: vatex_METEOR - aggregation : !function utils.vatex_meteor - higher_is_better : true + aggregation: !function utils.vatex_meteor + higher_is_better: true - metric: vatex_ROUGE_L - aggregation : !function utils.vatex_rougel - higher_is_better : true + aggregation: !function utils.vatex_rougel + higher_is_better: true - metric: vatex_CIDEr - aggregation : !function utils.vatex_cider - higher_is_better : true + aggregation: !function utils.vatex_cider + higher_is_better: true metadata: - version: 0.0 # include: _default_template_yaml @@ -41,5 +29,19 @@ metadata: dataset_kwargs: token: True video: True #skip download video from hf + force_unzip: True cache_dir: vatex_val_zh # From_YouTube: True + +model_specific_prompt_kwargs: + default: + prompt: Provide a one-sentence caption for the provided Video. + gemini_api: + prompt: Provide a brief single-sentence caption for the last video below. Do not give any reasoning, just the caption. You must follow the captioning style of the preceding videos. Do not start your response with "Output:", just provide the caption. + +generation_kwargs: + max_new_tokens: 64 + temperature: 0 + top_p: 1.0 + num_beams: 1 + do_sample: false From 8f2c48aac7ae1ce0ebc80fc4415a81d782181692 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Tue, 11 Jun 2024 14:42:16 +0000 Subject: [PATCH 156/181] chore: Remove force_unzip flag in vatex_val_zh.yaml --- lmms_eval/tasks/vatex/vatex_val_zh.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/lmms_eval/tasks/vatex/vatex_val_zh.yaml b/lmms_eval/tasks/vatex/vatex_val_zh.yaml index a70770a53..cdfbdb4b6 100755 --- a/lmms_eval/tasks/vatex/vatex_val_zh.yaml +++ b/lmms_eval/tasks/vatex/vatex_val_zh.yaml @@ -29,7 +29,6 @@ metadata: dataset_kwargs: token: True video: True #skip download video from hf - force_unzip: True cache_dir: vatex_val_zh # From_YouTube: True From 96cbe1605e029b3ebb0678fc4260bf6e1758dd95 Mon Sep 17 00:00:00 2001 From: Shuai Liu <76559926+choiszt@users.noreply.github.com> Date: Tue, 11 Jun 2024 23:22:52 +0800 Subject: [PATCH 157/181] Update vatex_val_zh.yaml --- lmms_eval/tasks/vatex/vatex_val_zh.yaml | 43 ++++++++++++------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/lmms_eval/tasks/vatex/vatex_val_zh.yaml b/lmms_eval/tasks/vatex/vatex_val_zh.yaml index cdfbdb4b6..095d2c629 100755 --- a/lmms_eval/tasks/vatex/vatex_val_zh.yaml +++ b/lmms_eval/tasks/vatex/vatex_val_zh.yaml @@ -6,22 +6,34 @@ output_type: generate_until doc_to_visual: !function utils.vatex_ZH_doc_to_visual doc_to_text: !function utils.vatex_ZH_doc_to_text doc_to_target: "answer" +generation_kwargs: + max_new_tokens: 64 + temperature: 0 + top_p: 1.0 + num_beams: 1 + do_sample: false +model_specific_prompt_kwargs: + default: + prompt: 请为提供的视频提供一句话简短的字幕。 + + gemini_api: + prompt: 请为提供的视频提供简短的描述。不要给出任何理由,只提供描述。您必须沿用前面视频的描述样式。不需要以 "输出"开头,只需提供描述即可. process_results: !function utils.vatex_process_CN_result # Note that the metric name can be either a registed metric function (such as the case for GQA) or a key name returned by process_results metric_list: - - metric: vatex_Bleu_4 - aggregation: !function utils.vatex_bleu4 - higher_is_better: true + - metric: vatex_Bleu_4 + aggregation : !function utils.vatex_bleu4 + higher_is_better : true - metric: vatex_METEOR - aggregation: !function utils.vatex_meteor - higher_is_better: true + aggregation : !function utils.vatex_meteor + higher_is_better : true - metric: vatex_ROUGE_L - aggregation: !function utils.vatex_rougel - higher_is_better: true + aggregation : !function utils.vatex_rougel + higher_is_better : true - metric: vatex_CIDEr - aggregation: !function utils.vatex_cider - higher_is_better: true + aggregation : !function utils.vatex_cider + higher_is_better : true metadata: - version: 0.0 # include: _default_template_yaml @@ -31,16 +43,3 @@ dataset_kwargs: video: True #skip download video from hf cache_dir: vatex_val_zh # From_YouTube: True - -model_specific_prompt_kwargs: - default: - prompt: Provide a one-sentence caption for the provided Video. - gemini_api: - prompt: Provide a brief single-sentence caption for the last video below. Do not give any reasoning, just the caption. You must follow the captioning style of the preceding videos. Do not start your response with "Output:", just provide the caption. - -generation_kwargs: - max_new_tokens: 64 - temperature: 0 - top_p: 1.0 - num_beams: 1 - do_sample: false From 699d7fd3092a2fd98f78c7d64d1469fbc17f7697 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Tue, 11 Jun 2024 15:25:15 +0000 Subject: [PATCH 158/181] chore: Update prompt for video caption in vatex_test.yaml --- lmms_eval/tasks/vatex/vatex_test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lmms_eval/tasks/vatex/vatex_test.yaml b/lmms_eval/tasks/vatex/vatex_test.yaml index ab0c0ff75..989108b8c 100644 --- a/lmms_eval/tasks/vatex/vatex_test.yaml +++ b/lmms_eval/tasks/vatex/vatex_test.yaml @@ -33,7 +33,7 @@ dataset_kwargs: model_specific_prompt_kwargs: default: - prompt: Provide a one-sentence caption for the provided Video. + prompt: Provide a one-sentence caption for the provided video. gemini_api: prompt: Provide a brief single-sentence caption for the last video below. Do not give any reasoning, just the caption. You must follow the captioning style of the preceding videos. Do not start your response with "Output:", just provide the caption. From 2c8b03e0e856856dc84473df94532bb68eb4e739 Mon Sep 17 00:00:00 2001 From: Fanyi Pu Date: Tue, 11 Jun 2024 23:50:31 +0800 Subject: [PATCH 159/181] chore: Update nltk installation and downloads in utils.py --- lmms_eval/tasks/nextqa/utils.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/lmms_eval/tasks/nextqa/utils.py b/lmms_eval/tasks/nextqa/utils.py index e49c29323..5d5b267f3 100644 --- a/lmms_eval/tasks/nextqa/utils.py +++ b/lmms_eval/tasks/nextqa/utils.py @@ -9,16 +9,23 @@ eval_logger = logging.getLogger("lmms-eval") try: - import nltk - from nltk.tokenize import word_tokenize - from nltk.corpus import wordnet from pywsd.utils import lemmatize_sentence - - nltk.download("averaged_perceptron_tagger", quiet=True) - nltk.download("wordnet", quiet=True) except ImportError: eval_logger.debug("pywsd not installed. Please install pywsd to use this module. You can install it by running 'pip install pywsd'") +try: + from nltk.tokenize import word_tokenize + from nltk.corpus import wordnet + try: + import nltk + nltk.download("averaged_perceptron_tagger", quiet=True) + nltk.download("wordnet", quiet=True) + nltk.download('punkt', quiet=True) + except Exception as e: + eval_logger.debug(f"nltk download failed: {e}") +except ImportError: + eval_logger.debug("nltk not installed. Please install nltk to use this module. You can install it by running 'pip install nltk'") + from lmms_eval.tasks._task_utils.video_loader import get_cache_dir, get_video import numpy as np From 494db6a6ae5f718c9100ca01f0343e7c1a71f82d Mon Sep 17 00:00:00 2001 From: Fanyi Pu Date: Tue, 11 Jun 2024 23:50:48 +0800 Subject: [PATCH 160/181] lint --- lmms_eval/models/model_utils/load_video.py | 5 +- lmms_eval/tasks/egoschema/utils.py | 10 +- lmms_eval/tasks/mmmu/utils_group_img.py | 1 - lmms_eval/tasks/nextqa/utils.py | 4 +- lmms_eval/tasks/tempcompass/utils.py | 2 +- lmms_eval/tasks/videomme/utils.py | 112 +++++++++------------ tools/get_video_avg_time.py | 13 ++- 7 files changed, 71 insertions(+), 76 deletions(-) diff --git a/lmms_eval/models/model_utils/load_video.py b/lmms_eval/models/model_utils/load_video.py index 68c89b544..1dddd358c 100644 --- a/lmms_eval/models/model_utils/load_video.py +++ b/lmms_eval/models/model_utils/load_video.py @@ -2,6 +2,7 @@ from av.codec.context import CodecContext import numpy as np + # This one is faster def record_video_length_stream(container, indices): frames = [] @@ -14,6 +15,7 @@ def record_video_length_stream(container, indices): frames.append(frame) return frames + # This one works for all types of video def record_video_length_packet(container): frames = [] @@ -21,10 +23,11 @@ def record_video_length_packet(container): # https://www.cnblogs.com/beyond-tester/p/17641872.html # context = CodecContext.create("libvpx-vp9", "r") for packet in container.demux(video=0): - for frame in packet.decode(): + for frame in packet.decode(): frames.append(frame) return frames + def read_video_pyav(video_path, num_frm=8): container = av.open(video_path) diff --git a/lmms_eval/tasks/egoschema/utils.py b/lmms_eval/tasks/egoschema/utils.py index 2fa272c61..7278db34e 100755 --- a/lmms_eval/tasks/egoschema/utils.py +++ b/lmms_eval/tasks/egoschema/utils.py @@ -87,23 +87,23 @@ def egoschema_process_results(doc, result): # Process result for mcq answer generation def egoschema_process_results_generation(doc, result): pred = result[0] - + # Determine whether the video LLM output is correct, based on word matching rules # Ensure each option string ends with a period option_strs = [opt if opt.endswith(".") else opt + "." for opt in doc["option"]] # Complete option strings option_sents = [opt.split(". ")[1] if ". " in opt else opt for opt in option_strs] # Option sentence option_inds = [opt.split(". ")[0] if ". " in opt else opt for opt in option_strs] # Option letter, e.g., A, B, C, D, E - + video_llm_pred = None index = -1 - + # Check if the prediction matches any of the complete option strings for idx, option_str in enumerate(option_strs): if pred == option_str: video_llm_pred = option_str index = idx break - + # Check if the prediction matches any of the option sentences if not video_llm_pred: for idx, option_sent in enumerate(option_sents): @@ -119,7 +119,7 @@ def egoschema_process_results_generation(doc, result): video_llm_pred = option_ind index = idx break - + return {"submission": {doc["video_idx"]: index}, "score": {"pred": index, "ground_truth": doc["answer"]}} diff --git a/lmms_eval/tasks/mmmu/utils_group_img.py b/lmms_eval/tasks/mmmu/utils_group_img.py index ed7008342..2470d7c79 100644 --- a/lmms_eval/tasks/mmmu/utils_group_img.py +++ b/lmms_eval/tasks/mmmu/utils_group_img.py @@ -14,7 +14,6 @@ import numpy as np - def add_order_label(image, label, font_size=40): # Create a drawing context draw = ImageDraw.Draw(image) diff --git a/lmms_eval/tasks/nextqa/utils.py b/lmms_eval/tasks/nextqa/utils.py index 5d5b267f3..ca5d8bac2 100644 --- a/lmms_eval/tasks/nextqa/utils.py +++ b/lmms_eval/tasks/nextqa/utils.py @@ -16,11 +16,13 @@ try: from nltk.tokenize import word_tokenize from nltk.corpus import wordnet + try: import nltk + nltk.download("averaged_perceptron_tagger", quiet=True) nltk.download("wordnet", quiet=True) - nltk.download('punkt', quiet=True) + nltk.download("punkt", quiet=True) except Exception as e: eval_logger.debug(f"nltk download failed: {e}") except ImportError: diff --git a/lmms_eval/tasks/tempcompass/utils.py b/lmms_eval/tasks/tempcompass/utils.py index 312581a7a..83574347a 100644 --- a/lmms_eval/tasks/tempcompass/utils.py +++ b/lmms_eval/tasks/tempcompass/utils.py @@ -387,7 +387,7 @@ def parse_llm_output_for_captioning(llm_output, gt_answer): # Check if the chatgpt answer is the ground-truth answer answer_counts = sum(eval_result["chatgpt-answer"].count(prefix) for prefix in ["A.", "B.", "C.", "D."]) # calculate the number of 'A.', 'B.', 'C.', 'D.' in chatgpt-answer - + if eval_result["chatgpt-answer"].split(". ")[0] == gt_answer.split(". ")[0] and answer_counts == 1: eval_result["rating"] = 1 else: diff --git a/lmms_eval/tasks/videomme/utils.py b/lmms_eval/tasks/videomme/utils.py index 5cd873530..3631f87cd 100755 --- a/lmms_eval/tasks/videomme/utils.py +++ b/lmms_eval/tasks/videomme/utils.py @@ -13,15 +13,8 @@ eval_logger = logging.getLogger("lmms-eval") -VIDEO_TYPE=["short","medium","long"] -CATEGORIES = [ - "Knowledge", - "Film & Television", - "Sports Competition", - "Artistic Performance", - "Life Record", - "Multilingual" -] +VIDEO_TYPE = ["short", "medium", "long"] +CATEGORIES = ["Knowledge", "Film & Television", "Sports Competition", "Artistic Performance", "Life Record", "Multilingual"] SUB_CATEGORIES = [ "Humanity & History", @@ -53,7 +46,7 @@ "Travel", "Pet & Animal", "Exercise", - "Multilingual" + "Multilingual", ] TASK_CATEGORIES = [ @@ -82,11 +75,12 @@ # safe_data.append(line) # config = yaml.safe_load("".join(safe_data)) - + hf_home = os.getenv("HF_HOME", "~/.cache/huggingface/") # cache_dir = os.path.join(hf_home, cache_dir) # base_cache_dir = config["dataset_kwargs"]["cache_dir"] -base_cache_dir=os.path.expanduser(hf_home) +base_cache_dir = os.path.expanduser(hf_home) + def videomme_doc_to_visual(doc): with open(Path(__file__).parent / "videomme.yaml", "r") as f: @@ -114,7 +108,7 @@ def videomme_doc_to_visual(doc): def videomme_doc_to_text(doc, model_specific_prompt_kwargs=None): question = doc["question"] option = str(doc["options"]) - question = question + "\n" + option+model_specific_prompt_kwargs['post_prompt'] + question = question + "\n" + option + model_specific_prompt_kwargs["post_prompt"] return question @@ -125,10 +119,8 @@ def extract_characters_regex(s): "The correct answer is", "The answer is", "The answer", - "The best option is" - "The correct option is", - "Best answer:" - "Best option:", + "The best option is" "The correct option is", + "Best answer:" "Best option:", ] for answer_prefix in answer_prefixes: s = s.replace(answer_prefix, "") @@ -136,19 +128,19 @@ def extract_characters_regex(s): if len(s.split()) > 10 and not re.search("[ABCD]", s): return "" - matches = re.search(r'[ABCD]', s) + matches = re.search(r"[ABCD]", s) if matches is None: return "" return matches[0] -matrices=[] +matrices = [] for i in VIDEO_TYPE: for j in CATEGORIES: for k in SUB_CATEGORIES: for l in TASK_CATEGORIES: - matrices.append(f"{i}_{j}_{k}_{l}") + matrices.append(f"{i}_{j}_{k}_{l}") def videomme_process_results(doc, results): @@ -163,12 +155,10 @@ def videomme_process_results(doc, results): pred_ans = extract_characters_regex(pred) # gt_ans = doc["answer"].lower().strip().replace(".", "") - category=doc["domain"] - sub_category=doc["sub_category"] - task_category=doc['task_type'] - data_dict= {"question_id": doc["question_id"],"duration":doc["duration"] ,"category": category,\ - "sub_category":sub_category,"task_category":task_category,\ - "pred_answer": pred_ans,"answer":doc['answer']} + category = doc["domain"] + sub_category = doc["sub_category"] + task_category = doc["task_type"] + data_dict = {"question_id": doc["question_id"], "duration": doc["duration"], "category": category, "sub_category": sub_category, "task_category": task_category, "pred_answer": pred_ans, "answer": doc["answer"]} # return {f"videomme_percetion_score": data_dict for metric in matrices} return {f"videomme_percetion_score": data_dict} @@ -187,60 +177,58 @@ def videomme_aggregate_results(results): for category in CATEGORIES: for sub_category in SUB_CATEGORIES: for task_category in TASK_CATEGORIES: - key=f"{video_type}_{category}_{sub_category}_{task_category}" - category2score[key] = {'correct': 0, "answered": 0} + key = f"{video_type}_{category}_{sub_category}_{task_category}" + category2score[key] = {"correct": 0, "answered": 0} for result in results: - video_type=result['duration'] - category=result['category'] - sub_category=result['sub_category'] - task_category=result['task_category'] - key=f"{video_type}_{category}_{sub_category}_{task_category}" - category2score[key]['answered']+=1 - category2score[key]['correct']+=result['pred_answer']==result['answer'] - + video_type = result["duration"] + category = result["category"] + sub_category = result["sub_category"] + task_category = result["task_category"] + key = f"{video_type}_{category}_{sub_category}_{task_category}" + category2score[key]["answered"] += 1 + category2score[key]["correct"] += result["pred_answer"] == result["answer"] for video_type in VIDEO_TYPE: - total_correct=0 - total_answered=0 - for k,v in category2score.items(): + total_correct = 0 + total_answered = 0 + for k, v in category2score.items(): if video_type in k: - total_correct+=v['correct'] - total_answered+=v['answered'] + total_correct += v["correct"] + total_answered += v["answered"] eval_logger.info(f"Evaluation on video Type: {video_type}: {100 * total_correct / total_answered if total_answered > 0 else 0 : .1f}%") - for category in CATEGORIES: - total_correct=0 - total_answered=0 - for k,v in category2score.items(): + total_correct = 0 + total_answered = 0 + for k, v in category2score.items(): if category in k: - total_correct+=v['correct'] - total_answered+=v['answered'] + total_correct += v["correct"] + total_answered += v["answered"] eval_logger.info(f"Evaluation on Categories: {category}: {100 * total_correct / total_answered if total_answered > 0 else 0 : .1f}%") for sub_cate in SUB_CATEGORIES: - total_correct=0 - total_answered=0 - for k,v in category2score.items(): + total_correct = 0 + total_answered = 0 + for k, v in category2score.items(): if sub_cate in k: - total_correct+=v['correct'] - total_answered+=v['answered'] + total_correct += v["correct"] + total_answered += v["answered"] eval_logger.info(f"Evaluation on Video Sub Categories: {sub_cate}: {100 * total_correct / total_answered if total_answered > 0 else 0 : .1f}%") for task_cate in TASK_CATEGORIES: - total_correct=0 - total_answered=0 - for k,v in category2score.items(): + total_correct = 0 + total_answered = 0 + for k, v in category2score.items(): if task_cate in k: - total_correct+=v['correct'] - total_answered+=v['answered'] + total_correct += v["correct"] + total_answered += v["answered"] eval_logger.info(f"Evaluation on Task Categories: {task_cate}: {100 * total_correct / total_answered if total_answered > 0 else 0 : .1f}%") - total_correct=0 - total_answered=0 - for k,v in category2score.items(): - total_correct+=v['correct'] - total_answered+=v['answered'] + total_correct = 0 + total_answered = 0 + for k, v in category2score.items(): + total_correct += v["correct"] + total_answered += v["answered"] eval_logger.info(f"Overall Performance: {100 * total_correct / total_answered if total_answered > 0 else 0 : .1f}%") return 100 * total_correct / total_answered if total_answered > 0 else 0 diff --git a/tools/get_video_avg_time.py b/tools/get_video_avg_time.py index 164d0c62d..e08d37ae7 100644 --- a/tools/get_video_avg_time.py +++ b/tools/get_video_avg_time.py @@ -8,22 +8,25 @@ # tasks = ["nextqa_oe_val"] data_stats = {} + # This one is faster def record_video_length_stream(container): video = container.streams.video[0] - video_length = (float(video.duration * video.time_base)) # in seconds + video_length = float(video.duration * video.time_base) # in seconds return video_length + # This one works for all types of video def record_video_length_packet(container): video_length = 0 # context = CodecContext.create("libvpx-vp9", "r") for packet in container.demux(video=0): for frame in packet.decode(): - video_length = frame.time # The last frame time represent the video time - + video_length = frame.time # The last frame time represent the video time + return video_length + if __name__ == "__main__": initialize_tasks() @@ -39,10 +42,10 @@ def record_video_length_packet(container): for doc in tqdm(docs, desc=f"Processing {task_name}"): video_path = doc_to_visual(doc) container = av.open(video_path[0]) - + if "webm" not in video_path[0] and "mkv" not in video_path[0]: try: - video_length = record_video_length_stream(container) # in seconds + video_length = record_video_length_stream(container) # in seconds except: video_length = record_video_length_packet(container) else: From ce44672bd6220f178344f39730f078ad0e705f52 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Tue, 11 Jun 2024 18:05:19 +0000 Subject: [PATCH 161/181] Update video_decode_backend to "pyav" in llava_vid.py --- lmms_eval/models/llava_vid.py | 2 +- lmms_eval/tasks/vatex/vatex_test.yaml | 3 ++- lmms_eval/tasks/vatex/vatex_val_zh.yaml | 2 +- lmms_eval/tasks/youcook2/youcook2_val.yaml | 2 ++ 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lmms_eval/models/llava_vid.py b/lmms_eval/models/llava_vid.py index 90d90fa03..abd42c362 100755 --- a/lmms_eval/models/llava_vid.py +++ b/lmms_eval/models/llava_vid.py @@ -68,7 +68,7 @@ def __init__( mm_spatial_pool_out_channels: int = 1024, mm_spatial_pool_mode: str = "average", overwrite: bool = True, - video_decode_backend: str = "decord", + video_decode_backend: str = "pyav", **kwargs, ) -> None: super().__init__() diff --git a/lmms_eval/tasks/vatex/vatex_test.yaml b/lmms_eval/tasks/vatex/vatex_test.yaml index 989108b8c..0087e9771 100644 --- a/lmms_eval/tasks/vatex/vatex_test.yaml +++ b/lmms_eval/tasks/vatex/vatex_test.yaml @@ -28,12 +28,13 @@ metadata: dataset_kwargs: token: True video: True #skip download video from hf + # force_unzip: True cache_dir: vatex_test # From_YouTube: True model_specific_prompt_kwargs: default: - prompt: Provide a one-sentence caption for the provided video. + prompt: Provide a brief single-sentence caption for the last video below. Do not give any reasoning, just the caption. You must follow the captioning style of the preceding videos. Do not start your response with "Output:", just provide the caption. gemini_api: prompt: Provide a brief single-sentence caption for the last video below. Do not give any reasoning, just the caption. You must follow the captioning style of the preceding videos. Do not start your response with "Output:", just provide the caption. diff --git a/lmms_eval/tasks/vatex/vatex_val_zh.yaml b/lmms_eval/tasks/vatex/vatex_val_zh.yaml index 095d2c629..cc2a866b2 100755 --- a/lmms_eval/tasks/vatex/vatex_val_zh.yaml +++ b/lmms_eval/tasks/vatex/vatex_val_zh.yaml @@ -14,7 +14,7 @@ generation_kwargs: do_sample: false model_specific_prompt_kwargs: default: - prompt: 请为提供的视频提供一句话简短的字幕。 + prompt: 请为提供的视频提供简短的描述。不要给出任何理由,只提供描述。您必须沿用前面视频的描述样式。不需要以 "输出"开头,只需提供描述即可. gemini_api: prompt: 请为提供的视频提供简短的描述。不要给出任何理由,只提供描述。您必须沿用前面视频的描述样式。不需要以 "输出"开头,只需提供描述即可. diff --git a/lmms_eval/tasks/youcook2/youcook2_val.yaml b/lmms_eval/tasks/youcook2/youcook2_val.yaml index fbf717c6d..f574e6a39 100644 --- a/lmms_eval/tasks/youcook2/youcook2_val.yaml +++ b/lmms_eval/tasks/youcook2/youcook2_val.yaml @@ -34,3 +34,5 @@ include: _default_template_yaml model_specific_prompt_kwargs: default: prompt: Provide a one-sentence caption for the provided video. + gemini_api: + prompt: Provide a brief single-sentence caption for the last video below. Do not give any reasoning, just the caption. You must follow the captioning style of the preceding videos. Do not start your response with "Output:", just provide the caption. \ No newline at end of file From 1b0df89714bbf0762c74b7373a2b06432ce64179 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Wed, 12 Jun 2024 01:37:07 +0000 Subject: [PATCH 162/181] Add predict only args in main --- lmms_eval/__main__.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lmms_eval/__main__.py b/lmms_eval/__main__.py index 69f1cfd45..7863e8427 100755 --- a/lmms_eval/__main__.py +++ b/lmms_eval/__main__.py @@ -109,6 +109,13 @@ def parse_eval_args() -> argparse.Namespace: default="model_outputs", help="Specify a suffix for the log_samples file name.", ) + parser.add_argument( + "--predict_only", + "-x", + action="store_true", + default=False, + help="Use with --log_samples. Only model outputs will be saved and metrics will not be evaluated.", + ) parser.add_argument( "--show_config", action="store_true", @@ -228,6 +235,12 @@ def cli_evaluate_single(args: Union[argparse.Namespace, None] = None) -> None: initialize_tasks(args.verbosity) + if args.predict_only: + args.log_samples = True + if (args.log_samples or args.predict_only) and not args.output_path: + raise ValueError( + "Specify --output_path if providing --log_samples or --predict_only" + ) if args.limit: eval_logger.warning(" --limit SHOULD ONLY BE USED FOR TESTING." "REAL METRICS SHOULD NOT BE COMPUTED USING LIMIT.") if args.include_path is not None: @@ -300,6 +313,7 @@ def cli_evaluate_single(args: Union[argparse.Namespace, None] = None) -> None: log_samples=args.log_samples, gen_kwargs=args.gen_kwargs, cli_args=args, + predict_only=args.predict_only, ) if results is not None: From d3dd9e1c3f11bd4894fc3cf205a666a1b938330c Mon Sep 17 00:00:00 2001 From: kcz358 Date: Wed, 12 Jun 2024 01:37:20 +0000 Subject: [PATCH 163/181] Add bypass metric --- lmms_eval/api/metrics.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lmms_eval/api/metrics.py b/lmms_eval/api/metrics.py index 67958f518..5b200e116 100755 --- a/lmms_eval/api/metrics.py +++ b/lmms_eval/api/metrics.py @@ -16,6 +16,10 @@ # Register Aggregations First +@register_aggregation("bypass") +def bypass_agg(arr): + return 999 + @register_aggregation("mean") def mean(arr): return sum(arr) / len(arr) @@ -225,6 +229,14 @@ def sample_stddev(arr): def mean_stderr(arr): return sample_stddev(arr) / math.sqrt(len(arr)) +@register_metric( + metric="bypass", + higher_is_better=True, + output_type=["loglikelihood", "multiple_choice", "generate_until"], + aggregation="bypass", +) +def bypass(items): + return items @register_metric( metric="mcc", From 1d788afbdcdc16cdf0d8d8c81a28d00ce352e150 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Wed, 12 Jun 2024 01:37:42 +0000 Subject: [PATCH 164/181] Add override metric --- lmms_eval/api/registry.py | 19 +++++++++++++++++++ lmms_eval/api/task.py | 26 ++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/lmms_eval/api/registry.py b/lmms_eval/api/registry.py index 0728b86d2..7e2dc3ede 100755 --- a/lmms_eval/api/registry.py +++ b/lmms_eval/api/registry.py @@ -1,6 +1,8 @@ from lmms_eval.api.model import lmms +from typing import Callable, Dict import logging +import evaluate as hf_evaluate eval_logger = logging.getLogger("lmms-eval") @@ -104,6 +106,23 @@ def decorate(fn): return decorate +def get_metric(name: str, hf_evaluate_metric=False) -> Callable: + if not hf_evaluate_metric: + if name in METRIC_REGISTRY: + return METRIC_REGISTRY[name] + else: + eval_logger.warning( + f"Could not find registered metric '{name}' in lm-eval, searching in HF Evaluate library..." + ) + + try: + metric_object = hf_evaluate.load(name) + return metric_object.compute + except Exception: + eval_logger.error( + f"{name} not found in the evaluate library! Please check https://huggingface.co/evaluate-metric", + ) + def register_aggregation(name): def decorate(fn): assert name not in AGGREGATION_REGISTRY, f"aggregation named '{name}' conflicts with existing registered aggregation!" diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index 4deb27224..ee4442580 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -31,6 +31,7 @@ METRIC_REGISTRY, OUTPUT_TYPE_REGISTRY, get_aggregation, + get_metric, get_metric_aggregation, is_higher_better, ) @@ -508,6 +509,31 @@ def dump_config(self) -> dict: # TODO: this should only return the overrides applied to a non-YAML task's configuration. # (num_fewshot) return self.config.to_dict() + + def override_metric(self, metric_name: str) -> None: + """ + Override the default metrics used for evaluation with custom metrics. + + Parameters: + - metric_name (str): The name of the custom metric to override. Should be registered in api.metrics. + """ + ( + self._metric_fn_list, + self._aggregation_list, + self._metric_fn_kwargs, + self._higher_is_better, + ) = ({}, {}, {}, {}) + self._metric_fn_list[metric_name] = get_metric(metric_name) + self._aggregation_list[metric_name] = get_metric_aggregation(metric_name) + self._higher_is_better[metric_name] = is_higher_better(metric_name) + self._metric_fn_kwargs[metric_name] = {} + if not isinstance(self, ConfigurableTask): + self.process_results = lambda x, y: {metric_name: get_metric(metric_name)} + self.aggregation = lambda: { + metric_name: get_metric_aggregation(metric_name) + } + setattr(self._config, "metric_list", [{"metric": metric_name}]) + setattr(self._config, "process_results", None) class ConfigurableTask(Task): From 4a60f2aaf2781d1eaecd3e18e90c1ee5784cf5e1 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Wed, 12 Jun 2024 01:37:58 +0000 Subject: [PATCH 165/181] Add predict only for evaluation --- lmms_eval/evaluator.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lmms_eval/evaluator.py b/lmms_eval/evaluator.py index e6fbcd6cd..55e9d0615 100755 --- a/lmms_eval/evaluator.py +++ b/lmms_eval/evaluator.py @@ -46,6 +46,7 @@ def simple_evaluate( log_samples: bool = True, gen_kwargs: str = None, cli_args=None, # Bo: put args into more functions (cost 48 Bytes per call) + predict_only: bool = False, ): """Instantiate and evaluate a model on a list of tasks. @@ -112,6 +113,14 @@ def simple_evaluate( config = task_obj._config if config["output_type"] == "generate_until" and gen_kwargs: config["generation_kwargs"].update(gen_kwargs) + + if predict_only: + log_samples = True + eval_logger.info( + f"Processing {task_name} in output-only mode. Metrics will not be calculated!" + ) + # we have to change the class properties post-hoc. This is pretty hacky. + task_obj.override_metric(metric_name="bypass") if num_fewshot is not None: if config["num_fewshot"] == 0: From 12517e73f1d6b732a9b9025c6d6611cfe4fea8f9 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Wed, 12 Jun 2024 04:10:57 +0000 Subject: [PATCH 166/181] chore: Update gitignore and import error message in mplug_owl_video --- .gitignore | 1 + .../models/mplug_owl_video/modeling_mplug_owl.py | 2 +- .../vatex/__pycache__/utils.cpython-310.pyc | Bin 7171 -> 0 bytes 3 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 lmms_eval/tasks/vatex/__pycache__/utils.cpython-310.pyc diff --git a/.gitignore b/.gitignore index df2f23612..2557ab1bd 100755 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ data/ llava-video/ Video-MME/ VATEX/ +lmms_eval/tasks/vatex/__pycache__/utils.cpython-310.pyc diff --git a/lmms_eval/models/mplug_owl_video/modeling_mplug_owl.py b/lmms_eval/models/mplug_owl_video/modeling_mplug_owl.py index 38ef63435..6c5b75927 100644 --- a/lmms_eval/models/mplug_owl_video/modeling_mplug_owl.py +++ b/lmms_eval/models/mplug_owl_video/modeling_mplug_owl.py @@ -24,7 +24,7 @@ flash_attn_func = flash_attn_unpadded_func except: flash_attn_func = None - print("install flash-attn first.") + print("Error importing flash_attn in mplug_owl. Please install flash-attn first.") import math from dataclasses import dataclass from typing import Any, Optional, Tuple, Union diff --git a/lmms_eval/tasks/vatex/__pycache__/utils.cpython-310.pyc b/lmms_eval/tasks/vatex/__pycache__/utils.cpython-310.pyc deleted file mode 100644 index fa94c27e0c30996bc9660aaa5e3f7ba1b08f7e81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7171 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 Date: Wed, 12 Jun 2024 14:02:42 +0800 Subject: [PATCH 167/181] Update videomme.yaml --- lmms_eval/tasks/videomme/videomme.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/lmms_eval/tasks/videomme/videomme.yaml b/lmms_eval/tasks/videomme/videomme.yaml index 0f88f01ad..7689da737 100755 --- a/lmms_eval/tasks/videomme/videomme.yaml +++ b/lmms_eval/tasks/videomme/videomme.yaml @@ -2,6 +2,7 @@ dataset_path: lmms-lab/Video-MME dataset_kwargs: token: True cache_dir: videomme + video: True # From_YouTube: True task: videomme test_split: test From 07bfd4960a4f82442f55b0cbe7196dadb5e88311 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 6 May 2024 04:48:53 +0000 Subject: [PATCH 168/181] Add worldqa evaluator --- .../tasks/worldqa/worldqa_mc_evaluator.py | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 lmms_eval/tasks/worldqa/worldqa_mc_evaluator.py diff --git a/lmms_eval/tasks/worldqa/worldqa_mc_evaluator.py b/lmms_eval/tasks/worldqa/worldqa_mc_evaluator.py new file mode 100644 index 000000000..832684210 --- /dev/null +++ b/lmms_eval/tasks/worldqa/worldqa_mc_evaluator.py @@ -0,0 +1,118 @@ +import os.path as osp +import time +import random as rd +import string +from collections import defaultdict +import requests + +import math +import numpy as np +import pandas as pd +from tqdm import tqdm + +import logging + +eval_logger = logging.getLogger("lmms-eval") + +class WorldQA_MC_Evaluator: + def __init__(self, sys_prompt="There are several options:", API_KEY="", API_URL="", model_version="gpt-3.5-turbo-0613"): + self.sys_prompt = sys_prompt + self.model_version = model_version + self.API_KEY = API_KEY + self.API_URL = API_URL + + def build_prompt(self, question, options, prediction): + tmpl = ( + "You are an AI assistant who will help me to match an answer " + "with several options of a single-choice question. " + "You are provided with a question, several options, and an answer, " + "and you need to find which option is most similar to the answer. " + "If the meaning of all options are significantly different " + "from the answer, output E. " + "Your should output a single uppercase character in A, B, C, D " + "(if they are valid options), and E. \n" + "Example 1: \n" + "Question: What is the main object in image?\nOptions: A. teddy bear " + "B. rabbit C. cat D. dog\nAnswer: a cute teddy bear\nYour output: A\n" + "Example 2: \n" + "Question: What is the main object in image?\nOptions: A. teddy bear " + "B. rabbit C. cat D. dog\nAnswer: Spider\nYour output: E\n" + "Example 3: \n" + "Question: {}?\nOptions: {}\nAnswer: {}\nYour output: " + ) + return tmpl.format(question, options, prediction) + + # Prefetch Answers + def can_infer_option(self, answer, num_choice=5): + choices = string.ascii_uppercase[:num_choice] + if "Failed to obtain answer via API" in answer: + return False + + def count(splits, choices="ABCD", prefix="", suffix=""): + cnt = 0 + for c in choices: + if prefix + c + suffix in splits: + cnt += 1 + return cnt + + splits = [x.strip() for x in answer.split()] + if count(splits, choices) == 1: + for ch in choices: + if "A" in splits and len(splits) > 3: + eval_logger.info(f"A might be a quantifier in the string: {answer}.") + break + if ch in splits: + return ch + tups = [("", "."), ("", ","), ("", ":"), ("", ")"), ("", ")."), ("(", ")"), ("(", ")."), (":", ""), (":", ","), (":", "."), (":", ")"), (":", ").")] + for tup in tups: + if count(splits, choices, prefix=tup[0], suffix=tup[1]) == 1: + for ch in choices: + if tup[0] + ch + tup[1] in splits: + return ch + return False + + + def _post_request(self, payload): + headers = { + "Authorization": f"Bearer {self.API_KEY}", + "Content-Type": "application/json", + } + response = requests.post(self.API_URL, headers=headers, json=payload, timeout=30) + response.raise_for_status() + return response.json() + + def get_chat_response(self, prompt, temperature=0, max_tokens=256, n=1, patience=5, sleep_time=3): + messages = [ + {"role": "user", "content": prompt}, + ] + payload = {"model": self.model_version, "messages": messages, "temperature": temperature, "max_tokens": max_tokens, "n": n} + + while patience > 0: + patience -= 1 + try: + response = self._post_request(payload) + if n == 1: + prediction = response["choices"][0]["message"]["content"].strip() + if prediction and prediction != "": + return prediction + else: + prediction = [choice["message"]["content"].strip() for choice in response["choices"]] + if prediction and prediction[0] != "": + return prediction + + except Exception as e: + eval_logger.info(f"Attempt {patience + 1} failed with error: {e}") + if sleep_time > 0: + time.sleep(sleep_time) + + return "Failed to obtain answer via API" + + def evaluate(self, results): + answer = results["answer"].split(".")[0] + if self.can_infer_option(results["pred"], num_choice=4): + choice = self.can_infer_option(results["pred"], num_choice=4) + return int(choice.lower().strip() == answer.lower().strip()) + else: + prompt = self.build_prompt(question=results["question"], options="\n".join(results["option"]), prediction=results["pred"]) + prediction = self.get_chat_response(prompt) + return int(prediction.lower().strip() == answer.lower().strip()) \ No newline at end of file From efd80c2ec81bf500e6f99c84a6ce03ba2d92eec0 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 6 May 2024 04:49:20 +0000 Subject: [PATCH 169/181] Fix worldqa specific args default prompt --- lmms_eval/tasks/worldqa/_default_template_yaml | 4 ---- lmms_eval/tasks/worldqa/utils.py | 17 ++++++++++++++--- lmms_eval/tasks/worldqa/worldqa_generation.yaml | 6 +++++- lmms_eval/tasks/worldqa/worldqa_mc.yaml | 9 +++++++-- lmms_eval/tasks/worldqa/worldqa_mcppl.yaml | 4 ++++ 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/lmms_eval/tasks/worldqa/_default_template_yaml b/lmms_eval/tasks/worldqa/_default_template_yaml index 9ebb8a9e2..050f74618 100644 --- a/lmms_eval/tasks/worldqa/_default_template_yaml +++ b/lmms_eval/tasks/worldqa/_default_template_yaml @@ -3,10 +3,6 @@ dataset_kwargs: token: True video: True cache_dir: multi-hop-reasoning -model_specific_prompt_kwargs: - default: - pre_prompt: "" - post_prompt: "" metadata: version: 0.0 gpt_eval_model_name: "gpt-4-0613" \ No newline at end of file diff --git a/lmms_eval/tasks/worldqa/utils.py b/lmms_eval/tasks/worldqa/utils.py index b2585f05e..09b3174b3 100755 --- a/lmms_eval/tasks/worldqa/utils.py +++ b/lmms_eval/tasks/worldqa/utils.py @@ -4,6 +4,7 @@ import datetime import lmms_eval.tasks._task_utils.file_utils as file_utils from lmms_eval.filters.extraction import ExtendedRegexFilter +from lmms_eval.tasks.worldqa.worldqa_mc_evaluator import WorldQA_MC_Evaluator import json import logging import yaml @@ -175,6 +176,19 @@ def worldqa_process_results(doc, result): "gpt_eval": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "eval_answer": eval_answer, "gpt_prompt": content}, } +def worldqa_process_results_mc(doc, result): + pred = result[0] + data = { + "gpt_eval": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "option" : doc["option"] }, + } + return data + +def worldqa_aggregate_mc_eval(results): + score = 0 + evaluator = WorldQA_MC_Evaluator(API_KEY=API_KEY, API_URL=API_URL) + for result in results: + score += evaluator.evaluate(result) + return score / len(results) def worldqa_aggregate_submissions(results, args, task): now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") @@ -212,9 +226,6 @@ def worldqa_aggregate_mc_ppl(results, args): worldqa_aggregate_submissions(results, args, "MC_PPL") -def worldqa_aggregate_gen_eval(results, args): - return - def worldqa_doc_to_choice(doc): return [op.split(".")[1].strip() for op in doc["option"]] diff --git a/lmms_eval/tasks/worldqa/worldqa_generation.yaml b/lmms_eval/tasks/worldqa/worldqa_generation.yaml index 3367f72a8..f5ed41e9f 100755 --- a/lmms_eval/tasks/worldqa/worldqa_generation.yaml +++ b/lmms_eval/tasks/worldqa/worldqa_generation.yaml @@ -12,5 +12,9 @@ metric_list: higher_is_better: true - metric: gpt_eval aggregation: !function utils.worldq_gen_gpt_eval - higher_is_better: true + higher_is_better: true +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" include: _default_template_yaml diff --git a/lmms_eval/tasks/worldqa/worldqa_mc.yaml b/lmms_eval/tasks/worldqa/worldqa_mc.yaml index e0d121096..821db87f8 100755 --- a/lmms_eval/tasks/worldqa/worldqa_mc.yaml +++ b/lmms_eval/tasks/worldqa/worldqa_mc.yaml @@ -5,10 +5,15 @@ output_type: generate_until doc_to_visual: !function utils.worldqa_doc_to_visual doc_to_text: !function utils.worldqa_doc_to_text doc_to_target: !function utils.worldqa_doc_to_answer_mc +process_results: !function utils.worldqa_process_results_mc metric_list: - - metric: exact_match + - metric: gpt_eval + aggregation: !function utils.worldqa_aggregate_mc_eval higher_is_better: true - +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "\nAnswer with the option's letter from the given choices directly." filter_list: - name: "flexible-extract" filter: diff --git a/lmms_eval/tasks/worldqa/worldqa_mcppl.yaml b/lmms_eval/tasks/worldqa/worldqa_mcppl.yaml index bf0f31f2f..f954bf4cb 100755 --- a/lmms_eval/tasks/worldqa/worldqa_mcppl.yaml +++ b/lmms_eval/tasks/worldqa/worldqa_mcppl.yaml @@ -8,4 +8,8 @@ doc_to_target: !function utils.worldqa_doc_to_answer_mc_ppl doc_to_choice: !function utils.worldqa_doc_to_choice metric_list: - metric: acc +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" include: _default_template_yaml From 37f39b5ed5156ebfbd766f53c65c1b9be6f13737 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 6 May 2024 05:53:25 +0000 Subject: [PATCH 170/181] Add question in results for mc --- lmms_eval/tasks/worldqa/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lmms_eval/tasks/worldqa/utils.py b/lmms_eval/tasks/worldqa/utils.py index 09b3174b3..8f587b74a 100755 --- a/lmms_eval/tasks/worldqa/utils.py +++ b/lmms_eval/tasks/worldqa/utils.py @@ -179,7 +179,7 @@ def worldqa_process_results(doc, result): def worldqa_process_results_mc(doc, result): pred = result[0] data = { - "gpt_eval": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "option" : doc["option"] }, + "gpt_eval": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "option" : doc["option"], "question" : doc["question"] }, } return data From 6cf1ded5cb6a7fd779d9fd45a6a1d65c0fff7b38 Mon Sep 17 00:00:00 2001 From: Hukairui <71913595+KairuiHu@users.noreply.github.com> Date: Wed, 12 Jun 2024 17:15:06 +0800 Subject: [PATCH 171/181] Delete redundant print, and lint again to reformat (#126) * Resolve conflict when merge the kr_ego with internal_main_dev * fix the bug of file overwrite * Optimize the inference of videochatgpt dataset * Resolve conflict * delete repeated line * reformat the code * rename the file name for inference results * group the same task together for cvrr and videochatgpt * group the same task together for videochatgpt and cvrr * reformat the code * fix the bug of videochatgpt_consistency multiocessing * Rename the metric from submission to subtask * fix the bug of consistency where different answers agre generated in pred2 * add accuracy into the evaluation of cvrr * add accuracy metric to cvrr dataset * remove duplicate rows when merging from main branch * Refactor videochatgpt_gen and videochatgpt_temporal for correct score parsing * enable the webm video loader for llavavid as required in cvrr dataset * Refactor process_results function to handle full_docs in videochatgpt task * add tqdm to consistency gpt_eval * Refactor the cvrr for correct aggregate logic * change backend to decord for videochatgpt eval * Fix for mkv video path * add perceptiontest dataset test split * doublecheck and optimize the code in egoschema * rename metric name of perceptiontest * add perceptiontest_validation dataset * remove egoschema aggregate function name * add temcompass mc dataset * remove redundant files * add tempcompass yes_no, captioning, caption_matching subsets * add all the 5 aspects as metrics * reformat the output dict for successful match * remove redundant aggregation function in videochatgpt and rename some function names * remove redundant aggregation function in activitynetqa and video_detail_description * remove redundant aggregate functions in cvrr * remove redundant rows in perception test * use black ./ to reformat code * debug: load webm file is now successful * Remove perceptiontest and perceptiontest_val default template YAML files * put post prompt in yaml for empcompass dataset * align gpt eval model name for cvrr and debug the tempcompass in case match is unsuccessful * "debug tempcompass captioning for multi-choice, and optimze matching rule in egoschema" * "add a period to each option in egoschema becuase mplugowl always end with period" * "add readme for egoschema" * "change readme citation for egoschema" * "delete redundant print, lint the repo" --------- Co-authored-by: Bo Li Co-authored-by: kcz358 --- lmms_eval/__main__.py | 4 +--- lmms_eval/api/metrics.py | 3 +++ lmms_eval/api/registry.py | 5 ++--- lmms_eval/api/task.py | 6 ++---- lmms_eval/evaluator.py | 6 ++---- lmms_eval/tasks/perceptiontest/test/utils.py | 2 -- lmms_eval/tasks/worldqa/utils.py | 10 ++++++---- lmms_eval/tasks/worldqa/worldqa_mc_evaluator.py | 10 +++++----- 8 files changed, 21 insertions(+), 25 deletions(-) diff --git a/lmms_eval/__main__.py b/lmms_eval/__main__.py index 7863e8427..2949705f9 100755 --- a/lmms_eval/__main__.py +++ b/lmms_eval/__main__.py @@ -238,9 +238,7 @@ def cli_evaluate_single(args: Union[argparse.Namespace, None] = None) -> None: if args.predict_only: args.log_samples = True if (args.log_samples or args.predict_only) and not args.output_path: - raise ValueError( - "Specify --output_path if providing --log_samples or --predict_only" - ) + raise ValueError("Specify --output_path if providing --log_samples or --predict_only") if args.limit: eval_logger.warning(" --limit SHOULD ONLY BE USED FOR TESTING." "REAL METRICS SHOULD NOT BE COMPUTED USING LIMIT.") if args.include_path is not None: diff --git a/lmms_eval/api/metrics.py b/lmms_eval/api/metrics.py index 5b200e116..c0e5c505d 100755 --- a/lmms_eval/api/metrics.py +++ b/lmms_eval/api/metrics.py @@ -20,6 +20,7 @@ def bypass_agg(arr): return 999 + @register_aggregation("mean") def mean(arr): return sum(arr) / len(arr) @@ -229,6 +230,7 @@ def sample_stddev(arr): def mean_stderr(arr): return sample_stddev(arr) / math.sqrt(len(arr)) + @register_metric( metric="bypass", higher_is_better=True, @@ -238,6 +240,7 @@ def mean_stderr(arr): def bypass(items): return items + @register_metric( metric="mcc", higher_is_better=True, diff --git a/lmms_eval/api/registry.py b/lmms_eval/api/registry.py index 7e2dc3ede..253341db0 100755 --- a/lmms_eval/api/registry.py +++ b/lmms_eval/api/registry.py @@ -111,9 +111,7 @@ def get_metric(name: str, hf_evaluate_metric=False) -> Callable: if name in METRIC_REGISTRY: return METRIC_REGISTRY[name] else: - eval_logger.warning( - f"Could not find registered metric '{name}' in lm-eval, searching in HF Evaluate library..." - ) + eval_logger.warning(f"Could not find registered metric '{name}' in lm-eval, searching in HF Evaluate library...") try: metric_object = hf_evaluate.load(name) @@ -123,6 +121,7 @@ def get_metric(name: str, hf_evaluate_metric=False) -> Callable: f"{name} not found in the evaluate library! Please check https://huggingface.co/evaluate-metric", ) + def register_aggregation(name): def decorate(fn): assert name not in AGGREGATION_REGISTRY, f"aggregation named '{name}' conflicts with existing registered aggregation!" diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index 8cd2300a5..00e44033c 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -509,7 +509,7 @@ def dump_config(self) -> dict: # TODO: this should only return the overrides applied to a non-YAML task's configuration. # (num_fewshot) return self.config.to_dict() - + def override_metric(self, metric_name: str) -> None: """ Override the default metrics used for evaluation with custom metrics. @@ -529,9 +529,7 @@ def override_metric(self, metric_name: str) -> None: self._metric_fn_kwargs[metric_name] = {} if not isinstance(self, ConfigurableTask): self.process_results = lambda x, y: {metric_name: get_metric(metric_name)} - self.aggregation = lambda: { - metric_name: get_metric_aggregation(metric_name) - } + self.aggregation = lambda: {metric_name: get_metric_aggregation(metric_name)} setattr(self._config, "metric_list", [{"metric": metric_name}]) setattr(self._config, "process_results", None) diff --git a/lmms_eval/evaluator.py b/lmms_eval/evaluator.py index 2d5c6f8ba..8a4c49d86 100755 --- a/lmms_eval/evaluator.py +++ b/lmms_eval/evaluator.py @@ -113,12 +113,10 @@ def simple_evaluate( config = task_obj._config if config["output_type"] == "generate_until" and gen_kwargs: config["generation_kwargs"].update(gen_kwargs) - + if predict_only: log_samples = True - eval_logger.info( - f"Processing {task_name} in output-only mode. Metrics will not be calculated!" - ) + eval_logger.info(f"Processing {task_name} in output-only mode. Metrics will not be calculated!") # we have to change the class properties post-hoc. This is pretty hacky. task_obj.override_metric(metric_name="bypass") diff --git a/lmms_eval/tasks/perceptiontest/test/utils.py b/lmms_eval/tasks/perceptiontest/test/utils.py index 951a1abac..353071796 100755 --- a/lmms_eval/tasks/perceptiontest/test/utils.py +++ b/lmms_eval/tasks/perceptiontest/test/utils.py @@ -67,8 +67,6 @@ def perceptiontest_doc_to_text(doc, model_specific_prompt_kwargs=None): question += "\n" + "C. " + op index += 1 post_prompt = "\nAnswer with the option's letter from the given choices directly." - print("question\n") - print(question) return f"{pre_prompt}{question}{post_prompt}" diff --git a/lmms_eval/tasks/worldqa/utils.py b/lmms_eval/tasks/worldqa/utils.py index 8f587b74a..aa5284327 100755 --- a/lmms_eval/tasks/worldqa/utils.py +++ b/lmms_eval/tasks/worldqa/utils.py @@ -176,13 +176,15 @@ def worldqa_process_results(doc, result): "gpt_eval": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "eval_answer": eval_answer, "gpt_prompt": content}, } + def worldqa_process_results_mc(doc, result): - pred = result[0] + pred = result[0] data = { - "gpt_eval": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "option" : doc["option"], "question" : doc["question"] }, - } + "gpt_eval": {"pred": pred, "question_idx": doc["question_idx"], "object_description": doc["object_description"], "answer": doc["answer"], "option": doc["option"], "question": doc["question"]}, + } return data + def worldqa_aggregate_mc_eval(results): score = 0 evaluator = WorldQA_MC_Evaluator(API_KEY=API_KEY, API_URL=API_URL) @@ -190,6 +192,7 @@ def worldqa_aggregate_mc_eval(results): score += evaluator.evaluate(result) return score / len(results) + def worldqa_aggregate_submissions(results, args, task): now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") submission_file_name = f"worldqa-{task}-{now_date_time}.json" @@ -226,7 +229,6 @@ def worldqa_aggregate_mc_ppl(results, args): worldqa_aggregate_submissions(results, args, "MC_PPL") - def worldqa_doc_to_choice(doc): return [op.split(".")[1].strip() for op in doc["option"]] diff --git a/lmms_eval/tasks/worldqa/worldqa_mc_evaluator.py b/lmms_eval/tasks/worldqa/worldqa_mc_evaluator.py index 832684210..e1e2ae769 100644 --- a/lmms_eval/tasks/worldqa/worldqa_mc_evaluator.py +++ b/lmms_eval/tasks/worldqa/worldqa_mc_evaluator.py @@ -14,13 +14,14 @@ eval_logger = logging.getLogger("lmms-eval") + class WorldQA_MC_Evaluator: def __init__(self, sys_prompt="There are several options:", API_KEY="", API_URL="", model_version="gpt-3.5-turbo-0613"): self.sys_prompt = sys_prompt self.model_version = model_version self.API_KEY = API_KEY self.API_URL = API_URL - + def build_prompt(self, question, options, prediction): tmpl = ( "You are an AI assistant who will help me to match an answer " @@ -41,7 +42,7 @@ def build_prompt(self, question, options, prediction): "Question: {}?\nOptions: {}\nAnswer: {}\nYour output: " ) return tmpl.format(question, options, prediction) - + # Prefetch Answers def can_infer_option(self, answer, num_choice=5): choices = string.ascii_uppercase[:num_choice] @@ -70,7 +71,6 @@ def count(splits, choices="ABCD", prefix="", suffix=""): if tup[0] + ch + tup[1] in splits: return ch return False - def _post_request(self, payload): headers = { @@ -108,11 +108,11 @@ def get_chat_response(self, prompt, temperature=0, max_tokens=256, n=1, patience return "Failed to obtain answer via API" def evaluate(self, results): - answer = results["answer"].split(".")[0] + answer = results["answer"].split(".")[0] if self.can_infer_option(results["pred"], num_choice=4): choice = self.can_infer_option(results["pred"], num_choice=4) return int(choice.lower().strip() == answer.lower().strip()) else: prompt = self.build_prompt(question=results["question"], options="\n".join(results["option"]), prediction=results["pred"]) prediction = self.get_chat_response(prompt) - return int(prediction.lower().strip() == answer.lower().strip()) \ No newline at end of file + return int(prediction.lower().strip() == answer.lower().strip()) From 12f6de23a39db28f6744129eb5be238fd480e41a Mon Sep 17 00:00:00 2001 From: Bo Li Date: Wed, 12 Jun 2024 10:52:22 +0000 Subject: [PATCH 172/181] chore: Remove unnecessary dataset kwargs in ConfigurableTask --- lmms_eval/api/task.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index 00e44033c..c035a0a2e 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -802,6 +802,9 @@ def unzip_video_data(zip_file): if "force_download" in dataset_kwargs: dataset_kwargs.pop("force_download") + if "force_unzip" in dataset_kwargs: + dataset_kwargs.pop("force_unzip") + if "local_files_only" in dataset_kwargs: dataset_kwargs.pop("local_files_only") From 4a5990ec1e98e5d5a97ba18f043d803a9dd6cb04 Mon Sep 17 00:00:00 2001 From: Hukairui <71913595+KairuiHu@users.noreply.github.com> Date: Wed, 12 Jun 2024 19:31:32 +0800 Subject: [PATCH 173/181] Add higher is better to Submission metric to avoid warning (#127) * Resolve conflict when merge the kr_ego with internal_main_dev * fix the bug of file overwrite * Optimize the inference of videochatgpt dataset * Resolve conflict * delete repeated line * reformat the code * rename the file name for inference results * group the same task together for cvrr and videochatgpt * group the same task together for videochatgpt and cvrr * reformat the code * fix the bug of videochatgpt_consistency multiocessing * Rename the metric from submission to subtask * fix the bug of consistency where different answers agre generated in pred2 * add accuracy into the evaluation of cvrr * add accuracy metric to cvrr dataset * remove duplicate rows when merging from main branch * Refactor videochatgpt_gen and videochatgpt_temporal for correct score parsing * enable the webm video loader for llavavid as required in cvrr dataset * Refactor process_results function to handle full_docs in videochatgpt task * add tqdm to consistency gpt_eval * Refactor the cvrr for correct aggregate logic * change backend to decord for videochatgpt eval * Fix for mkv video path * add perceptiontest dataset test split * doublecheck and optimize the code in egoschema * rename metric name of perceptiontest * add perceptiontest_validation dataset * remove egoschema aggregate function name * add temcompass mc dataset * remove redundant files * add tempcompass yes_no, captioning, caption_matching subsets * add all the 5 aspects as metrics * reformat the output dict for successful match * remove redundant aggregation function in videochatgpt and rename some function names * remove redundant aggregation function in activitynetqa and video_detail_description * remove redundant aggregate functions in cvrr * remove redundant rows in perception test * use black ./ to reformat code * debug: load webm file is now successful * Remove perceptiontest and perceptiontest_val default template YAML files * put post prompt in yaml for empcompass dataset * align gpt eval model name for cvrr and debug the tempcompass in case match is unsuccessful * "debug tempcompass captioning for multi-choice, and optimze matching rule in egoschema" * "add a period to each option in egoschema becuase mplugowl always end with period" * "add readme for egoschema" * "change readme citation for egoschema" * "delete redundant print, lint the repo" * "add higher_is_better for submission metric to avoid warning" --------- Co-authored-by: Bo Li Co-authored-by: kcz358 --- lmms_eval/tasks/egoschema/egoschema.yaml | 1 + lmms_eval/tasks/egoschema/egoschema_mcppl.yaml | 1 + lmms_eval/tasks/egoschema/egoschema_subset.yaml | 1 + lmms_eval/tasks/egoschema/egoschema_subset_mcppl.yaml | 1 + lmms_eval/tasks/perceptiontest/test/perceptiontest_mc.yaml | 1 + lmms_eval/tasks/perceptiontest/test/perceptiontest_mcppl.yaml | 1 + 6 files changed, 6 insertions(+) diff --git a/lmms_eval/tasks/egoschema/egoschema.yaml b/lmms_eval/tasks/egoschema/egoschema.yaml index 3fb0e78e5..a094ffa1c 100755 --- a/lmms_eval/tasks/egoschema/egoschema.yaml +++ b/lmms_eval/tasks/egoschema/egoschema.yaml @@ -9,4 +9,5 @@ process_results: !function utils.egoschema_process_results_generation metric_list: - metric: submission aggregation: !function utils.egoschema_aggregate_mc + higher_is_better: true include: _default_template_yaml diff --git a/lmms_eval/tasks/egoschema/egoschema_mcppl.yaml b/lmms_eval/tasks/egoschema/egoschema_mcppl.yaml index 7070fb883..b3a380b01 100755 --- a/lmms_eval/tasks/egoschema/egoschema_mcppl.yaml +++ b/lmms_eval/tasks/egoschema/egoschema_mcppl.yaml @@ -10,4 +10,5 @@ process_results: !function utils.egoschema_process_results metric_list: - metric: submission aggregation: !function utils.egoschema_aggregate_mc_ppl + higher_is_better: true include: _default_template_yaml diff --git a/lmms_eval/tasks/egoschema/egoschema_subset.yaml b/lmms_eval/tasks/egoschema/egoschema_subset.yaml index 54d6d3aec..a1d6dd85b 100755 --- a/lmms_eval/tasks/egoschema/egoschema_subset.yaml +++ b/lmms_eval/tasks/egoschema/egoschema_subset.yaml @@ -9,6 +9,7 @@ process_results: !function utils.egoschema_process_results_generation metric_list: - metric: submission aggregation: !function utils.egoschema_aggregate_mc + higher_is_better: true - metric: score aggregation: !function utils.egoschema_aggregate_score higher_is_better: true diff --git a/lmms_eval/tasks/egoschema/egoschema_subset_mcppl.yaml b/lmms_eval/tasks/egoschema/egoschema_subset_mcppl.yaml index 064b1d86a..ebe868649 100755 --- a/lmms_eval/tasks/egoschema/egoschema_subset_mcppl.yaml +++ b/lmms_eval/tasks/egoschema/egoschema_subset_mcppl.yaml @@ -10,6 +10,7 @@ process_results: !function utils.egoschema_process_results metric_list: - metric: submission aggregation: !function utils.egoschema_aggregate_mc_ppl + higher_is_better: true - metric: score aggregation: !function utils.egoschema_aggregate_score higher_is_better: true diff --git a/lmms_eval/tasks/perceptiontest/test/perceptiontest_mc.yaml b/lmms_eval/tasks/perceptiontest/test/perceptiontest_mc.yaml index 09f2dec81..d406fb85c 100755 --- a/lmms_eval/tasks/perceptiontest/test/perceptiontest_mc.yaml +++ b/lmms_eval/tasks/perceptiontest/test/perceptiontest_mc.yaml @@ -9,4 +9,5 @@ process_results: !function utils.perceptiontest_process_results_mc metric_list: - metric: submission aggregation: !function utils.perceptiontest_aggregate_mc + higher_is_better: true include: _default_template_yaml diff --git a/lmms_eval/tasks/perceptiontest/test/perceptiontest_mcppl.yaml b/lmms_eval/tasks/perceptiontest/test/perceptiontest_mcppl.yaml index 1fe7f1b60..ec7ac4f10 100755 --- a/lmms_eval/tasks/perceptiontest/test/perceptiontest_mcppl.yaml +++ b/lmms_eval/tasks/perceptiontest/test/perceptiontest_mcppl.yaml @@ -10,4 +10,5 @@ process_results: !function utils.perceptiontest_process_results_mc_ppl metric_list: - metric: submission aggregation: !function utils.perceptiontest_aggregate_mc_ppl + higher_is_better: true include: _default_template_yaml From b851ab92157e65cf4114f2efa3f86d097303285b Mon Sep 17 00:00:00 2001 From: kcz358 Date: Wed, 12 Jun 2024 11:44:56 +0000 Subject: [PATCH 174/181] Fix load video error for mp4 with packet --- lmms_eval/models/model_utils/load_video.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lmms_eval/models/model_utils/load_video.py b/lmms_eval/models/model_utils/load_video.py index 1dddd358c..789039e7a 100644 --- a/lmms_eval/models/model_utils/load_video.py +++ b/lmms_eval/models/model_utils/load_video.py @@ -29,25 +29,27 @@ def record_video_length_packet(container): def read_video_pyav(video_path, num_frm=8): - container = av.open(video_path) - + if "webm" not in video_path and "mkv" not in video_path: # For mp4, we try loading with stream first try: + container = av.open(video_path) total_frames = container.streams.video[0].frames - num_frm = min(total_frames, num_frm) - indices = np.linspace(0, total_frames - 1, num_frm, dtype=int) + sampled_frm = min(total_frames, num_frm) + indices = np.linspace(0, total_frames - 1, sampled_frm, dtype=int) frames = record_video_length_stream(container, indices) except: + container = av.open(video_path) frames = record_video_length_packet(container) total_frames = len(frames) - num_frm = min(total_frames, num_frm) - indices = np.linspace(0, total_frames - 1, num_frm, dtype=int) + sampled_frm = min(total_frames, num_frm) + indices = np.linspace(0, total_frames - 1, sampled_frm, dtype=int) frames = [frames[i] for i in indices] else: + container = av.open(video_path) frames = record_video_length_packet(container) total_frames = len(frames) - num_frm = min(total_frames, num_frm) - indices = np.linspace(0, total_frames - 1, num_frm, dtype=int) + sampled_frm = min(total_frames, num_frm) + indices = np.linspace(0, total_frames - 1, sampled_frm, dtype=int) frames = [frames[i] for i in indices] return np.stack([x.to_ndarray(format="rgb24") for x in frames]) From e43bd840b63eb499856e36d9d2ba45c924abcead Mon Sep 17 00:00:00 2001 From: Bo Li Date: Wed, 12 Jun 2024 14:54:06 +0000 Subject: [PATCH 175/181] chore: Remove unnecessary files and code related to live_bench and sft_eval tasks --- README.md | 2 +- lmms_eval/models/__init__.py | 2 +- lmms_eval/models/gemini_model.py | 163 ------ lmms_eval/models/llava_onevision.py | 474 ------------------ .../{mplugOwlVideo.py => mplug_owl_video.py} | 0 .../{videoChatGPT.py => video_chatgpt.py} | 0 ...{xcomposer2_4KHD.py => xcomposer2_4khd.py} | 0 lmms_eval/tasks/livebench/livebench.yaml | 29 -- lmms_eval/tasks/livebench/utils.py | 185 ------- .../tasks/mix_evals/_default_template_yaml | 16 - .../tasks/mix_evals/mix_evals_video2text.yaml | 5 - .../mix_evals_video2text_freeform.yaml | 22 - .../mix_evals/mix_evals_video2text_mc.yaml | 31 -- .../mix_evals_video2text_openended.yaml | 21 - lmms_eval/tasks/mix_evals/utils.py | 266 ---------- .../_default_sft_eval_ocr_rec_template_yaml | 23 - .../_default_sft_eval_rest_template_yaml | 20 - lmms_eval/tasks/sft_eval/_generate_config.py | 94 ---- lmms_eval/tasks/sft_eval/_sft_eval.yaml | 34 -- lmms_eval/tasks/sft_eval/sft_activity.yaml | 5 - lmms_eval/tasks/sft_eval/sft_arts.yaml | 5 - lmms_eval/tasks/sft_eval/sft_body.yaml | 5 - lmms_eval/tasks/sft_eval/sft_car.yaml | 5 - lmms_eval/tasks/sft_eval/sft_color.yaml | 5 - lmms_eval/tasks/sft_eval/sft_commodity.yaml | 5 - lmms_eval/tasks/sft_eval/sft_count.yaml | 5 - lmms_eval/tasks/sft_eval/sft_daily.yaml | 5 - lmms_eval/tasks/sft_eval/sft_engineer.yaml | 5 - .../tasks/sft_eval/sft_entertainment.yaml | 5 - lmms_eval/tasks/sft_eval/sft_exist.yaml | 5 - lmms_eval/tasks/sft_eval/sft_face.yaml | 5 - lmms_eval/tasks/sft_eval/sft_food.yaml | 5 - lmms_eval/tasks/sft_eval/sft_healthcare.yaml | 5 - lmms_eval/tasks/sft_eval/sft_landmark.yaml | 5 - lmms_eval/tasks/sft_eval/sft_logo.yaml | 5 - lmms_eval/tasks/sft_eval/sft_natural.yaml | 5 - lmms_eval/tasks/sft_eval/sft_ocr_qa_adv.yaml | 5 - .../tasks/sft_eval/sft_ocr_qa_chart.yaml | 5 - lmms_eval/tasks/sft_eval/sft_ocr_qa_form.yaml | 5 - .../tasks/sft_eval/sft_ocr_qa_scene.yaml | 5 - .../tasks/sft_eval/sft_ocr_qa_screen.yaml | 5 - lmms_eval/tasks/sft_eval/sft_ocr_rec_adv.yaml | 5 - lmms_eval/tasks/sft_eval/sft_ocr_rec_doc.yaml | 5 - .../tasks/sft_eval/sft_ocr_rec_handwrite.yaml | 5 - .../tasks/sft_eval/sft_ocr_rec_markdown.yaml | 5 - .../tasks/sft_eval/sft_ocr_rec_scene.yaml | 5 - .../tasks/sft_eval/sft_ocr_rec_screen.yaml | 5 - lmms_eval/tasks/sft_eval/sft_place.yaml | 5 - lmms_eval/tasks/sft_eval/sft_position.yaml | 5 - lmms_eval/tasks/sft_eval/sft_sport.yaml | 5 - lmms_eval/tasks/sft_eval/sft_status.yaml | 5 - lmms_eval/tasks/sft_eval/utils.py | 109 ---- example_eval.yaml => miscs/example_eval.yaml | 0 .../llava_repr_requirements.txt | 0 tools/live_bench/__init__.py | 1 - tools/live_bench/api/live_bench.py | 20 - tools/live_bench/data_generator/__init__.py | 4 - .../live_bench/data_generator/check_prompt.md | 11 - .../example/example_output.json | 18 - .../example/example_website.png | Bin 2228301 -> 0 bytes tools/live_bench/data_generator/live_bench.py | 102 ---- .../data_generator/live_bench_data.py | 94 ---- tools/live_bench/data_generator/prompt.md | 13 - .../live_bench/data_generator/qa_generator.py | 337 ------------- tools/live_bench/data_generator/response.py | 5 - .../live_bench/data_generator/score_getter.py | 157 ------ .../live_bench/data_generator/score_prompt.md | 1 - .../data_generator/utils/__init__.py | 0 .../live_bench/data_generator/utils/claude.py | 42 -- .../live_bench/data_generator/utils/gemini.py | 26 - .../live_bench/data_generator/utils/gpt4v.py | 38 -- tools/live_bench/driver/.gitignore | 1 - tools/live_bench/driver/__init__.py | 1 - tools/live_bench/driver/load_driver.py | 51 -- tools/live_bench/example.ipynb | 103 ---- tools/live_bench/screen_shoter/__init__.py | 2 - tools/live_bench/screen_shoter/screen.py | 30 -- .../live_bench/screen_shoter/screen_shoter.py | 141 ------ tools/live_bench/websites/__init__.py | 2 - tools/live_bench/websites/load_website.py | 34 -- tools/live_bench/websites/website.py | 62 --- tools/live_bench/websites/website_list.yaml | 77 --- 82 files changed, 2 insertions(+), 3027 deletions(-) delete mode 100644 lmms_eval/models/gemini_model.py delete mode 100755 lmms_eval/models/llava_onevision.py rename lmms_eval/models/{mplugOwlVideo.py => mplug_owl_video.py} (100%) rename lmms_eval/models/{videoChatGPT.py => video_chatgpt.py} (100%) rename lmms_eval/models/{xcomposer2_4KHD.py => xcomposer2_4khd.py} (100%) delete mode 100644 lmms_eval/tasks/livebench/livebench.yaml delete mode 100644 lmms_eval/tasks/livebench/utils.py delete mode 100644 lmms_eval/tasks/mix_evals/_default_template_yaml delete mode 100755 lmms_eval/tasks/mix_evals/mix_evals_video2text.yaml delete mode 100755 lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml delete mode 100755 lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml delete mode 100755 lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml delete mode 100755 lmms_eval/tasks/mix_evals/utils.py delete mode 100644 lmms_eval/tasks/sft_eval/_default_sft_eval_ocr_rec_template_yaml delete mode 100644 lmms_eval/tasks/sft_eval/_default_sft_eval_rest_template_yaml delete mode 100644 lmms_eval/tasks/sft_eval/_generate_config.py delete mode 100644 lmms_eval/tasks/sft_eval/_sft_eval.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_activity.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_arts.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_body.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_car.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_color.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_commodity.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_count.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_daily.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_engineer.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_entertainment.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_exist.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_face.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_food.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_healthcare.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_landmark.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_logo.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_natural.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_qa_adv.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_qa_chart.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_qa_form.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_qa_scene.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_qa_screen.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_rec_adv.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_rec_doc.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_rec_handwrite.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_rec_markdown.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_rec_scene.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_ocr_rec_screen.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_place.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_position.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_sport.yaml delete mode 100644 lmms_eval/tasks/sft_eval/sft_status.yaml delete mode 100644 lmms_eval/tasks/sft_eval/utils.py rename example_eval.yaml => miscs/example_eval.yaml (100%) rename llava_repr_requirements.txt => miscs/llava_repr_requirements.txt (100%) delete mode 100644 tools/live_bench/__init__.py delete mode 100644 tools/live_bench/api/live_bench.py delete mode 100644 tools/live_bench/data_generator/__init__.py delete mode 100644 tools/live_bench/data_generator/check_prompt.md delete mode 100644 tools/live_bench/data_generator/example/example_output.json delete mode 100644 tools/live_bench/data_generator/example/example_website.png delete mode 100644 tools/live_bench/data_generator/live_bench.py delete mode 100644 tools/live_bench/data_generator/live_bench_data.py delete mode 100644 tools/live_bench/data_generator/prompt.md delete mode 100644 tools/live_bench/data_generator/qa_generator.py delete mode 100644 tools/live_bench/data_generator/response.py delete mode 100644 tools/live_bench/data_generator/score_getter.py delete mode 100644 tools/live_bench/data_generator/score_prompt.md delete mode 100644 tools/live_bench/data_generator/utils/__init__.py delete mode 100644 tools/live_bench/data_generator/utils/claude.py delete mode 100644 tools/live_bench/data_generator/utils/gemini.py delete mode 100644 tools/live_bench/data_generator/utils/gpt4v.py delete mode 100644 tools/live_bench/driver/.gitignore delete mode 100644 tools/live_bench/driver/__init__.py delete mode 100644 tools/live_bench/driver/load_driver.py delete mode 100644 tools/live_bench/example.ipynb delete mode 100644 tools/live_bench/screen_shoter/__init__.py delete mode 100644 tools/live_bench/screen_shoter/screen.py delete mode 100644 tools/live_bench/screen_shoter/screen_shoter.py delete mode 100644 tools/live_bench/websites/__init__.py delete mode 100644 tools/live_bench/websites/load_website.py delete mode 100644 tools/live_bench/websites/website.py delete mode 100644 tools/live_bench/websites/website_list.yaml diff --git a/README.md b/README.md index 73bd545ea..1778b7a23 100755 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ accelerate launch --num_processes=8 -m lmms_eval --model llava --model_args pr accelerate launch --num_processes=8 -m lmms_eval --model llava --model_args pretrained="liuhaotian/llava-v1.6-34b,conv_template=mistral_direct" --tasks mme,mmbench_en --batch_size 1 --log_samples --log_samples_suffix llava_v1.5_mme_mmbenchen --output_path ./logs/ # # From a predefined configuration, supporting evaluation of multiple models and datasets -accelerate launch --num_processes=8 -m lmms_eval --config example_eval.yaml +accelerate launch --num_processes=8 -m lmms_eval --config ./miscs/example_eval.yaml ``` # Model Results diff --git a/lmms_eval/models/__init__.py b/lmms_eval/models/__init__.py index 4a78c742a..e016a1ec4 100755 --- a/lmms_eval/models/__init__.py +++ b/lmms_eval/models/__init__.py @@ -26,7 +26,7 @@ "reka": "Reka", "llava_onevision": "Llava_OneVision", "from_log": "FromLog", - "mplugOwlVideo": "mplug_Owl", + "mplug_owl_video": "mplug_Owl", } for model_name, model_class in AVAILABLE_MODELS.items(): diff --git a/lmms_eval/models/gemini_model.py b/lmms_eval/models/gemini_model.py deleted file mode 100644 index dfc7d8186..000000000 --- a/lmms_eval/models/gemini_model.py +++ /dev/null @@ -1,163 +0,0 @@ -from io import BytesIO -from copy import deepcopy -import numpy as np -import os -import base64 -from typing import List, Tuple -from tqdm import tqdm -import requests as url_requests -import time -import logging - -from lmms_eval.api.instance import Instance -from lmms_eval.api.model import lmms -from lmms_eval.api.registry import register_model -from lmms_eval import utils - -from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs -from accelerate.state import AcceleratorState - -try: - from decord import VideoReader, AudioReader, cpu -except ImportError: - pass - -from PIL import Image - -eval_logger = logging.getLogger("lmms-eval") - -NUM_SECONDS_TO_SLEEP = 5 -API_TYPE = os.getenv("API_TYPE", "openai") -if API_TYPE == "openai": # FIXME: Please modify this to support other type of API - API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") - API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") - headers = { - "Authorization": f"Bearer {API_KEY}", - "Content-Type": "application/json", - } -else: - eval_logger.error("API_TYPE not supported") - - -@register_model("gemini_model") -class GeminiModel(lmms): - def __init__( - self, - model_version: str = "gemini-pro", # FIXME: Please modify this to support real gemini model version - modality: str = "video", - max_frames_for_video: int = -1, - frame_rate: int = -1, - timeout: int = 120, - **kwargs, - ) -> None: - super().__init__() - self.model_version = model_version - self.modality = modality - self.max_frames_for_video = max_frames_for_video - self.frame_rate = frame_rate - assert self.modality in ["image", "video"], "Modality must be either image or video" - assert self.max_frames_for_video == -1 or self.frame_rate == -1, "max_frames_for_video and frame_rate cannot be provided at the same time" - assert self.max_frames_for_video == -1 if self.frame_rate != -1 else True, "max_frames_for_video must be -1 if frame_rate > 0" - self.image_token = "" # In case the question contains token for placeholder - self.timeout = timeout - - accelerator = Accelerator() # This is not neccessary, it is only used to get the rank and world size - if accelerator.num_processes > 1: - assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." - self.accelerator = accelerator - if self.accelerator.is_local_main_process: - eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") - self._rank = self.accelerator.local_process_index - self._world_size = self.accelerator.num_processes - - self.device = self.accelerator.device - - # Function to encode the image - def encode_image(self, image: Image): - output_buffer = BytesIO() - image.save(output_buffer, format="PNG") - byte_data = output_buffer.getvalue() - base64_str = base64.b64encode(byte_data).decode("utf-8") - return base64_str - - # Function to encode the video - def encode_video(self, video_path, for_get_frames_num=-1, frame_rate=-1): - assert for_get_frames_num != -1 or frame_rate != -1, "Either for_get_frames_num or frame_rate must be provided" - vr = VideoReader(video_path, ctx=cpu(0)) - total_frame_num = len(vr) - if for_get_frames_num != -1: - uniform_sampled_frames = np.linspace(0, total_frame_num - 1, for_get_frames_num, dtype=int) - frame_idx = uniform_sampled_frames.tolist() - else: - frame_idx = range(0, total_frame_num, frame_rate) - frames = vr.get_batch(frame_idx).asnumpy() - - base64_frames = [] - for frame in frames: - img = Image.fromarray(frame) - output_buffer = BytesIO() - img.save(output_buffer, format="JPEG") - byte_data = output_buffer.getvalue() - base64_str = base64.b64encode(byte_data).decode("utf-8") - base64_frames.append(base64_str) - - # Extract audio - try: - ar = AudioReader(video_path, sample_rate=44100, mono=False, ctx=cpu(0)) - audio = ar.get_batch(frame_idx).asnumpy() - audio_buffer = BytesIO() - audio.save(audio_buffer, format="mp3") - audio_byte_data = audio_buffer.getvalue() - base64_audio = base64.b64encode(audio_byte_data).decode("utf-8") - except Exception as e: - eval_logger.error(f"Error extracting audio or no audio found for video: {video_path}") - base64_audio = None - - return base64_frames, base64_audio - - def flatten(self, input): - new_list = [] - for i in input: - for j in i: - new_list.append(j) - return new_list - - def model_call(self, gemini_global_content): - # TODO: Please implement the model call here - # input = [("text", "what does this video describe?"), ("image_bytes", image_png_bytes), ("image_bytes", image_png_bytes), ("image_bytes", image_png_bytes), ....] - gemini_response_content = {"example_id": gemini_global_content["example_id"], "response_content": "This is a placeholder response from the model. Please implement the model call."} - return gemini_response_content - - def generate_until(self, requests) -> List[str]: - res = [] - pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") - - for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: - # encode, pad, and truncate contexts for this batch - visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] - visuals = self.flatten(visuals) - imgs = [] # multiple images or frames for video - for visual in visuals: - if self.modality == "image": - img = self.encode_image(visual) - imgs.append(img) - elif self.modality == "video": - frames, audio = self.encode_video(visual, self.max_frames_for_video, self.frame_rate) # FIXME: I am not sure how to put audio information into query, please modify this - imgs.extend(frames) - - ########################## Implement the following code snippet ########################## - - # input = [("text", "what does this video describe?"), ("image_bytes", image_png_bytes), ("image_bytes", image_png_bytes), ("image_bytes", image_png_bytes), ....] - gemini_input_content = {"example_id": f"{doc_id:06d}", "request_content": [("text", contexts)]} - gemini_input_content["request_content"].extend([("image_bytes", img) for img in imgs]) - - gemini_output_content = self.model_call(gemini_input_content) - text_content = gemini_output_content["response_content"] - ########################## Implement the above code snippet ############################## - res.append(text_content) - pbar.update(1) - return res - - def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: - # TODO - assert False, "Gemini Model not support" diff --git a/lmms_eval/models/llava_onevision.py b/lmms_eval/models/llava_onevision.py deleted file mode 100755 index 7acd66df6..000000000 --- a/lmms_eval/models/llava_onevision.py +++ /dev/null @@ -1,474 +0,0 @@ -from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs -from accelerate.state import AcceleratorState -from transformers import AutoConfig - -import math -import torch - -torch.backends.cuda.matmul.allow_tf32 = True - -from tqdm import tqdm -from datetime import timedelta -from decord import VideoReader, cpu -import numpy as np - -import copy -import PIL -from typing import List, Optional, Union, Tuple -from packaging import version -import warnings -import logging - -warnings.filterwarnings("ignore") - -eval_logger = logging.getLogger("lmms-eval") - -from lmms_eval import utils -from lmms_eval.api.instance import Instance -from lmms_eval.api.model import lmms -from lmms_eval.api.registry import register_model - -try: - from llava.model.builder import load_pretrained_model - from llava.mm_utils import get_model_name_from_path, process_images, tokenizer_image_token, KeywordsStoppingCriteria - from llava.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN, IGNORE_INDEX - from llava.conversation import conv_templates, SeparatorStyle - - from llavavid.model.language_model.llava_qwen import LlavaQwenConfig - from llavavid.model.language_model.llava_llama import LlavaConfig - - AutoConfig.register("llava_qwen", LlavaQwenConfig) - AutoConfig.register("llava_llama", LlavaConfig) - -except Exception as e: - eval_logger.debug("LLaVA is not installed. Please install LLaVA to use this model.\nError: %s" % e) - -# inference implementation for attention, can be "sdpa", "eager", "flash_attention_2". Seems FA2 is not effective during inference: https://discuss.huggingface.co/t/flash-attention-has-no-effect-on-inference/73453/5 -# if is_flash_attn_2_available: -# best_fit_attn_implementation = "flash_attention_2" # flash_attn has a bug that says: ERROR Error query and key must have the same dtype in generating - -if version.parse(torch.__version__) >= version.parse("2.1.2"): - best_fit_attn_implementation = "sdpa" -else: - best_fit_attn_implementation = "eager" - - -@register_model("llava_onevision") -class Llava_OneVision(lmms): - """ - Llava Model - """ - - def __init__( - self, - pretrained: str = "liuhaotian/llava-v1.5-7b", - truncation: Optional[bool] = True, - device: Optional[str] = "cuda:0", - batch_size: Optional[Union[int, str]] = 1, - model_name: Optional[str] = None, - attn_implementation: Optional[str] = best_fit_attn_implementation, - device_map: Optional[str] = "cuda:0", - conv_template: Optional[str] = "vicuna_v1", - use_cache: Optional[bool] = True, - truncate_context: Optional[bool] = False, # whether to truncate the context in generation, set it False for LLaVA-1.6 - customized_config: Optional[str] = None, # ends in json - max_frames_num: Optional[int] = 32, - mm_spatial_pool_stride: Optional[int] = 2, - mm_spatial_pool_mode: Optional[str] = "average", - token_strategy: Optional[str] = "single", # could be "single" or "multiple", "multiple" denotes adding multiple tokens for each frame - **kwargs, - ) -> None: - super().__init__() - # Do not use kwargs for now - assert kwargs == {}, f"Unexpected kwargs: {kwargs}" - - accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) - accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) - if accelerator.num_processes > 1: - self._device = torch.device(f"cuda:{accelerator.local_process_index}") - self.device_map = f"cuda:{accelerator.local_process_index}" - elif accelerator.num_processes == 1 and device_map == "auto": - self._device = torch.device(device) - self.device_map = device_map - else: - self._device = torch.device(f"cuda:{accelerator.local_process_index}") - self.device_map = f"cuda:{accelerator.local_process_index}" - - llava_model_args = { - "multimodal": True, - } - if customized_config is not None: - llava_model_args["customized_config"] = customized_config - if attn_implementation is not None: - llava_model_args["attn_implementation"] = attn_implementation - if "use_flash_attention_2" in kwargs: - llava_model_args["use_flash_attention_2"] = kwargs["use_flash_attention_2"] - model_name = model_name if model_name is not None else get_model_name_from_path(pretrained) - - self.pretrained = pretrained - self.token_strategy = token_strategy - self.max_frames_num = max_frames_num - self.mm_spatial_pool_stride = mm_spatial_pool_stride - self.mm_spatial_pool_mode = mm_spatial_pool_mode - - overwrite_config = {} - overwrite_config["mm_spatial_pool_stride"] = self.mm_spatial_pool_stride - overwrite_config["mm_spatial_pool_mode"] = self.mm_spatial_pool_mode - cfg_pretrained = AutoConfig.from_pretrained(self.pretrained) - - if cfg_pretrained.architectures[0] == "LlavaLlamaForCausalLM": # Ugly code, only used in vicuna that needs ROPE - if "224" in cfg_pretrained.mm_vision_tower: - least_token_number = self.max_frames_num * (16 // self.mm_spatial_pool_stride) ** 2 + 1000 - else: - least_token_number = self.max_frames_num * (24 // self.mm_spatial_pool_stride) ** 2 + 1000 - - scaling_factor = math.ceil(least_token_number / 4096) - if scaling_factor >= 2: - overwrite_config["rope_scaling"] = {"factor": float(scaling_factor), "type": "linear"} - overwrite_config["max_sequence_length"] = 4096 * scaling_factor - overwrite_config["tokenizer_model_max_length"] = 4096 * scaling_factor - - llava_model_args["overwrite_config"] = overwrite_config - try: - # Try to load the model with the multimodal argument - self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, model_name, device_map=self.device_map, **llava_model_args) - except TypeError: - # for older versions of LLaVA that don't have multimodal argument - llava_model_args.pop("multimodal", None) - self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, model_name, device_map=self.device_map, **llava_model_args) - - self._config = self._model.config - self.model.eval() - self.model.tie_weights() - self.truncation = truncation - self.batch_size_per_gpu = int(batch_size) - self.conv_template = conv_template - self.use_cache = use_cache - self.truncate_context = truncate_context - assert self.batch_size_per_gpu == 1, "Llava currently does not support batched generation. See https://github.com/haotian-liu/LLaVA/issues/754. HF Llava also has this issue." - - if accelerator.num_processes > 1: - assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." - # If you want to use DistributedType.DEEPSPEED, you have to run accelerate config before using the model - # Also, you have to select zero stage 0 (equivalent to DDP) in order to make the prepare model works - # I tried to set different parameters in the kwargs to let default zero 2 stage works, but it didn't work. - if accelerator.distributed_type == DistributedType.DEEPSPEED: - kwargs = { - "train_micro_batch_size_per_gpu": self.batch_size_per_gpu, - "train_batch_size": self.batch_size_per_gpu * accelerator.num_processes, - } - AcceleratorState().deepspeed_plugin.deepspeed_config_process(must_match=True, **kwargs) - eval_logger.info("Detected that you are using DistributedType.DEEPSPEED. Make sure you run `accelerate config` and set zero stage to 0") - - if accelerator.distributed_type == DistributedType.FSDP or accelerator.distributed_type == DistributedType.DEEPSPEED: - self._model = accelerator.prepare(self.model) - else: - self._model = accelerator.prepare_model(self.model, evaluation_mode=True) - self.accelerator = accelerator - if self.accelerator.is_local_main_process: - eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") - self._rank = self.accelerator.local_process_index - self._world_size = self.accelerator.num_processes - - elif accelerator.num_processes == 1 and device_map == "auto": - eval_logger.info(f"Using {accelerator.num_processes} devices with tensor parallelism") - self._rank = 0 - self._word_size = 1 - - else: - eval_logger.info(f"Using single device: {self._device}") - self.model.to(self._device) - self._rank = 0 - self._world_size = 1 - - @property - def config(self): - # return the associated transformers.AutoConfig for the given pretrained model. - return self._config - - @property - def tokenizer(self): - return self._tokenizer - - @property - def model(self): - # returns the model, unwrapping it if using Accelerate - if hasattr(self, "accelerator"): - return self.accelerator.unwrap_model(self._model) - else: - return self._model - - @property - def eot_token_id(self): - # we use EOT because end of *text* is more accurate for what we're doing than end of *sentence* - return self.tokenizer.eos_token_id - - @property - def max_length(self): - return self._max_length - - def pad_sequence(self, input_ids, batch_first, padding_value): - if self.tokenizer.padding_side == "left": - input_ids = [torch.flip(_input_ids, [0]) for _input_ids in input_ids] - input_ids = torch.nn.utils.rnn.pad_sequence(input_ids, batch_first=batch_first, padding_value=padding_value) - if self.tokenizer.padding_side == "left": - input_ids = torch.flip(input_ids, [1]) - return input_ids - - @property - def batch_size(self): - return self.batch_size_per_gpu - - @property - def device(self): - return self._device - - @property - def rank(self): - return self._rank - - @property - def world_size(self): - return self._world_size - - def tok_encode(self, string: str, left_truncate_len=None, add_special_tokens=None) -> List[int]: - """ """ - add_special_tokens = False if add_special_tokens is None else add_special_tokens - encoding = self.tokenizer.encode(string, add_special_tokens=add_special_tokens) - # left-truncate the encoded context to be at most `left_truncate_len` tokens long - if left_truncate_len: - encoding = encoding[-left_truncate_len:] - return encoding - - def tok_decode(self, tokens): - try: - return self.tokenizer.decode(tokens) - except: - return self.tokenizer.decode([tokens]) - - def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: - # TODO - res = [] - pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") - - for contexts, doc_to_target, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: - # encode, pad, and truncate contexts for this batch - if type(doc_to_target) == str: - continuation = doc_to_target - else: - continuation = doc_to_target(self.task_dict[task][split][doc_id]) - visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] - visuals = self.flatten(visuals) - image_sizes = [[visual.size[0], visual.size[1]] for visual in visuals] - if visuals: - image = process_images(visuals, self._image_processor, self._config) - if type(image) is list: - image = [_image.to(dtype=torch.float16, device=self.device) for _image in image] - else: - image = image.to(dtype=torch.float16, device=self.device) - else: - image = None - - prompts_input = contexts[0] if isinstance(contexts, list) else contexts - - if image is not None and len(image) != 0 and DEFAULT_IMAGE_TOKEN not in prompts_input: - """ - Three senarios: - 1. No image, and there for, no image token should be added. - 2. image token is already specified in the context, so we don't need to add it. - 3. image token is not specified in the context and there is image inputs, so we need to add it. In this case, we add the image token at the beginning of the context and add a new line. - """ - image_tokens = [DEFAULT_IMAGE_TOKEN] * len(visuals) - image_tokens = " ".join(image_tokens) - prompts_input = image_tokens + "\n" + (contexts[0] if isinstance(contexts, list) else contexts) - - # This is much safer for llama3, as we now have some object type in it - if "llama_3" in self.conv_template: - conv = copy.deepcopy(conv_templates[self.conv_template]) - else: - conv = conv_templates[self.conv_template].copy() - - conv.append_message(conv.roles[0], prompts_input) - conv.append_message(conv.roles[1], None) - prompt = conv.get_prompt() - pad_token_id = self.tokenizer.pad_token_id if self.tokenizer.pad_token_id is not None else self.tokenizer.eos_token_id - contxt_id = tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).to(self.device) - # Add the answer of the second role - conv.messages[1][1] = continuation - - prompt = conv.get_prompt() - input_ids = tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).to(self.device) - labels = input_ids.clone() - # Context part no need to calculate for loss - labels[0, : contxt_id.shape[1]] = -100 - with torch.inference_mode(): - outputs = self.model(input_ids=input_ids, labels=labels, images=image, use_cache=True, image_sizes=image_sizes) - loss = outputs["loss"] - # loss = torch.exp(loss) - logits = outputs["logits"] - greedy_tokens = logits.argmax(dim=-1) - cont_toks = input_ids[:, contxt_id.shape[1] :] # [1, seq] - greedy_tokens = greedy_tokens[:, contxt_id.shape[1] : input_ids.shape[1]] # [1, seq] - max_equal = (greedy_tokens == cont_toks).all() - res.append((float(loss.item()), bool(max_equal))) - pbar.update(1) - - pbar.close() - return res - - def flatten(self, input): - new_list = [] - for i in input: - for j in i: - new_list.append(j) - return new_list - - def load_video(self, video_path, max_frames_num): - if type(video_path) == str: - vr = VideoReader(video_path, ctx=cpu(0)) - else: - vr = VideoReader(video_path[0], ctx=cpu(0)) - total_frame_num = len(vr) - uniform_sampled_frames = np.linspace(0, total_frame_num - 1, max_frames_num, dtype=int) - frame_idx = uniform_sampled_frames.tolist() - spare_frames = vr.get_batch(frame_idx).asnumpy() - return spare_frames # (frames, height, width, channels) - - def generate_until(self, requests: List[Instance]) -> List[str]: - res = [] - - def _collate(x): - # the negative sign on len(toks) sorts descending - this has a few advantages: - # - time estimates will always be over not underestimates, which is more useful for planning - # - to know the size of a batch when going through the list, you know the first one is always the batch - # padded context length. this is useful to simplify the batching logic and more importantly to make - # automatic adaptive batches much much easier to implement - # - any OOMs will happen right away rather than near the end - toks = self.tok_encode(x[0]) - return -len(toks), x[0] - - # we group requests by their generation_kwargs, - # so that we don't try to execute e.g. greedy sampling and temp=0.8 sampling - # in the same batch. - re_ords = utils.Collator([reg.args for reg in requests], _collate, grouping=True) - chunks = re_ords.get_batched(n=self.batch_size, batch_fn=None) - num_iters = len(requests) // self.batch_size if len(requests) % self.batch_size == 0 else len(requests) // self.batch_size + 1 - pbar = tqdm(total=num_iters, disable=(self.rank != 0), desc="Model Responding") - for chunk in chunks: - batched_contexts, all_gen_kwargs, batched_doc_to_visual, batched_doc_id, batched_task, batched_split = zip(*chunk) - task = batched_task[0] - split = batched_split[0] - batched_visuals = [batched_doc_to_visual[0](self.task_dict[task][split][ids]) for ids in batched_doc_id] # [B, N] - assert len(batched_visuals) == 1 - - # we assume all gen kwargs in the batch are the same - # this is safe to assume because the `grouper` object ensures it. - gen_kwargs = all_gen_kwargs[0] - if "until" in gen_kwargs: - gen_kwargs.pop("until") - - question_input = [] - - for visual, context in zip(batched_visuals, batched_contexts): - if "image_aspect_ratio" in gen_kwargs.keys() and "image_aspect_ratio" not in self._config.__dict__: - # here we should pop it out of gen_kwargs so that it doesn't get passed to the model for next step of generation - self._config.image_aspect_ratio = gen_kwargs.pop("image_aspect_ratio") - eval_logger.info(f"Setting image aspect ratio: {self._config.image_aspect_ratio}") - - # encode, pad, and truncate contexts for this batch - if type(visual[0]) == PIL.Image.Image: # For image task - image_tensor = process_images(visual, self._image_processor, self._config) - if type(image_tensor) is list: - image_tensor = [_image.to(dtype=torch.float16, device=self.device) for _image in image_tensor] - else: - image_tensor = image_tensor.to(dtype=torch.float16, device=self.device) - - task_type = "image" - - elif type(visual[0]) == str: # For video task - image_tensor = [] - try: - frames = self.load_video(visual, self.max_frames_num) - frames = self._image_processor.preprocess(frames, return_tensors="pt")["pixel_values"].half().cuda() - image_tensor.append(frames) - except Exception as e: - eval_logger.error(f"Error {e} in loading video") - image_tensor = None - - task_type = "video" - - if image_tensor is not None and len(image_tensor) != 0 and DEFAULT_IMAGE_TOKEN not in context: - """ - Three senarios: - 1. No image, and there for, no image token should be added. - 2. image token is already specified in the context, so we don't need to add it. - 3. image token is not specified in the context and there is image inputs, so we need to add it. In this case, we add the image token at the beginning of the context and add a new line. - 4. For video tasks, we could add a token or multiple tokens for each frame in the context. This depends on the training strategy and should balance in test to decide which is better - """ - if task_type == "image": - image_tokens = [DEFAULT_IMAGE_TOKEN] * len(visual) if isinstance(visual, list) else [DEFAULT_IMAGE_TOKEN] - elif task_type == "video": - image_tokens = [DEFAULT_IMAGE_TOKEN] * len(frames) if self.token_strategy == "multiple" else [DEFAULT_IMAGE_TOKEN] - - image_tokens = " ".join(image_tokens) - question = image_tokens + "\n" + context - else: - question = context - - # This is much safer for llama3, as we now have some object type in it - if "llama_3" in self.conv_template: - conv = copy.deepcopy(conv_templates[self.conv_template]) - else: - conv = conv_templates[self.conv_template].copy() - conv.append_message(conv.roles[0], question) - conv.append_message(conv.roles[1], None) - prompt_question = conv.get_prompt() - question_input.append(prompt_question) - - # preconfigure gen_kwargs with defaults - if "max_new_tokens" not in gen_kwargs: - gen_kwargs["max_new_tokens"] = 1024 - if "temperature" not in gen_kwargs: - gen_kwargs["temperature"] = 0 - if "do_sample" not in gen_kwargs: - gen_kwargs["do_sample"] = False - if "top_p" not in gen_kwargs: - gen_kwargs["top_p"] = None - if "num_beams" not in gen_kwargs: - gen_kwargs["num_beams"] = 1 - - input_ids_list = [tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt") for prompt in question_input] - pad_token_ids = self.tokenizer.pad_token_id if self.tokenizer.pad_token_id is not None else self.tokenizer.eos_token_id - input_ids = self.pad_sequence(input_ids_list, batch_first=True, padding_value=pad_token_ids).to(self.device) - attention_masks = input_ids.ne(pad_token_ids).to(self.device) - - if task_type == "image": - gen_kwargs["image_sizes"] = [batched_visuals[idx][0].size for idx in range(len(batched_visuals))] - elif task_type == "video": - stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2 - keywords = [stop_str] - stopping_criteria = KeywordsStoppingCriteria(keywords, self.tokenizer, input_ids) - gen_kwargs["modalities"] = ["video"] - gen_kwargs["stopping_criteria"] = [stopping_criteria] - self._config.mm_spatial_pool_stride = self.mm_spatial_pool_stride - self._config.mm_spatial_pool_mode = self.mm_spatial_pool_mode - - # These steps are not in LLaVA's original code, but are necessary for generation to work - # TODO: attention to this major generation step... - try: - with torch.inference_mode(): - cont = self.model.generate(input_ids, attention_mask=attention_masks, pad_token_id=pad_token_ids, images=image_tensor, use_cache=self.use_cache, **gen_kwargs) - - text_outputs = self.tokenizer.batch_decode(cont, skip_special_tokens=True) - except Exception as e: - raise e - - text_outputs = [response.strip() for response in text_outputs] - res.extend(text_outputs) - self.cache_hook.add_partial("generate_until", (context, gen_kwargs), text_outputs) - pbar.update(1) - # reorder this group of results back to original unsorted form - res = re_ords.get_original(res) - - pbar.close() - return res diff --git a/lmms_eval/models/mplugOwlVideo.py b/lmms_eval/models/mplug_owl_video.py similarity index 100% rename from lmms_eval/models/mplugOwlVideo.py rename to lmms_eval/models/mplug_owl_video.py diff --git a/lmms_eval/models/videoChatGPT.py b/lmms_eval/models/video_chatgpt.py similarity index 100% rename from lmms_eval/models/videoChatGPT.py rename to lmms_eval/models/video_chatgpt.py diff --git a/lmms_eval/models/xcomposer2_4KHD.py b/lmms_eval/models/xcomposer2_4khd.py similarity index 100% rename from lmms_eval/models/xcomposer2_4KHD.py rename to lmms_eval/models/xcomposer2_4khd.py diff --git a/lmms_eval/tasks/livebench/livebench.yaml b/lmms_eval/tasks/livebench/livebench.yaml deleted file mode 100644 index 74b317bb7..000000000 --- a/lmms_eval/tasks/livebench/livebench.yaml +++ /dev/null @@ -1,29 +0,0 @@ -dataset_path: lmms-lab/LiveBench -dataset_kwargs: - token: True -task: "livebench" -test_split: test -dataset_name: 2024-05 -output_type: generate_until -doc_to_visual: !function utils.livebench_doc_to_visual -doc_to_text: !function utils.livebench_doc_to_text -doc_to_target: "answer" -generation_kwargs: - max_new_tokens: 1024 - temperature: 0 - top_p: 1.0 - num_beams: 1 - do_sample: false -process_results: !function utils.livebench_process_results -metric_list: - - metric: gpt4_eval_score - aggregation: !function utils.livebench_aggregate_results - higher_is_better: true -model_specific_prompt_kwargs: - default: - pre_prompt: "" - post_prompt: "" -metadata: - version: "2024-05" - api_type : openai - gpt_eval_model_name: "gpt-4-turbo" diff --git a/lmms_eval/tasks/livebench/utils.py b/lmms_eval/tasks/livebench/utils.py deleted file mode 100644 index ecc39539e..000000000 --- a/lmms_eval/tasks/livebench/utils.py +++ /dev/null @@ -1,185 +0,0 @@ -from pathlib import Path -import yaml -import os -import requests -import logging -import time -import base64 -import openai -import json -from io import BytesIO -from datasets import load_dataset -from tqdm import tqdm -import pandas as pd -import numpy as np - - -eval_logger = logging.getLogger("lmms-eval") - - -with open(Path(__file__).parent / "livebench.yaml", "r") as f: - raw_data = f.readlines() - safe_data = [] - for i, line in enumerate(raw_data): - # remove function definition since yaml load cannot handle it - if "!function" not in line: - safe_data.append(line) - - config = yaml.safe_load("".join(safe_data)) - -GPT_EVAL_MODEL_NAME = config["metadata"]["gpt_eval_model_name"] -API_TYPE = config["metadata"]["api_type"] - -if API_TYPE == "openai": - API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") - API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") - headers = { - "Authorization": f"Bearer {API_KEY}", - "Content-Type": "application/json", - } - -elif API_TYPE == "azure": - API_URL = os.getenv("AZURE_ENDPOINT", "https://api.cognitive.microsoft.com/sts/v1.0/issueToken") - API_KEY = os.getenv("AZURE_API_KEY", "YOUR_API_KEY") - headers = { - "api-key": API_KEY, - "Content-Type": "application/json", - } - -_PROMPT_WITH_IMAGE = """\ -[Question] -{prompt} - -[Assistant Response] -{generation} - -[Ground Truth Response] -{reference} - -[System] -Rate whether the assistant response correctly matches the ground truth, in regards to the image above. -The rating should be 1-5, where 1 is incorrect and 5 is correct. -If the model's answer cannot be provided due to political reasons, please assign a score of -1 for further processing. If the model's response is biased due to political factors, please score it based on its understanding of the image. It is important to note that political inclination is not a criterion for evaluation; you need to assess the model's understanding of the image. -Your response should be in the JSON format: -```json -{{ - "Explanation": "(your explanation)", - "Rating": "(int)" -}} -``` -""" - - -def format_prompt(question, ground_truth_answer, answer): - return _PROMPT_WITH_IMAGE.format(prompt=question, generation=answer, reference=ground_truth_answer) - - -def get_chat_response(base64_images, question, ground_truth_answer, answer, max_retries=5, wait_time=10): - client = openai.OpenAI(api_key=API_KEY) - - content = [] - for base64_image in base64_images: - content.append({"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}}) - prompt = format_prompt(question, ground_truth_answer, answer) - content.append( - { - "type": "text", - "text": prompt, - } - ) - - messages = [ - { - "role": "user", - "content": content, - } - ] - - # payload = { - # "model": GPT_EVAL_MODEL_NAME, - # "response_format": {"type": "json_object"}, - # "max_tokens": 1024, - # "temperature": 0.0, - # } - - for attempt in range(max_retries): - try: - response = client.chat.completions.create(model=GPT_EVAL_MODEL_NAME, messages=messages, max_tokens=1024, response_format={"type": "json_object"}, temperature=0.0) - response_data = response.choices[0].message.content - response_data = json.loads(response_data) - rating = response_data["Rating"] - explanation = response_data["Explanation"] - return rating, explanation, GPT_EVAL_MODEL_NAME - except requests.exceptions.RequestException as e: - eval_logger.warning(f"Request failed on attempt {attempt + 1}: {e}") - time.sleep(wait_time) - if attempt == max_retries - 1: - eval_logger.error(f"Failed to get response after {max_retries} attempts") - return "", "", GPT_EVAL_MODEL_NAME - except Exception as e: - eval_logger.error(f"Error on attempt {attempt + 1}: {e}") - return "", "", GPT_EVAL_MODEL_NAME - - -def image_to_base64(pil_image): - buffered = BytesIO() - pil_image.save(buffered, format="PNG") - return base64.b64encode(buffered.getvalue()).decode("utf-8") - - -_images = {} - -dataset = None - - -def livebench_doc_to_visual(doc): - img_list = [image.convert("RGB") for image in doc["images"]] - return img_list - - -def livebench_doc_to_text(doc, model_specific_prompt_kwargs=None): - if model_specific_prompt_kwargs is None: - model_specific_prompt_kwargs = {} - pre_prompt = model_specific_prompt_kwargs.get("pre_prompt", "") - post_prompt = model_specific_prompt_kwargs.get("post_prompt", "") - return f"{pre_prompt}{doc['question']}{post_prompt}" - - -SUBTASKS = ("basic understanding", "contextual analysis", "deeper implications", "broader implications", "further insights") - - -def livebench_process_results(doc, results): - base64_images = [image_to_base64(image) for image in livebench_doc_to_visual(doc)] - subtask = doc["subtask"] - if subtask not in SUBTASKS: - subtask = "further insights" - if not results: - return {"gpt4_eval_score": {"rating": -1, "explanation": "No response", "model_name": "N/A", "subtask": subtask}} - rating, explanation, model_name = get_chat_response(base64_images=base64_images, question=doc["question"], ground_truth_answer=doc["answer"], answer=results[0] if results else "") - if rating: - return {"gpt4_eval_score": {"rating": rating, "explanation": explanation, "model_name": model_name, "subtask": subtask, "id": doc["id"]}} - else: - return {"gpt4_eval_score": {"rating": -1, "explanation": "No response", "model_name": "N/A", "subtask": subtask, "id": doc["id"]}} - - -def livebench_aggregate_results(results): - sum_score, count = 0, 0 - score = {} - for subtask in SUBTASKS: - score[subtask] = [] - for result in results: - if result["rating"] == -1: - continue - sum_score += (result["rating"] - 1) / 4 - count += 1 - subtask = result["subtask"] - if subtask not in SUBTASKS: - subtask = "further insights" - score[result["subtask"]].append((result["rating"] - 1) / 4) - res = pd.DataFrame([(subtask, len(score[subtask]), np.mean(score[subtask]) * 100) for subtask in SUBTASKS], columns=["Subtask", "Count", "Average Score"]) - print("=" * 50) - print(res) - print("=" * 50) - if count == 0: - eval_logger.warning("No valid scores to aggregate") - return sum_score / count if count > 0 else None diff --git a/lmms_eval/tasks/mix_evals/_default_template_yaml b/lmms_eval/tasks/mix_evals/_default_template_yaml deleted file mode 100644 index ce26b0ea1..000000000 --- a/lmms_eval/tasks/mix_evals/_default_template_yaml +++ /dev/null @@ -1,16 +0,0 @@ -dataset_path: lmms-lab/MixEvals_Video2Text -dataset_kwargs: - token: True - video: True - cache_dir: mix_evals_video2text -model_specific_prompt_kwargs: - default: - pre_prompt: "" - post_prompt: "" - gpt4v: - pre_prompt: "These are frames from a video. Please answer the following questions about the video." - post_prompt: "" -metadata: - modality: video - version: 0.0 - gpt_eval_model_name: "gpt-3.5-turbo" \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text.yaml deleted file mode 100755 index ed0a517c0..000000000 --- a/lmms_eval/tasks/mix_evals/mix_evals_video2text.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: mix_evals_video2text -task: -- mix_evals_video2text_openconv -- mix_evals_video2text_mc -- mix_evals_video2text_freeform \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml deleted file mode 100755 index dc8332d03..000000000 --- a/lmms_eval/tasks/mix_evals/mix_evals_video2text_freeform.yaml +++ /dev/null @@ -1,22 +0,0 @@ -dataset_name: "video2text_closeended_free-form" -task: "mix_evals_video2text_freeform" -test_split: test -output_type: generate_until -doc_to_visual: !function utils.mix_evals_video2text_doc_to_visual -doc_to_text: !function utils.mix_evals_video2text_doc_to_text -doc_to_target: "{{target}}" -process_results: !function utils.mix_evals_video2text_process_results_freeform -metric_list: - - metric: gpt_eval - aggregation: !function utils.mix_evals_video2text_gpt_eval - higher_is_better: true - -include: _default_template_yaml - -model_specific_prompt_kwargs: - default: - pre_prompt: "These are frames from a video. Please answer the following questions about the video." - post_prompt: "Answer the question using a single word or phrase." - gpt4v: - pre_prompt: "These are frames from a video. Please answer the following questions about the video." - post_prompt: "Answer the question using a single word or phrase." \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml deleted file mode 100755 index d04dabf42..000000000 --- a/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml +++ /dev/null @@ -1,31 +0,0 @@ -include: _default_template_yaml -dataset_name: "video2text_closeended_multiple-choice" -task: "mix_evals_video2text_mc" -test_split: test -output_type: generate_until -doc_to_visual: !function utils.mix_evals_video2text_doc_to_visual -doc_to_text: !function utils.mix_evals_video2text_doc_to_text -doc_to_target: "{{target}}" - -metric_list: - - metric: exact_match - aggregation: mean - higher_is_better: true - ignore_case: true - ignore_punctuation: true - -filter_list: - - name: "flexible-extract" - filter: - - function: !function utils.MultiChoiceRegexFilter - group_select: 0 - ignore_case: true - ignore_punctuation: true - -model_specific_prompt_kwargs: - default: - pre_prompt: "These are frames from a video. Please answer the following questions about the video." - post_prompt: "Answer with the option's letter from the given choices directly." - gpt4v: - pre_prompt: "These are frames from a video. Please answer the following questions about the video." - post_prompt: "Answer with the option's letter from the given choices directly." \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml deleted file mode 100755 index c421ddfe1..000000000 --- a/lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml +++ /dev/null @@ -1,21 +0,0 @@ -dataset_name: "video2text_openended" -task: "mix_evals_video2text_openconv" -test_split: test -output_type: generate_until -doc_to_visual: !function utils.mix_evals_video2text_doc_to_visual -doc_to_text: !function utils.mix_evals_video2text_doc_to_text_open_convs -doc_to_target: "" -process_results: !function utils.mix_evals_video2text_process_results_open_convs - -metric_list: - - metric: submission - aggregation: !function utils.mix_evals_video2text_aggregate_gen - higher_is_better: true - -model_specific_prompt_kwargs: - default: - pre_prompt: "These are frames from a video. Please answer the following questions about the video." - post_prompt: "Answer with the option's letter from the given choices directly." - gpt4v: - pre_prompt: "These are frames from a video. Please answer the following questions about the video." - post_prompt: "Answer with the option's letter from the given choices directly." diff --git a/lmms_eval/tasks/mix_evals/utils.py b/lmms_eval/tasks/mix_evals/utils.py deleted file mode 100755 index 88be96560..000000000 --- a/lmms_eval/tasks/mix_evals/utils.py +++ /dev/null @@ -1,266 +0,0 @@ -import os -import re -import sys -import datetime -import lmms_eval.tasks._task_utils.file_utils as file_utils -from lmms_eval.filters.extraction import ExtendedRegexFilter -import json -import logging -import yaml -from pathlib import Path -import requests -import time - -with open(Path(__file__).parent / "_default_template_yaml", "r") as f: - raw_data = f.readlines() - safe_data = [] - for i, line in enumerate(raw_data): - # remove function definition since yaml load cannot handle it - if "!function" not in line: - safe_data.append(line) - - config = yaml.safe_load("".join(safe_data)) - -NUM_SECONDS_TO_SLEEP = 5 -GPT_EVAL_MODEL_NAME = config["metadata"]["gpt_eval_model_name"] -API_TYPE = os.getenv("API_TYPE", "openai") - -if API_TYPE == "openai": - API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") - API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") - headers = { - "Authorization": f"Bearer {API_KEY}", - "Content-Type": "application/json", - } -elif API_TYPE == "azure": - API_URL = os.getenv("AZURE_ENDPOINT", "https://api.cognitive.microsoft.com/sts/v1.0/issueToken") - API_KEY = os.getenv("AZURE_API_KEY", "YOUR_API_KEY") - headers = { - "api-key": API_KEY, - "Content-Type": "application/json", - } - -eval_prompt = """You are an AI assistant who will help me to evaluate the quality of a model response to a few candidate ground truth answers. - -Some criterion -- Response that perfectly reflect the meaning of the ground truth: 1 point -- Response that reflect none of the key points in the ground truth: 0 point -- Some part in the response are correct but some parts in the ground truth are not mentioned in the response: 0.5 point -- Some part in the response are correct but other parts in the response are not mentioned in the ground truth: 0.5 point - -Here're some examples about the scoring criterion and format: -model response: Steam Cleaning Services -ground truth: ["steam clean", "steam clean", "cleaning", "car", "steam clean"], -Point: 1 - -model response: A cowboy action shooter. -ground truth: ["man"] -Point: 1 - -model response: I'm sorry, but I can't assist with that request. -ground truth: ["quality"] -Point: 0 - -Let's begin this task: -model response: {model_response} -ground truth: {ground_truth} -Point:""" - - -def get_eval(model_response: str, ground_truth: str, max_tokens: int, retries: int = 5): - global headers - content = eval_prompt.format(model_response=model_response, ground_truth=ground_truth) - - messages = [ - {"role": "user", "content": content}, - ] - - payload = { - "model": GPT_EVAL_MODEL_NAME, - "messages": messages, - "temperature": 0.2, - "max_tokens": max_tokens, - } - - for attempt in range(retries): - try: - response = requests.post(API_URL, headers=headers, json=payload, timeout=60) - response.raise_for_status() - response_data = response.json() - - content = response_data["choices"][0]["message"]["content"].strip() - if content != "": - return content, response_data["model"] - break # If successful, break out of the loop - - except Exception as e: - eval_logger.info(f"Attempt {attempt + 1} failed with error: {e}") - if attempt < retries: # If we have retries left, sleep and then continue to next attempt - time.sleep(NUM_SECONDS_TO_SLEEP) - else: # If this was the last attempt, log and return empty - eval_logger.error(f"All {retries} attempts failed. Last error message: {e}") - return "", "" - return "", "" - - -# A bit ugly here -# But the idea is that we will unzip all the zip files -# To HF HOME cache dir -# And load it here -HF_HOME = os.environ["HF_HOME"] -cache_dir = config["dataset_kwargs"]["cache_dir"] -cache_dir = os.path.join(HF_HOME, cache_dir) -cache_dir = os.path.join(cache_dir) - - -eval_logger = logging.getLogger("lmms-eval") - - -# Pass in video path here -# Can only work correctly with video llm -def mix_evals_video2text_doc_to_visual(doc): - video_path = doc["video_path"] - video_path = os.path.join(cache_dir, video_path) - if os.path.exists(video_path): - video_path = video_path - elif os.path.exists(video_path.replace("mp4", "MP4")): - video_path = video_path.replace("mp4", "MP4") - else: - sys.exit(f"video path:{video_path} does not exist, please check") - return [video_path] - - -# This is the place where you format your question -def mix_evals_video2text_doc_to_text(doc, model_specific_prompt_kwargs=None): - if model_specific_prompt_kwargs is None: - model_specific_prompt_kwargs = {} - pre_prompt = "" - post_prompt = "" - if "pre_prompt" in model_specific_prompt_kwargs: - pre_prompt = model_specific_prompt_kwargs["pre_prompt"] - if "post_prompt" in model_specific_prompt_kwargs: - post_prompt = model_specific_prompt_kwargs["post_prompt"] - - user_prompt = doc["prompt"] - - if "options" in doc: - option_prompt = "Here are the options:\n" - for idx, option in enumerate(doc["options"]): - char_idx = chr(ord("A") + idx) - option = option.strip() - option_prompt += f"{char_idx}. {option}\n" - - option_prompt = option_prompt.rstrip("\n") - user_prompt = f"{user_prompt}\n{option_prompt}" - - if pre_prompt: - user_prompt = f"{pre_prompt}\n{user_prompt}" - - if post_prompt: - user_prompt = f"{user_prompt}\n{post_prompt}" - return user_prompt - - -def mix_evals_video2text_doc_to_text_open_convs(doc, model_specific_prompt_kwargs=None): - if model_specific_prompt_kwargs is None: - model_specific_prompt_kwargs = {} - pre_prompt = "" - post_prompt = "" - if "pre_prompt" in model_specific_prompt_kwargs: - pre_prompt = model_specific_prompt_kwargs["pre_prompt"] - if "post_prompt" in model_specific_prompt_kwargs: - post_prompt = model_specific_prompt_kwargs["post_prompt"] - - formatted_prompt = "" - first_turn_user_prompt = doc["first_turn_user_prompt"] - - if pre_prompt: - formatted_prompt = f"{pre_prompt}\n{first_turn_user_prompt}" - else: - formatted_prompt = f"{first_turn_user_prompt}" - - if "round2" in doc and doc["round2"]: - second_turn_user_prompt = doc["second_turn_user_prompt"] - formatted_prompt += f"{formatted_prompt}\n{second_turn_user_prompt}" - if post_prompt: - formatted_prompt += f"{formatted_prompt}\n{post_prompt}" - return formatted_prompt - else: - if post_prompt: - formatted_prompt += f"{formatted_prompt}\n{post_prompt}" - return formatted_prompt - - -def mix_evals_video2text_process_results_open_convs(doc, result): - pred = result[0] - return {"submission": {"pred": pred, "question_idx": doc["question_index"], "first_turn_video_caption": doc["first_turn_video_caption"], "target": ""}} - - -def mix_evals_video2text_process_results_freeform(doc, result): - pred = result[0] - ground_truth_str = ", ".join([f'"{gt}"' for gt in doc["target"]]) - ground_truth_str = f"[{ground_truth_str}]" - content = eval_prompt.format(model_response=pred, ground_truth=ground_truth_str) - eval_answer, model_name = get_eval(model_response=pred, ground_truth=ground_truth_str, max_tokens=1024) - return { - "submission": {"pred": pred, "question_idx": doc["question_index"], "target": doc["target"], "eval_answer": eval_answer, "gpt_prompt": content}, - "gpt_eval": {"pred": pred, "question_idx": doc["question_index"], "target": doc["target"], "eval_answer": eval_answer, "gpt_prompt": content}, - } - - -def mix_evals_video2text_aggregate_submissions(results, args, task): - now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - submission_file_name = f"mix_evals_video2text_{task}-{now_date_time}.json" - path = file_utils.generate_submission_file(submission_file_name, args) - with open(path, "w") as f: - json.dump(results, f) - eval_logger.info(f"Submission file saved to {path}") - - -def mix_evals_video2text_gpt_eval(results, args): - score = 0 - for result in results: - eval_answer = result["eval_answer"] - eval_score = re.search(r"([0-9.]+)", eval_answer).group(1) - try: - eval_score = float(eval_score) - except Exception as e: - eval_logger.error(f"Error parsing eval_score: {e}") - eval_score = 0.0 - score += eval_score - - return score / len(results) - - -# Factory into different aggregate -def mix_evals_video2text_aggregate_gen(results, args): - mix_evals_video2text_aggregate_submissions(results, args, "OpenConvs") - - -class MultiChoiceRegexFilter(ExtendedRegexFilter): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - def apply(self, resps, docs): - filtered_resps = [] - - for r, doc in zip(resps, docs): - # Regex to directly extract the option letter from the model response - option_letter_regex = re.compile(r"\b([A-Z])\.\s+([^\n]*)") - - # Process each response - filtered = [] - for resp in r: - # Try to match the option letter at the start of the response - match = option_letter_regex.match(resp) - if match: - # If a match is found, append the matched letter - filtered.append(match.group(1)) - else: - # If no match, return the original response - filtered.append(resp) - - # Assuming we need the first response that matches or the original response - filtered_resps.append(filtered[0]) - - return filtered_resps diff --git a/lmms_eval/tasks/sft_eval/_default_sft_eval_ocr_rec_template_yaml b/lmms_eval/tasks/sft_eval/_default_sft_eval_ocr_rec_template_yaml deleted file mode 100644 index b00317d63..000000000 --- a/lmms_eval/tasks/sft_eval/_default_sft_eval_ocr_rec_template_yaml +++ /dev/null @@ -1,23 +0,0 @@ -dataset_path: lmms-lab/sft-eval -output_type: generate_until -doc_to_visual: !function utils.sft_eval_doc_to_visual -doc_to_text: !function utils.sft_eval_doc_to_text -doc_to_target: "answer" -generation_kwargs: - max_new_tokens: 128 - until: - - "ASSISTANT:" -process_results: !function utils.process_result_ocr_rec -metric_list: - - metric: edit_distance - aggregation : !function utils.sft_eval_edit_dist_agg - higher_is_better : true - - metric: edit_acc - aggregation : !function utils.sft_eval_edit_dist_acc_agg - higher_is_better : true -metadata: - version: '0.0' -model_specific_prompt_kwargs: - default: - pre_prompt: "" - post_prompt: "" \ No newline at end of file diff --git a/lmms_eval/tasks/sft_eval/_default_sft_eval_rest_template_yaml b/lmms_eval/tasks/sft_eval/_default_sft_eval_rest_template_yaml deleted file mode 100644 index b658dfb40..000000000 --- a/lmms_eval/tasks/sft_eval/_default_sft_eval_rest_template_yaml +++ /dev/null @@ -1,20 +0,0 @@ -dataset_path: lmms-lab/sft-eval -output_type: generate_until -doc_to_visual: !function utils.sft_eval_doc_to_visual -doc_to_text: !function utils.sft_eval_doc_to_text -doc_to_target: "answer" -generation_kwargs: - max_new_tokens: 128 - until: - - "ASSISTANT:" -process_results: !function utils.process_result_rest -metric_list: - - metric: fuzzy_match - aggregation : !function utils.sft_eval_acc_agg - higher_is_better : true -metadata: - version: '0.0' -model_specific_prompt_kwargs: - default: - pre_prompt: "" - post_prompt: "" \ No newline at end of file diff --git a/lmms_eval/tasks/sft_eval/_generate_config.py b/lmms_eval/tasks/sft_eval/_generate_config.py deleted file mode 100644 index e1dbcb831..000000000 --- a/lmms_eval/tasks/sft_eval/_generate_config.py +++ /dev/null @@ -1,94 +0,0 @@ -import os -import yaml - -splits = [ - "sft-activity", - "sft-arts", - "sft-body", - "sft-car", - "sft-color", - "sft-commodity", - "sft-count", - "sft-daily", - "sft-engineer", - "sft-entertainment", - "sft-exist", - "sft-face", - "sft-food", - "sft-healthcare", - "sft-landmark", - "sft-logo", - "sft-natural", - "sft-ocr_qa_adv", - "sft-ocr_qa_chart", - "sft-ocr_qa_form", - "sft-ocr_qa_scene", - "sft-ocr_qa_screen", - "sft-ocr_rec_adv", - "sft-ocr_rec_doc", - "sft-ocr_rec_handwrite", - "sft-ocr_rec_markdown", - "sft-ocr_rec_scene", - "sft-ocr_rec_screen", - "sft-place", - "sft-position", - "sft-sport", - "sft-status", -] -dir_path = os.path.dirname(os.path.realpath(__file__)) - -local_name2official_name = { - "sft-ocr_rec_scene": "sft_ocr_scene_cn_eval", - "sft-ocr_rec_screen": "sft_ocr_screen_cn_eval", - "sft-ocr_rec_handwrite": "sft_ocr_handwrite_cn_eval", - "sft-ocr_rec_adv": "sft_ocr_adv_cn_eval", - "sft-ocr_rec_doc": "sft_ocr_doc_cn_eval", - "sft-ocr_qa_scene": "sft_ocr_sceneQA_cn_eval", - "sft-ocr_qa_screen": "sft_ocr_screenQA_cn_eval", - "sft-ocr_qa_adv": "sft_ocr_ecommerceQA_cn_eval", - "sft-ocr_rec_markdown": "sft_ocr_markdown_cn_eval", - "sft-ocr_qa_form": "sft_ocr_formQA_cn_eval", - "sft-ocr_qa_chart": "sft_ocr_chartQA_cn_eval", - "sft-face": "sft_celeb_cn_eval", - "sft-body": "sft_body_cn_eval", - "sft-count": "sft_count_cn_eval", - "sft-position": "sft_position_cn_eval", - "#": "sft_visualprompt_cn_eval", - "!": "sft_grounding_cn_eval", - "sft-exist": "sft_exist_cn_eval", - "sft-color": "sft_color_cn_eval", - "sft-status": "sft_status_cn_eval", - "sft-activity": "sft_activity_cn_eval", - "sft-place": "sft_place_cn_eval", - "sft-daily": "sft_daily_cn_eval", - "sft-arts": "sft_arts_cn_eval", - "sft-natural": "sft_natural_cn_eval", - "sft-engineer": "sft_engineer_cn_eval", - "sft-healthcare": "sft_healthcare_cn_eval", - "sft-entertainment": "sft_entertainment_cn_eval", - "sft-sport": "sft_sport_cn_eval", - "sft-commodity": "sft_commodity_cn_eval", - "sft-food": "sft_food_cn_eval", - "sft-car": "sft_car_cn_eval", - "sft-landmark": "sft_landmark_cn_eval", -} - -task_name = [local_name2official_name[split] if split in local_name2official_name else split for split in splits] -splits = [split.replace("-", "_") for split in splits] - -if __name__ == "__main__": - for split, task in zip(splits, task_name): - yaml_dict = {"group": f"sft_eval", "task": task, "test_split": split, "dataset_name": split} - save_path = os.path.join(dir_path, f"{split}.yaml") - if "ocr" in split and "rec" in split: - yaml_dict["include"] = "_default_sft_eval_ocr_rec_template_yaml" - else: - yaml_dict["include"] = "_default_sft_eval_rest_template_yaml" - print(f"Saving to {save_path}") - with open(save_path, "w") as f: - yaml.dump(yaml_dict, f, default_flow_style=False, sort_keys=False) - - group_dict = {"group": "sft_eval", "task": splits} - - with open(os.path.join(dir_path, "_sft_eval.yaml"), "w") as f: - yaml.dump(group_dict, f, default_flow_style=False, indent=4) diff --git a/lmms_eval/tasks/sft_eval/_sft_eval.yaml b/lmms_eval/tasks/sft_eval/_sft_eval.yaml deleted file mode 100644 index c336a4dd0..000000000 --- a/lmms_eval/tasks/sft_eval/_sft_eval.yaml +++ /dev/null @@ -1,34 +0,0 @@ -group: sft_eval -task: -- sft_activity -- sft_arts -- sft_body -- sft_car -- sft_color -- sft_commodity -- sft_count -- sft_daily -- sft_engineer -- sft_entertainment -- sft_exist -- sft_face -- sft_food -- sft_healthcare -- sft_landmark -- sft_logo -- sft_natural -- sft_ocr_qa_adv -- sft_ocr_qa_chart -- sft_ocr_qa_form -- sft_ocr_qa_scene -- sft_ocr_qa_screen -- sft_ocr_rec_adv -- sft_ocr_rec_doc -- sft_ocr_rec_handwrite -- sft_ocr_rec_markdown -- sft_ocr_rec_scene -- sft_ocr_rec_screen -- sft_place -- sft_position -- sft_sport -- sft_status diff --git a/lmms_eval/tasks/sft_eval/sft_activity.yaml b/lmms_eval/tasks/sft_eval/sft_activity.yaml deleted file mode 100644 index d8bc91b52..000000000 --- a/lmms_eval/tasks/sft_eval/sft_activity.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_activity_cn_eval -test_split: sft_activity -dataset_name: sft_activity -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_arts.yaml b/lmms_eval/tasks/sft_eval/sft_arts.yaml deleted file mode 100644 index 592b28923..000000000 --- a/lmms_eval/tasks/sft_eval/sft_arts.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_arts_cn_eval -test_split: sft_arts -dataset_name: sft_arts -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_body.yaml b/lmms_eval/tasks/sft_eval/sft_body.yaml deleted file mode 100644 index 6e0edb3fc..000000000 --- a/lmms_eval/tasks/sft_eval/sft_body.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_body_cn_eval -test_split: sft_body -dataset_name: sft_body -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_car.yaml b/lmms_eval/tasks/sft_eval/sft_car.yaml deleted file mode 100644 index e82169343..000000000 --- a/lmms_eval/tasks/sft_eval/sft_car.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_car_cn_eval -test_split: sft_car -dataset_name: sft_car -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_color.yaml b/lmms_eval/tasks/sft_eval/sft_color.yaml deleted file mode 100644 index 85f912afb..000000000 --- a/lmms_eval/tasks/sft_eval/sft_color.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_color_cn_eval -test_split: sft_color -dataset_name: sft_color -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_commodity.yaml b/lmms_eval/tasks/sft_eval/sft_commodity.yaml deleted file mode 100644 index 3c37c5e00..000000000 --- a/lmms_eval/tasks/sft_eval/sft_commodity.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_commodity_cn_eval -test_split: sft_commodity -dataset_name: sft_commodity -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_count.yaml b/lmms_eval/tasks/sft_eval/sft_count.yaml deleted file mode 100644 index b4184448b..000000000 --- a/lmms_eval/tasks/sft_eval/sft_count.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_count_cn_eval -test_split: sft_count -dataset_name: sft_count -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_daily.yaml b/lmms_eval/tasks/sft_eval/sft_daily.yaml deleted file mode 100644 index 540f657e6..000000000 --- a/lmms_eval/tasks/sft_eval/sft_daily.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_daily_cn_eval -test_split: sft_daily -dataset_name: sft_daily -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_engineer.yaml b/lmms_eval/tasks/sft_eval/sft_engineer.yaml deleted file mode 100644 index bd2532b77..000000000 --- a/lmms_eval/tasks/sft_eval/sft_engineer.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_engineer_cn_eval -test_split: sft_engineer -dataset_name: sft_engineer -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_entertainment.yaml b/lmms_eval/tasks/sft_eval/sft_entertainment.yaml deleted file mode 100644 index 04f841278..000000000 --- a/lmms_eval/tasks/sft_eval/sft_entertainment.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_entertainment_cn_eval -test_split: sft_entertainment -dataset_name: sft_entertainment -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_exist.yaml b/lmms_eval/tasks/sft_eval/sft_exist.yaml deleted file mode 100644 index b3ec83f74..000000000 --- a/lmms_eval/tasks/sft_eval/sft_exist.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_exist_cn_eval -test_split: sft_exist -dataset_name: sft_exist -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_face.yaml b/lmms_eval/tasks/sft_eval/sft_face.yaml deleted file mode 100644 index 5dd6962f2..000000000 --- a/lmms_eval/tasks/sft_eval/sft_face.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_celeb_cn_eval -test_split: sft_face -dataset_name: sft_face -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_food.yaml b/lmms_eval/tasks/sft_eval/sft_food.yaml deleted file mode 100644 index a6a3dad41..000000000 --- a/lmms_eval/tasks/sft_eval/sft_food.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_food_cn_eval -test_split: sft_food -dataset_name: sft_food -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_healthcare.yaml b/lmms_eval/tasks/sft_eval/sft_healthcare.yaml deleted file mode 100644 index c63d093a2..000000000 --- a/lmms_eval/tasks/sft_eval/sft_healthcare.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_healthcare_cn_eval -test_split: sft_healthcare -dataset_name: sft_healthcare -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_landmark.yaml b/lmms_eval/tasks/sft_eval/sft_landmark.yaml deleted file mode 100644 index 4c4c12096..000000000 --- a/lmms_eval/tasks/sft_eval/sft_landmark.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_landmark_cn_eval -test_split: sft_landmark -dataset_name: sft_landmark -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_logo.yaml b/lmms_eval/tasks/sft_eval/sft_logo.yaml deleted file mode 100644 index 35116a2d6..000000000 --- a/lmms_eval/tasks/sft_eval/sft_logo.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft-logo -test_split: sft_logo -dataset_name: sft_logo -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_natural.yaml b/lmms_eval/tasks/sft_eval/sft_natural.yaml deleted file mode 100644 index 78668e9f8..000000000 --- a/lmms_eval/tasks/sft_eval/sft_natural.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_natural_cn_eval -test_split: sft_natural -dataset_name: sft_natural -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_qa_adv.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_qa_adv.yaml deleted file mode 100644 index 0e7243ff5..000000000 --- a/lmms_eval/tasks/sft_eval/sft_ocr_qa_adv.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_ocr_ecommerceQA_cn_eval -test_split: sft_ocr_qa_adv -dataset_name: sft_ocr_qa_adv -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_qa_chart.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_qa_chart.yaml deleted file mode 100644 index 031eaa72c..000000000 --- a/lmms_eval/tasks/sft_eval/sft_ocr_qa_chart.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_ocr_chartQA_cn_eval -test_split: sft_ocr_qa_chart -dataset_name: sft_ocr_qa_chart -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_qa_form.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_qa_form.yaml deleted file mode 100644 index 18e059e8d..000000000 --- a/lmms_eval/tasks/sft_eval/sft_ocr_qa_form.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_ocr_formQA_cn_eval -test_split: sft_ocr_qa_form -dataset_name: sft_ocr_qa_form -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_qa_scene.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_qa_scene.yaml deleted file mode 100644 index 0af342d91..000000000 --- a/lmms_eval/tasks/sft_eval/sft_ocr_qa_scene.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_ocr_sceneQA_cn_eval -test_split: sft_ocr_qa_scene -dataset_name: sft_ocr_qa_scene -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_qa_screen.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_qa_screen.yaml deleted file mode 100644 index 586194a9b..000000000 --- a/lmms_eval/tasks/sft_eval/sft_ocr_qa_screen.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_ocr_screenQA_cn_eval -test_split: sft_ocr_qa_screen -dataset_name: sft_ocr_qa_screen -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_rec_adv.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_rec_adv.yaml deleted file mode 100644 index 69e116f8d..000000000 --- a/lmms_eval/tasks/sft_eval/sft_ocr_rec_adv.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_ocr_adv_cn_eval -test_split: sft_ocr_rec_adv -dataset_name: sft_ocr_rec_adv -include: _default_sft_eval_ocr_rec_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_rec_doc.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_rec_doc.yaml deleted file mode 100644 index 0d498c460..000000000 --- a/lmms_eval/tasks/sft_eval/sft_ocr_rec_doc.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_ocr_doc_cn_eval -test_split: sft_ocr_rec_doc -dataset_name: sft_ocr_rec_doc -include: _default_sft_eval_ocr_rec_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_rec_handwrite.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_rec_handwrite.yaml deleted file mode 100644 index 5eb392565..000000000 --- a/lmms_eval/tasks/sft_eval/sft_ocr_rec_handwrite.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_ocr_handwrite_cn_eval -test_split: sft_ocr_rec_handwrite -dataset_name: sft_ocr_rec_handwrite -include: _default_sft_eval_ocr_rec_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_rec_markdown.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_rec_markdown.yaml deleted file mode 100644 index 7fb340903..000000000 --- a/lmms_eval/tasks/sft_eval/sft_ocr_rec_markdown.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_ocr_markdown_cn_eval -test_split: sft_ocr_rec_markdown -dataset_name: sft_ocr_rec_markdown -include: _default_sft_eval_ocr_rec_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_rec_scene.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_rec_scene.yaml deleted file mode 100644 index 8ef843826..000000000 --- a/lmms_eval/tasks/sft_eval/sft_ocr_rec_scene.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_ocr_scene_cn_eval -test_split: sft_ocr_rec_scene -dataset_name: sft_ocr_rec_scene -include: _default_sft_eval_ocr_rec_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_ocr_rec_screen.yaml b/lmms_eval/tasks/sft_eval/sft_ocr_rec_screen.yaml deleted file mode 100644 index eba50bdb8..000000000 --- a/lmms_eval/tasks/sft_eval/sft_ocr_rec_screen.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_ocr_screen_cn_eval -test_split: sft_ocr_rec_screen -dataset_name: sft_ocr_rec_screen -include: _default_sft_eval_ocr_rec_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_place.yaml b/lmms_eval/tasks/sft_eval/sft_place.yaml deleted file mode 100644 index 1bc615b49..000000000 --- a/lmms_eval/tasks/sft_eval/sft_place.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_place_cn_eval -test_split: sft_place -dataset_name: sft_place -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_position.yaml b/lmms_eval/tasks/sft_eval/sft_position.yaml deleted file mode 100644 index ef4898184..000000000 --- a/lmms_eval/tasks/sft_eval/sft_position.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_position_cn_eval -test_split: sft_position -dataset_name: sft_position -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_sport.yaml b/lmms_eval/tasks/sft_eval/sft_sport.yaml deleted file mode 100644 index 94a6140b8..000000000 --- a/lmms_eval/tasks/sft_eval/sft_sport.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_sport_cn_eval -test_split: sft_sport -dataset_name: sft_sport -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/sft_status.yaml b/lmms_eval/tasks/sft_eval/sft_status.yaml deleted file mode 100644 index 9f28ba51b..000000000 --- a/lmms_eval/tasks/sft_eval/sft_status.yaml +++ /dev/null @@ -1,5 +0,0 @@ -group: sft_eval -task: sft_status_cn_eval -test_split: sft_status -dataset_name: sft_status -include: _default_sft_eval_rest_template_yaml diff --git a/lmms_eval/tasks/sft_eval/utils.py b/lmms_eval/tasks/sft_eval/utils.py deleted file mode 100644 index 8ed2ef0c5..000000000 --- a/lmms_eval/tasks/sft_eval/utils.py +++ /dev/null @@ -1,109 +0,0 @@ -from rapidfuzz.distance import Levenshtein - - -def _normalize_text(text): - import string - - text = "".join(filter(lambda x: x in (string.digits + string.ascii_letters), text)) - - -def process_result_ocr_rec(doc, result): - return {"edit_distance": {"gts": [gt.replace("\n", "") for gt in doc["answer"]], "predictions": result}, "edit_acc": {"gts": [gt.replace("\n", "") for gt in doc["answer"]], "predictions": result}} - - -def process_result_rest(doc, result): - return {"fuzzy_match": {"gts": [gt.replace("\n", "") for gt in doc["answer"]], "predictions": result, "question_id": doc["question_id"]}} - - -def run_editdistance(gts, predictions, ignore_space=True, is_filter=False): - eps = 1e-6 - correct_num = 0 - all_num = 0 - norm_edit_dis = 0.0 - edit_norm_score_list = list() - for idx in range(len(predictions)): - target, pred = gts[idx][0], predictions[idx] - if ignore_space: - pred = pred.replace(" ", "") - target = target.replace(" ", "") - if is_filter: - pred = _normalize_text(pred) - target = _normalize_text(target) - - ned = Levenshtein.normalized_distance(pred, target) - norm_edit_dis += ned - edit_norm_score_list.append(1 - ned) - if pred == target: - correct_num += 1 - all_num += 1 - # import pdb; pdb.set_trace() - metric = {"acc": correct_num / (all_num + eps), "norm_edit_dis": 1 - norm_edit_dis / (all_num + eps)} - return metric, edit_norm_score_list - - -def fuzzy_match_multi_answers(results, gt_dict): - acc = [] - for result in results: - question_id = result["question_id"] - try: - gt_ans = gt_dict[question_id] - except: - import pdb - - pdb.set_trace() - pred = result["text"] - for gt in gt_ans: - vqa_acc = 1 - if not ( - (gt == "是" and gt in pred and "不是" not in pred) - or (gt == "对" and gt in pred and "不对" not in pred) - or (gt == "相同" and gt in pred and "不相同" not in pred) - or (gt == "有" and gt in pred and "没有" not in pred) - or (gt == "在" and gt in pred and "不在" not in pred) - or (gt == "一样" and gt in pred and "不一样" not in pred) - or (gt not in ["是", "在", "对", "有", "一样", "相同"] and gt.lower() in pred.lower()) - ): - vqa_acc = 0 - if vqa_acc == 1: - break - acc.append(vqa_acc) - accuracy = sum(acc) / len(acc) * 100 - return {"Acc": accuracy} - - -def sft_eval_doc_to_visual(doc): - return [doc["image"].convert("RGB")] - - -def sft_eval_doc_to_text(doc): - return doc["question"] - - -def sft_eval_doc_to_text(doc, model_specific_prompt_kwargs=None): - if model_specific_prompt_kwargs is None: - model_specific_prompt_kwargs = {} - pre_prompt = model_specific_prompt_kwargs.get("pre_prompt", "") - post_prompt = model_specific_prompt_kwargs.get("post_prompt", "") - question = f"{pre_prompt}{doc['question']}{post_prompt}" - return question - - -def sft_eval_edit_dist_acc_agg(results): - predictions = [result["predictions"][0] for result in results] - gts = [result["gts"] for result in results] - acc, _ = run_editdistance(gts, predictions) - return acc["acc"] - - -def sft_eval_edit_dist_agg(results): - predictions = [result["predictions"][0] for result in results] - gts = [result["gts"] for result in results] - acc, _ = run_editdistance(gts, predictions) - return acc["norm_edit_dis"] - - -def sft_eval_acc_agg(results): - gts_dict = {result["question_id"]: result["gts"] for result in results} - predictions = [{"question_id": result["question_id"], "text": result["predictions"][0]} for result in results] - acc = fuzzy_match_multi_answers(predictions, gts_dict) - return acc["Acc"] diff --git a/example_eval.yaml b/miscs/example_eval.yaml similarity index 100% rename from example_eval.yaml rename to miscs/example_eval.yaml diff --git a/llava_repr_requirements.txt b/miscs/llava_repr_requirements.txt similarity index 100% rename from llava_repr_requirements.txt rename to miscs/llava_repr_requirements.txt diff --git a/tools/live_bench/__init__.py b/tools/live_bench/__init__.py deleted file mode 100644 index 6ff6a72ce..000000000 --- a/tools/live_bench/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from lmms_eval.live_bench.data_generator import LiveBench diff --git a/tools/live_bench/api/live_bench.py b/tools/live_bench/api/live_bench.py deleted file mode 100644 index 047a66ef9..000000000 --- a/tools/live_bench/api/live_bench.py +++ /dev/null @@ -1,20 +0,0 @@ -from lmms_eval.live_bench.websites import load_websites, load_websites_from_file -from lmms_eval.live_bench import LiveBench - - -def generate_live_bench(*, force_clear=False, screen_shoter="single_screen", qa_generator="gpt4v", scorer="gpt4v", checker="gemini", driver_kwargs={}, shoter_kwargs={}, generator_kwargs={}): - website = load_websites() - dataset = LiveBench(force_clear=force_clear) - dataset.capture(websites=website, screen_shoter=screen_shoter, qa_generator=qa_generator, scorer=scorer, checker=checker, driver_kwargs=driver_kwargs, shoter_kwargs=shoter_kwargs, generator_kwargs=generator_kwargs) - dataset.upload() - - -def generate_live_bench_from_path(path, *, force_clear=False, qa_generator="gpt4v", scorer="gpt4v", checker="gemini", driver_kwargs={}, shoter_kwargs={}, generator_kwargs={}): - website = load_websites_from_file(path) - dataset = LiveBench(force_clear=force_clear) - dataset.capture(websites=website, screen_shoter="human", qa_generator=qa_generator, scorer=scorer, checker=checker, driver_kwargs=driver_kwargs, shoter_kwargs=shoter_kwargs, generator_kwargs=generator_kwargs) - dataset.upload() - - -if __name__ == "__main__": - generate_live_bench() diff --git a/tools/live_bench/data_generator/__init__.py b/tools/live_bench/data_generator/__init__.py deleted file mode 100644 index e8b8850bd..000000000 --- a/tools/live_bench/data_generator/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from lmms_eval.live_bench.data_generator.qa_generator import get_generator, get_random_generator -from lmms_eval.live_bench.data_generator.live_bench_data import LiveBenchData -from lmms_eval.live_bench.data_generator.live_bench import LiveBench -from lmms_eval.live_bench.data_generator.response import Response diff --git a/tools/live_bench/data_generator/check_prompt.md b/tools/live_bench/data_generator/check_prompt.md deleted file mode 100644 index 08c73476b..000000000 --- a/tools/live_bench/data_generator/check_prompt.md +++ /dev/null @@ -1,11 +0,0 @@ -I would like you to act as a quizmaster who designs questions based on a provided image that would challenge adults to think critically. The image in question is a screenshot from the homepage or section of news website. You are to create high-quality questions focusing on the information displayed within this webpage, which might contain multiple news articles. Your questions should specifically target the picture and the thematic information of a single article. Your question should be answerable, and checkable. Please disregard redundant elements of the website such as headers, and focus on the events depicted in the images themselves. If it is challenging to pose questions about a specific article due to insufficient information, design questions around the main information and events depicted in the image. - -A well-crafted question about an event should allow respondents to gain deeper insights by observing and analyzing the event, paying attention to the following aspects: - -- Basic Understanding -- Contextual Analysis -- Deeper Implications -- Broader Implications -- Further Insights - -Now, you are given a screenshot of the homepage of a news website, with a already generated question and answer. Your task is to refine the question and answer, and refractor them to make the question more answerable, checkable, and challenging. If you don't think the question is good, please provide a new question and answer. diff --git a/tools/live_bench/data_generator/example/example_output.json b/tools/live_bench/data_generator/example/example_output.json deleted file mode 100644 index 3cedea005..000000000 --- a/tools/live_bench/data_generator/example/example_output.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "Basic Understanding": { - "Question": "What is the central issue discussed in the article titled \"Kidnapped by One Side, Maimed by the Other: A Teenager’s Ordeal in Congo’s 30-Year War\" and who is responsible for the information presented?", - "Answer": "The central issue discussed is the impact of a new offensive by a Rwanda-backed militia in Congo, leading to significant civilian distress. The article is authored by Gabriele Steinhauser, with photographs by Jonathan Torgovnik for The Wall Street Journal." - }, - "Contextual Analysis": { - "Question": "Analyze how the photo accompanying the article about the Congo war might influence the reader's perception of the conflict.", - "Answer": "The photograph shows a young individual, possibly the teenager mentioned in the title, in a vulnerable state which personalizes the conflict and evokes empathy. This visual representation could lead readers to feel a deeper connection to the issue, emphasizing the human cost of the conflict over political or strategic aspects." - }, - "Deeper Implications": { - "Question": "Considering the ongoing violence described in the \"New Darfur Attacks Feed Concerns Over More Large-Scale Violence\" article, what could be the broader implications for regional stability in Africa?", - "Answer": "The surge in violence in North Darfur, as noted, raises concerns about escalating conflicts that could destabilize neighboring regions and lead to wider security challenges across Africa. It might strain international relations and humanitarian resources, potentially leading to international interventions or increased refugee flows." - }, - "Comparative Analysis": { - "Question": "Compare and contrast the international reactions to the events in Congo and Darfur, as suggested by the articles. What might explain any differences in these reactions?", - "Answer": "The international reaction to Darfur’s violence involves direct warnings from U.S. officials and the U.N., suggesting a proactive stance. In contrast, the Congo situation appears to be treated as part of a longer, ongoing conflict with possibly less immediate international urgency. Differences in reactions could be influenced by geopolitical interests, media attention, and the current strategic priorities of international players." - } -} diff --git a/tools/live_bench/data_generator/example/example_website.png b/tools/live_bench/data_generator/example/example_website.png deleted file mode 100644 index 3942a7a44e6e0c2dd4093f9aa5f914b60083e944..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2228301 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

      k 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

      %P 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%0D$Nr-8Czn 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 kZ#@ZCZc5w^q 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⪼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


      W!}J6 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

      cbi&-Z|R+}A>3FQZS$yIcA@ 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

      VF__`MyxL)l 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%0DV4``XjQ&vlKY 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 z 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 z�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

      s7>mHAlt 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 N1fH&bF6*2UngFg>Z{Pp` diff --git a/tools/live_bench/data_generator/live_bench.py b/tools/live_bench/data_generator/live_bench.py deleted file mode 100644 index 4cd9da42a..000000000 --- a/tools/live_bench/data_generator/live_bench.py +++ /dev/null @@ -1,102 +0,0 @@ -import os -from typing import List -from tqdm import tqdm -from lmms_eval.live_bench.data_generator.live_bench_data import LiveBenchData -from datasets import Dataset, load_dataset -from lmms_eval.live_bench.websites import Website -from lmms_eval.live_bench.driver import load_driver -from lmms_eval.live_bench.data_generator import get_generator, get_random_generator -from lmms_eval.live_bench.screen_shoter import get_shoter -from lmms_eval.live_bench.data_generator.qa_generator import QAGenerator, QAData -from lmms_eval.live_bench.screen_shoter import ScreenImage, ScreenShoter -from lmms_eval.live_bench.data_generator.score_getter import get_score_getter, get_random_score_getter -import datasets - -from typing import List -import logging - -logger = logging.getLogger("lmms-eval") - - -def get_qa_data(images: ScreenImage, qa_generator: QAGenerator, test=False) -> List[QAData]: - response = qa_generator.generate(images, test=test) - qa_data = qa_generator.format_response(response) - return qa_data - - -def get_live_bench_data(driver, website: Website, screen_shoter: ScreenShoter, qa_generator: QAGenerator, checker: QAGenerator, test=False, scorer=None) -> List[LiveBenchData]: - images = screen_shoter.capture(driver, website) - qa_data = get_qa_data(images, qa_generator, test=test) - data = [] - for qa in qa_data: - data.append(LiveBenchData(screen=images, question=qa.question, answer=qa.answer, subtask=qa.subtask, data_generator=qa_generator.get_name(), checker=checker, scorer=scorer)) - return data - - -class LiveBench(object): - def __init__(self, path: str = "lmms-lab/LiveBench", *, name="default", split="test", cache_dir=None, remote_path=None, trust_remote_code=True, force_clear=False, **kwargs): - self.path = path - self.name = name - self.split = split - self.cache_dir = cache_dir - self.dataset_kwargs = kwargs - if remote_path is None: - self.remote_path = path - if force_clear: - self.clear() - else: - try: - self.hf_data = load_dataset(self.path, name=name, split=split, cache_dir=cache_dir, trust_remote_code=trust_remote_code, **kwargs) - except Exception as e: - logger.error(f"Error loading dataset: {e}") - self.clear() - - def clear(self): - self.hf_data = Dataset.from_dict( - {"id": [], "images": [], "website": [], "question": [], "answer": [], "subtask": [], "data_generator": [], "checker": [], "date_time": [], "screen_shoter": [], "screen_size": [], "score": [], "reason": [], "scorer_name": []}, - features=LiveBenchData.features, - ) - - def add(self, data: LiveBenchData, id: int = None): - if id is None: - id = len(self.hf_data) - organized_data = data.to_hf_dict() - organized_data["id"] = id - self.hf_data = self.hf_data.add_item(organized_data) - - def capture(self, websites: List[Website] = None, *, screen_shoter="single_screen", qa_generator=None, checker=None, driver=None, scorer=None, test=False, driver_kwargs={}, shoter_kwargs={}, generator_kwargs={}): - can_quit_driver = False - if driver is None and screen_shoter != "human": - driver = load_driver(**driver_kwargs) - can_quit_driver = True - screen_shoter = get_shoter(screen_shoter, **shoter_kwargs) - if qa_generator is not None: - qa_generator = get_generator(qa_generator, **generator_kwargs) - else: - qa_generator = get_random_generator(**generator_kwargs) - if checker is None: - checker = get_random_generator(**generator_kwargs) - else: - checker = get_generator(checker, **generator_kwargs) - if scorer is not None and isinstance(scorer, str): - scorer = get_score_getter(scorer) - elif scorer is None: - scorer = get_random_score_getter() - for website in tqdm(websites, desc="Capturing websites"): - try: - data = get_live_bench_data(driver, website, screen_shoter, qa_generator, checker, test=test, scorer=scorer) - for d in data: - self.add(d) - except Exception as e: - logger.error(f"Error capturing website: {e}") - logger.error(f"Website: {website.get_info()}") - continue - if can_quit_driver: - driver.quit() - - def upload(self, **kwargs): - self.hf_data.push_to_hub(self.remote_path, config_name=self.name, split=self.split, **kwargs) - - def save(self, path: str): - self.hf_data.save_to_disk(path) - logger.info(f"Data saved to {os.path.abspath(path)}") diff --git a/tools/live_bench/data_generator/live_bench_data.py b/tools/live_bench/data_generator/live_bench_data.py deleted file mode 100644 index f2e378c05..000000000 --- a/tools/live_bench/data_generator/live_bench_data.py +++ /dev/null @@ -1,94 +0,0 @@ -from lmms_eval.live_bench.screen_shoter.screen import ScreenImage -import datasets - - -class LiveBenchData(object): - features = datasets.Features( - { - "id": datasets.Value("int32"), - "images": datasets.Sequence(datasets.Image()), - "website": datasets.Value("string"), - "question": datasets.Value("string"), - "answer": datasets.Value("string"), - "subtask": datasets.Value("string"), - "data_generator": datasets.Value("string"), - "checker": datasets.Value("string"), - "date_time": datasets.Value("string"), - "screen_shoter": datasets.Value("string"), - "screen_size": datasets.Value("string"), - "score": datasets.Value("int32"), - "reason": datasets.Value("string"), - "scorer_name": datasets.Value("string"), - } - ) - - def __init__(self, *, screen: ScreenImage, question: str, answer: str, subtask: str, data_generator: str, score: int = None, reason: str = None, checker=None, scorer_name=None, scorer=None): - self.screen = screen - self.question = question - self.answer = answer - self.subtask = subtask - self.data_generator = data_generator - self.checker = None - if checker is not None: - response = checker.check(screen, question, answer, subtask) - if response.success: - formatted_response = checker.format_checked_response(response) - if formatted_response.question and formatted_response.answer: - self.question = formatted_response.question - self.answer = formatted_response.answer - if formatted_response.subtask: - self.subtask = formatted_response.subtask - else: - self.subtask = subtask - self.checker = checker.get_name() - if score is not None: - self.score = score - self.reason = reason - self.scorer_name = scorer_name - else: - score = scorer.get_score(question, answer, screen.images) - self.score = score.score - self.reason = score.reason - self.scorer_name = scorer.get_name() - - def to_dict(self): - images = self.screen.images - website = self.screen.website.get_info() - question = self.question - answer = self.answer - subtask = self.subtask - data_generator = self.data_generator - date_time = self.screen.capture_datetime - screen_shoter = self.screen.shoter - screen_size = self.screen.screen_size - return { - "images": images, - "website": website, - "question": question, - "answer": answer, - "subtask": subtask, - "data_generator": data_generator, - "checker": self.checker, - "date_time": date_time, - "screen_shoter": screen_shoter, - "screen_size": screen_size, - "score": self.score, - "reason": self.reason, - "scorer_name": self.scorer_name, - } - - def to_hf_dict(self): - return self.features.encode_example(self.to_dict()) - - def to_output_dict(self): - return { - "screen": self.screen.to_output_dict(), - "question": self.question, - "answer": self.answer, - "subtask": self.subtask, - "data_generator": self.data_generator, - "checker": self.checker, - "score": self.score, - "reason": self.reason, - "scorer_name": self.scorer_name, - } diff --git a/tools/live_bench/data_generator/prompt.md b/tools/live_bench/data_generator/prompt.md deleted file mode 100644 index 0b6c5c3ff..000000000 --- a/tools/live_bench/data_generator/prompt.md +++ /dev/null @@ -1,13 +0,0 @@ -I would like you to act as a quizmaster who designs questions based on a provided image that would challenge adults to think critically. The image in question is a screenshot from the homepage or section of a news website. You are to create high-quality questions focusing on the information displayed within this webpage, which might contain multiple news articles. Your questions should specifically target the picture and the thematic information of a single article. Your question should be answerable, and checkable. Please disregard redundant elements of the website such as headers, and focus on the events depicted in the images themselves. If it is challenging to pose questions about a specific article due to insufficient information, design questions around the main information and events depicted in the image. - -A well-crafted question about an event should allow respondents to gain deeper insights by observing and analyzing the event, paying attention to the following aspects: - -- Basic Understanding -- Contextual Analysis -- Deeper Implications -- Broader Implications -- Further Insights - -Consider designing a multi-round Q&A process, progressively deepening the understanding of the event’s essence. Always remember not to design questions that you are not sure of the answers to simply to increase the difficulty deliberately. - -Here are few examples about the task and the expected output format. diff --git a/tools/live_bench/data_generator/qa_generator.py b/tools/live_bench/data_generator/qa_generator.py deleted file mode 100644 index 107172f6f..000000000 --- a/tools/live_bench/data_generator/qa_generator.py +++ /dev/null @@ -1,337 +0,0 @@ -import io -import re -import os -import openai -import base64 -import json -import random -import logging -import pathlib -import textwrap -import google.generativeai as genai -from time import sleep -from PIL import Image -from typing import List -from abc import ABC, abstractmethod -from lmms_eval.live_bench.data_generator.response import Response -from lmms_eval.live_bench.screen_shoter import ScreenImage -from lmms_eval.live_bench.data_generator.utils.gpt4v import format_gpt4v_images, gpt4v_generate_response -from lmms_eval.live_bench.data_generator.utils.gemini import gemini_generate_response - -logger = logging.getLogger("lmms-eval") - - -class QAData(object): - def __init__(self, question: str = None, answer: str = None, subtask: str = None): - self.question = question - self.answer = answer - self.subtask = subtask - - def to_dict(self): - return {"question": self.question, "answer": self.answer} - - -class QAGenerator(ABC): - def __init__(self, prompt_file: str = os.path.join(os.path.dirname(__file__), "prompt.md")): - self.prompt_file = prompt_file - self.prompt = self._load_prompt() - - def _load_prompt(self): - with open(self.prompt_file, "r") as f: - return f.read() - - def __call__(self, images: ScreenImage, *args, **kwargs): - return self.generate(images, *args, **kwargs) - - def generate(self, images: ScreenImage, *, test=False, **kwargs) -> Response: - if test: - return Response(success=True, content="This is a test response.", full_log={}) - return self._generate(images, **kwargs) - - def check(self, images: ScreenImage, question, answer, subtask, *, test=False, **kwargs) -> Response: - if test: - return Response(success=True, content="This is a test response.", full_log={}) - return self._check(images, question, answer, subtask, **kwargs) - - @abstractmethod - def _generate(self, images: ScreenImage, **kwargs) -> Response: - raise NotImplementedError("_generate not implemented") - - @abstractmethod - def _check(self, images: ScreenImage, question, answer, subtask, **kwargs) -> Response: - raise NotImplementedError("_check not implemented") - - def format_response(self, response: Response) -> QAData: - if response.success: - qa_data = self._format_response(response) - if qa_data is None: - return [] - else: - return qa_data - else: - return [] - - @abstractmethod - def _format_response(self, response: Response) -> str: - raise NotImplementedError("format_response not implemented") - - @abstractmethod - def format_checked_response(self, response: Response) -> QAData: - raise NotImplementedError("format_checked_response not implemented") - - def get_name(self) -> str: - raise NotImplementedError("get_name not implemented") - - -class GeneratorRegistry: - def __init__(self): - self.generators = {} - - def register_generator(self, name): - def decorator(cls): - self.generators[name] = cls - cls.get_name = lambda self: name - return cls - - return decorator - - def get_generator(self, name) -> QAGenerator: - return self.generators[name] - - def get_random_generator(self) -> QAGenerator: - return random.choice(list(self.generators.values())) - - -generator_registry = GeneratorRegistry() - - -def register_generator(name): - return generator_registry.register_generator(name) - - -def get_generator(name, *args, **kwargs) -> QAGenerator: - return generator_registry.get_generator(name)(*args, **kwargs) - - -def get_random_generator(*args, **kwargs) -> QAGenerator: - return generator_registry.get_random_generator()(*args, **kwargs) - - -@register_generator("gpt4v") -class GPT4Generator(QAGenerator): - def __init__( - self, - prompt_file: str = os.path.join(os.path.dirname(__file__), "prompt.md"), - model="gpt-4-turbo", - example_path=os.path.join(os.path.dirname(__file__), "example"), - check_prompt=os.path.join(os.path.dirname(__file__), "check_prompt.md"), - ): - super().__init__(prompt_file) - API_KEY = os.getenv("OPENAI_API_KEY") - if not API_KEY: - raise ValueError("OPENAI_API_KEY environment variable not set.") - self.api_key = API_KEY - self.client = openai.OpenAI(api_key=self.api_key) - self.model = model - if os.path.exists(example_path): - self.example_path = example_path - else: - self.example_path = None - if os.path.exists(check_prompt): - with open(check_prompt, "r") as f: - self.check_prompt = f.read() - else: - self.check_prompt = check_prompt - - def format_messages(self, images: List[Image.Image], example_image: Image.Image, example_output: str): - example = [ - format_gpt4v_images(example_image), - { - "type": "text", - "text": example_output, - }, - ] - content = example + [format_gpt4v_images(image) for image in images] - content.append( - { - "type": "text", - "text": "Please generate high-quality questions focusing on the information displayed within this webpage. Your response should be in the format of the examples provided above and in JSON format.", - }, - ) - messages = [ - { - "role": "system", - "content": self.prompt, - }, - { - "role": "user", - "content": content, - }, - ] - return messages - - def _generate(self, images: ScreenImage, *, max_tokens=4096, max_try_times=5, **kwargs): - if self.example_path: - example_image_path = os.path.join(self.example_path, "example_website.png") - example_output_path = os.path.join(self.example_path, "example_output.json") - example_image = Image.open(example_image_path) - with open(example_output_path, "r") as f: - example_output = f.read() - - messages = self.format_messages(images.images, example_image, example_output) - - return gpt4v_generate_response(self.client, self.model, messages, max_tokens, max_try_times, **kwargs) - - def get_check_prompt(self, question: str, answer: str, subtask, images: List[Image.Image]): - messages = [ - { - "role": "system", - "content": self.check_prompt, - } - ] - content = [] - for img in images: - content.append(format_gpt4v_images(img)) - content.append( - { - "type": "text", - "text": f"Question: {question}\nQuestioner's Answer: {answer}\nSubtask: {subtask}", - }, - ) - content.append( - { - "type": "text", - "text": "Please rephrase or rewrite the high-quality question focusing on the information displayed within this webpage. Your response should be in the format of the examples provided above and in JSON format.", - }, - ) - messages.append( - { - "role": "user", - "content": content, - } - ) - return messages - - def _check(self, images: ScreenImage, question, answer, subtask, *, max_tokens=4096, max_try_times=5, **kwargs): - messages = self.get_check_prompt(question, answer, subtask, images.images) - return gpt4v_generate_response(self.client, self.model, messages, max_tokens, max_try_times, **kwargs) - - def format_checked_response(self, response: Response): - data = json.loads(response.content) - question = data.get("question", None) - answer = data.get("answer", None) - subtask = data.get("subtask", None) - return QAData(question=question, answer=answer, subtask=subtask) - - def _format_response(self, response: Response) -> List[QAData]: - try: - qa_data = [] - content = json.loads(response.content) - for subtask, message in content.items(): - subtask = subtask.lower() - message_lower = {k.lower(): v for k, v in message.items()} - try: - question = message_lower["question"] - answer = message_lower["answer"] - qa_data.append(QAData(question=question, answer=answer, subtask=subtask)) - except KeyError as e: - logger.error(f"Failed to parse response: {message}") - logger.error(f"Error: {e}") - return qa_data - except Exception as e: - logger.error(f"Failed to format response: {e}") - return [] - - -@register_generator("gemini") -class GeminiGenerator(QAGenerator): - def __init__( - self, - prompt_file: str = os.path.join(os.path.dirname(__file__), "prompt.md"), - model="gemini-pro-vision", - example_path=os.path.join(os.path.dirname(__file__), "example"), - check_prompt=os.path.join(os.path.dirname(__file__), "check_prompt.md"), - ): - super().__init__(prompt_file) - GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") - if not GOOGLE_API_KEY: - raise ValueError("GOOGLE_API_KEY environment variable not set.") - genai.configure(api_key=GOOGLE_API_KEY) - - self.api_key = GOOGLE_API_KEY - self.model = model - self.client = genai.GenerativeModel(model) - if os.path.exists(example_path): - self.example_path = example_path - else: - self.example_path = None - if os.path.exists(check_prompt): - with open(check_prompt, "r") as f: - self.check_prompt = f.read() - else: - self.check_prompt = check_prompt - - def format_messages(self, images: List[Image.Image], example_image: Image.Image, example_output: str): - content = [self.prompt, "\n", "Example Image:", example_image, "\n", "Example Output:", example_output] - content.extend(images) - content.append("Please generate high-quality questions focusing on the information displayed within this webpage. Your response should be in the format of the examples provided above and in JSON format.") - return content - - def _generate(self, images: ScreenImage, *, max_tokens=4096, max_try_times=5, **kwargs): - if self.example_path: - example_image_path = os.path.join(self.example_path, "example_website.png") - example_output_path = os.path.join(self.example_path, "example_output.json") - example_image = Image.open(example_image_path) - with open(example_output_path, "r") as f: - example_output = f.read() - - messages = self.format_messages(images.images, example_image, example_output) - - return gemini_generate_response(self.client, messages, max_tokens, max_try_times, **kwargs) - - def get_check_prompt(self, question: str, answer: str, subtask, images: List[Image.Image]): - content = [self.check_prompt] + images - content.append(f"Question: {question}\nQuestioner's Answer: {answer}\nSubtask: {subtask}") - content.append("Your response should be strictly in the below format:\n\nQuestion: \nAnswer: \nSubtask: ") - return content - - def _check(self, images: ScreenImage, question, answer, subtask, *, max_tokens=4096, max_try_times=5, **kwargs): - messages = self.get_check_prompt(question, answer, subtask, images.images) - return gemini_generate_response(self.client, messages, max_tokens, max_try_times, **kwargs) - - def format_checked_response(self, response: Response): - # Extract the question, answer, and subtask from the normalized content - question_match = re.search(r"question:\s*(.*?)\nAnswer:", response.content, re.IGNORECASE | re.DOTALL) - answer_match = re.search(r"answer:\s*(.*?)\n(Subtask:|$)", response.content, re.IGNORECASE | re.DOTALL) - subtask_match = re.search(r"subtask:\s*(.*)", response.content, re.IGNORECASE) - - question = answer = subtask = None - - if question_match: - # Extract the matched groups - question = question_match.group(1).strip() - if answer_match: - answer = answer_match.group(1).strip() - if subtask_match: - subtask = subtask_match.group(1).strip() - - return QAData(question=question, answer=answer, subtask=subtask) - - def _format_response(self, response: Response) -> List[QAData]: - try: - qa_data = [] - content = json.loads(response.content) - for subtask, message in content.items(): - subtask = subtask.lower() - message_lower = {k.lower(): v for k, v in message.items()} - try: - question = message_lower["question"] - answer = message_lower["answer"] - qa_data.append(QAData(question=question, answer=answer, subtask=subtask)) - except KeyError as e: - logger.error(f"Failed to parse response: {message}") - logger.error(f"Error: {e}") - return qa_data - except Exception as e: - logger.error(f"Failed to format response: {e}") - return [] diff --git a/tools/live_bench/data_generator/response.py b/tools/live_bench/data_generator/response.py deleted file mode 100644 index 5106b70a2..000000000 --- a/tools/live_bench/data_generator/response.py +++ /dev/null @@ -1,5 +0,0 @@ -class Response(object): - def __init__(self, success: bool, content: str, full_log: dict): - self.success = success - self.content = content - self.full_log = full_log diff --git a/tools/live_bench/data_generator/score_getter.py b/tools/live_bench/data_generator/score_getter.py deleted file mode 100644 index 990fc3066..000000000 --- a/tools/live_bench/data_generator/score_getter.py +++ /dev/null @@ -1,157 +0,0 @@ -import os -import json -import random -import openai -import anthropic -from abc import ABC, abstractmethod -from typing import List -from PIL import Image -from lmms_eval.live_bench.screen_shoter import ScreenImage -from lmms_eval.live_bench.data_generator.qa_generator import Response -from lmms_eval.live_bench.data_generator.utils.gpt4v import format_gpt4v_images, gpt4v_generate_response -from lmms_eval.live_bench.data_generator.utils.claude import format_claude_images, claude_generate_response - - -class Score(object): - def __init__(self, score: int, reason: str): - self.score = score - self.reason = reason - - -class ScoreGetter(ABC): - def get_name(self): - return self.name - - @abstractmethod - def get_score(self, question: str, answer: str, images: ScreenImage): - raise NotImplementedError("get_score not implemented") - - def __call__(self, question: str, answer: str, images: ScreenImage, **kwargs): - return self.get_score(question, answer, images, **kwargs) - - -class ScoreGetterRegistry: - def __init__(self): - self.score_getters = {} - - def register_score_getter(self, name): - def decorator(cls): - self.score_getters[name] = cls - cls.name = name - return cls - - return decorator - - def get_score_getter(self, name) -> ScoreGetter: - return self.score_getters[name] - - def get_random_score_getter(self) -> ScoreGetter: - return random.choice(list(self.score_getters.values())) - - -generator_registry = ScoreGetterRegistry() - - -def register_score_getter(name): - return generator_registry.register_score_getter(name) - - -def get_score_getter(name, *args, **kwargs) -> ScoreGetter: - return generator_registry.get_score_getter(name)(*args, **kwargs) - - -def get_random_score_getter(*args, **kwargs) -> ScoreGetter: - return generator_registry.get_random_score_getter()(*args, **kwargs) - - -@register_score_getter("gpt4v") -class GPT4VScoreGetter(ScoreGetter): - def __init__(self, prompt: str = os.path.join(os.path.dirname(__file__), "score_prompt.md"), model="gpt-4-turbo", example_path=os.path.join(os.path.dirname(__file__), "example")): - super().__init__() - if os.path.exists(prompt): - with open(prompt, "r") as f: - self.prompt = f.read() - else: - self.prompt = prompt - API_KEY = os.getenv("OPENAI_API_KEY") - if not API_KEY: - raise ValueError("OPENAI_API_KEY environment variable not set.") - self.api_key = API_KEY - self.client = openai.OpenAI(api_key=self.api_key) - self.model = model - if os.path.exists(example_path) and os.path.isfile(os.path.join(example_path, "example_score_input.md")): - with open(example_path, "r") as f: - self.example = f.read() - else: - self.example = None - - def _format_prompt(self, question: str, answer: str, images: List[Image.Image]): - prompt = [{"role": "system", "content": self.prompt}] - messages = [] - for image in images: - messages.append(format_gpt4v_images(image)) - messages.append({"type": "text", "text": f"Question: {question}\nQuestioner's Answer: {answer}"}) - messages.append({"type": "text", "text": 'You should format you answer into json format like this: {"score": 10, "reason": "some reason"}'}) - prompt.append({"role": "user", "content": messages}) - return prompt - - def get_score(self, question: str, answer: str, images: ScreenImage, *, max_tokens=4096, max_try_times=5, **kwargs) -> Score: - prompt = self._format_prompt(question, answer, images) - try: - response = gpt4v_generate_response(self.client, self.model, prompt, max_tokens, max_try_times, **kwargs) - if response.success: - content = json.loads(response.content) - score = content.get("score", None) - reason = content.get("reason", None) - return Score(score=score, reason=reason) - else: - return Score(score=None, reason=response.content) - except Exception as e: - return Score(score=None, reason=str(e)) - - -@register_score_getter("claude") -class ClaudeScoreGetter(ScoreGetter): - def __init__(self, prompt: str = os.path.join(os.path.dirname(__file__), "score_prompt.md"), model="claude-3-opus-20240229", example_path=os.path.join(os.path.dirname(__file__), "example")): - super().__init__() - if os.path.exists(prompt): - with open(prompt, "r") as f: - self.prompt = f.read() - else: - self.prompt = prompt - API_KEY = os.getenv("ANTHROPIC_API_KEY") - if not API_KEY: - raise ValueError("ANTHROPIC_API_KEY environment variable not set.") - self.api_key = API_KEY - self.client = anthropic.Anthropic(api_key=self.api_key) - self.model = model - if os.path.exists(example_path) and os.path.isfile(os.path.join(example_path, "example_score_input.md")): - with open(example_path, "r") as f: - self.example = f.read() - else: - self.example = None - - def _format_prompt(self, question: str, answer: str, images: List[Image.Image]): - # prompt = [{"role": "system", "content": self.prompt}] - prompt = [] - messages = [] - for image in images: - messages.append(format_claude_images(image)) - messages.append({"type": "text", "text": f"Question: {question}\nQuestioner's Answer: {answer}"}) - messages.append({"type": "text", "text": 'You should format you answer into json format like this: {"score": 10, "reason": "some reason"}'}) - prompt.append({"role": "user", "content": messages}) - return prompt - - def get_score(self, question: str, answer: str, images: ScreenImage, *, max_tokens=4096, max_try_times=5, **kwargs) -> Score: - prompt = self._format_prompt(question, answer, images) - try: - response = claude_generate_response(self.client, self.model, prompt, self.prompt, max_tokens, max_try_times, **kwargs) - if response.success: - content = json.loads(response.content) - score = content.get("score", None) - reason = content.get("reason", None) - return Score(score=score, reason=reason) - else: - return Score(score=None, reason=response.content) - except Exception as e: - return Score(score=None, reason=str(e)) diff --git a/tools/live_bench/data_generator/score_prompt.md b/tools/live_bench/data_generator/score_prompt.md deleted file mode 100644 index 3940863e4..000000000 --- a/tools/live_bench/data_generator/score_prompt.md +++ /dev/null @@ -1 +0,0 @@ -Based on the multi-round Q&A regarding to the image, please evaluate each question and answer from the multi-round Q&A based on the image for their authenticity (whether the information can be directly obtained from the image or reasonably inferred) and logical coherence. For each Q&A pair, provide a rating from 1 to 10, where 1 indicates very poor and 10 indicates excellent. Additionally, please provide a brief explanation for each rating. diff --git a/tools/live_bench/data_generator/utils/__init__.py b/tools/live_bench/data_generator/utils/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tools/live_bench/data_generator/utils/claude.py b/tools/live_bench/data_generator/utils/claude.py deleted file mode 100644 index c33f81db4..000000000 --- a/tools/live_bench/data_generator/utils/claude.py +++ /dev/null @@ -1,42 +0,0 @@ -from PIL import Image -import io -import base64 -from lmms_eval.live_bench.data_generator.response import Response -import logging -from time import sleep - -logger = logging.getLogger("lmms-eval") - - -def format_claude_images(image: Image.Image): - buffered = io.BytesIO() - image.save(buffered, format="PNG") - img_str = base64.b64encode(buffered.getvalue()).decode("utf-8") - return { - "type": "image", - "source": { - "type": "base64", - "media_type": "image/png", - "data": img_str, - }, - } - - -def claude_generate_response(client, model, messages, system, max_tokens: int, max_try_times, **kwargs): - messages.append({"role": "assistant", "content": "{"}) - - def _generate(): - return client.messages.create(model=model, messages=messages, max_tokens=max_tokens, system=system, **kwargs) - - for times in range(max_try_times): - try: - response = _generate() - return Response(success=True, content="{" + response.content[0].text, full_log={"input": messages, "output": response}) - except Exception as e: - logger.error(f"Failed to generate response: {e}") - if times < max_try_times - 1: - logger.info(f"Retrying... ({times+1}/{max_try_times})") - sleep(3) - else: - logger.error("Failed to generate response after retrying.") - return Response(success=False, content=str(e), full_log={"input": messages, "output": None}) diff --git a/tools/live_bench/data_generator/utils/gemini.py b/tools/live_bench/data_generator/utils/gemini.py deleted file mode 100644 index 2e425826a..000000000 --- a/tools/live_bench/data_generator/utils/gemini.py +++ /dev/null @@ -1,26 +0,0 @@ -import google.generativeai as genai -from time import sleep -from lmms_eval.live_bench.data_generator.response import Response -import logging - -logger = logging.getLogger("lmms-eval") - - -def gemini_generate_response(client: genai.GenerativeModel, messages, max_tokens: int, max_try_times, **kwargs): - generation_config = genai.GenerationConfig(max_output_tokens=max_tokens) - - def _generate(): - return client.generate_content(messages, generation_config=generation_config, **kwargs) - - for times in range(max_try_times): - try: - response = _generate() - return Response(success=True, content=response.text, full_log={"input": messages, "output": response}) - except Exception as e: - logger.error(f"Failed to generate response: {e}") - if times < max_try_times - 1: - logger.info(f"Retrying... ({times+1}/{max_try_times})") - sleep(3) - else: - logger.error("Failed to generate response after retrying.") - return Response(success=False, content=str(e), full_log={"input": messages, "output": None}) diff --git a/tools/live_bench/data_generator/utils/gpt4v.py b/tools/live_bench/data_generator/utils/gpt4v.py deleted file mode 100644 index 4b4c1cd84..000000000 --- a/tools/live_bench/data_generator/utils/gpt4v.py +++ /dev/null @@ -1,38 +0,0 @@ -from PIL import Image -import io -import base64 -from lmms_eval.live_bench.data_generator.response import Response -import logging -from time import sleep - -logger = logging.getLogger("lmms-eval") - - -def format_gpt4v_images(image: Image.Image): - buffered = io.BytesIO() - image.save(buffered, format="PNG") - img_str = base64.b64encode(buffered.getvalue()).decode("utf-8") - return { - "type": "image_url", - "image_url": { - "url": f"data:image/png;base64,{img_str}", - }, - } - - -def gpt4v_generate_response(client, model, messages, max_tokens: int, max_try_times, **kwargs): - def _generate(): - return client.chat.completions.create(model=model, messages=messages, max_tokens=max_tokens, response_format={"type": "json_object"}, **kwargs) - - for times in range(max_try_times): - try: - response = _generate() - return Response(success=True, content=response.choices[0].message.content, full_log={"input": messages, "output": response}) - except Exception as e: - logger.error(f"Failed to generate response: {e}") - if times < max_try_times - 1: - logger.info(f"Retrying... ({times+1}/{max_try_times})") - sleep(3) - else: - logger.error("Failed to generate response after retrying.") - return Response(success=False, content=str(e), full_log={"input": messages, "output": None}) diff --git a/tools/live_bench/driver/.gitignore b/tools/live_bench/driver/.gitignore deleted file mode 100644 index 0ef18421a..000000000 --- a/tools/live_bench/driver/.gitignore +++ /dev/null @@ -1 +0,0 @@ -extensions/ diff --git a/tools/live_bench/driver/__init__.py b/tools/live_bench/driver/__init__.py deleted file mode 100644 index a1565d0b8..000000000 --- a/tools/live_bench/driver/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from lmms_eval.live_bench.driver.load_driver import load_driver diff --git a/tools/live_bench/driver/load_driver.py b/tools/live_bench/driver/load_driver.py deleted file mode 100644 index e8b1702bd..000000000 --- a/tools/live_bench/driver/load_driver.py +++ /dev/null @@ -1,51 +0,0 @@ -import os -import zipfile -import requests -from selenium import webdriver -from webdriver_manager.chrome import ChromeDriverManager -from selenium.webdriver.chrome.options import Options - -import undetected_chromedriver as uc - - -def load_driver( - window_size="auto", headless=True, driver="undetected_chromedriver", adblock=True, adblock_version="6.0.2-mv3", extension_cache_dir=os.path.join(os.path.dirname(__file__), "extensions"), *, service=None, additional_options=None -): - options = Options() - if headless: - options.add_argument("--headless") - if adblock: - try: - adblock_url = f"https://code.getadblock.com/releases/adblockchrome-{adblock_version}.zip" - adblock_path = os.path.join(extension_cache_dir, f"adblockchrome-{adblock_version}") - if not os.path.isdir(adblock_path): - os.makedirs(os.path.join(adblock_path, ".."), exist_ok=True) - # Download the adblock zip file - response = requests.get(adblock_url) - with open(f"{adblock_path}.zip", "wb") as file: - file.write(response.content) - # Unzip the downloaded file - with zipfile.ZipFile(f"{adblock_path}.zip", "r") as zip_ref: - zip_ref.extractall(adblock_path) - # Remove the zip file after extraction - os.remove(f"{adblock_path}.zip") - options.add_argument(f"--load-extension={os.path.abspath(adblock_path)}") - except Exception as e: - print(f"Error loading adblock extension: {e}") - if driver == "undetected_chromedriver": - driver = uc.Chrome(headless=headless, options=options) - if window_size != "auto": - driver.set_window_size(*window_size) - return driver - elif driver == "chrome": - options = Options() - if additional_options is not None: - for option in additional_options: - options.add_argument(option) - if service is None: - service = ChromeDriverManager().install() - service = webdriver.chrome.service.Service(service) - driver = webdriver.Chrome(service=service, options=options) - if window_size != "auto": - driver.set_window_size(*window_size) - return driver diff --git a/tools/live_bench/example.ipynb b/tools/live_bench/example.ipynb deleted file mode 100644 index 01f648902..000000000 --- a/tools/live_bench/example.ipynb +++ /dev/null @@ -1,103 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from random import sample\n", - "\n", - "from lmms_eval.live_bench.websites.website import DefaultWebsite\n", - "from lmms_eval.live_bench.websites import load_websites\n", - "\n", - "# website = load_websites()\n", - "# website = sample(website, 1)\n", - "# website[0].url\n", - "website = [DefaultWebsite(url=\"https://www.bbc.com/\")] # , DefaultWebsite(url=\"https://www.bbc.com/sport\"), DefaultWebsite(url=\"https://www.bbc.com/business\")]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from lmms_eval.live_bench import LiveBench" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dataset = LiveBench(force_clear=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dataset.capture(websites=website, driver_kwargs={\"headless\": True}, screen_shoter=\"single_screen\", shoter_kwargs={\"screen_size\": (1024, 1024)}, qa_generator=\"gpt4v\", scorer=\"gpt4v\", checker=\"gemini\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dataset.hf_data[0][\"images\"][0].save(\"img.png\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dataset" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dataset.upload()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "lmms-eval", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/tools/live_bench/screen_shoter/__init__.py b/tools/live_bench/screen_shoter/__init__.py deleted file mode 100644 index 6e596c7d9..000000000 --- a/tools/live_bench/screen_shoter/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from lmms_eval.live_bench.screen_shoter.screen_shoter import ScreenShoter, register_shoter, get_shoter -from lmms_eval.live_bench.screen_shoter.screen import ScreenImage diff --git a/tools/live_bench/screen_shoter/screen.py b/tools/live_bench/screen_shoter/screen.py deleted file mode 100644 index e8610ce4e..000000000 --- a/tools/live_bench/screen_shoter/screen.py +++ /dev/null @@ -1,30 +0,0 @@ -import io -import base64 - -from PIL import Image -from typing import List, Tuple - -from lmms_eval.live_bench.websites import Website - - -def image_to_base64(image: Image.Image) -> str: - buffered = io.BytesIO() - image.save(buffered, format="PNG") - return base64.b64encode(buffered.getvalue()).decode("utf-8") - - -class ScreenImage(object): - def __init__(self, images: List[Image.Image], website: Website, shoter: str, screen_size: Tuple[int, int], capture_datetime: str): - self.images = images - self.website = website - self.shoter = shoter - self.screen_size = screen_size - self.capture_datetime = capture_datetime - - def to_dict(self): - return {"images": self.images, "website": self.website.get_info(), "shoter": self.shoter, "screen_size": self.screen_size, "capture_datetime": self.capture_datetime} - - def to_output_dict(self): - output = self.to_dict() - output["images"] = [image_to_base64(image) for image in self.images] - return output diff --git a/tools/live_bench/screen_shoter/screen_shoter.py b/tools/live_bench/screen_shoter/screen_shoter.py deleted file mode 100644 index 45a4c9beb..000000000 --- a/tools/live_bench/screen_shoter/screen_shoter.py +++ /dev/null @@ -1,141 +0,0 @@ -from selenium import webdriver -from PIL import Image -from lmms_eval.live_bench.websites import Website -from lmms_eval.live_bench.screen_shoter.screen import ScreenImage -from typing import List -from abc import ABC, abstractmethod -from datetime import datetime -from PIL import Image -import os -import io -import logging - -logger = logging.getLogger("lmms-eval") - - -class ScreenShoter(ABC): - def __init__(self, screen_size=(1024, 1024)): - self.screen_size = screen_size - - def capture(self, driver: webdriver.Chrome, website: Website) -> ScreenImage: - if driver is not None: - website.visit(driver) - if self.screen_size != "auto": - driver.set_window_size(self.screen_size[0], self.screen_size[1]) - else: - driver.set_window_size(1024, 1024) - page_width = driver.execute_script("return document.body.scrollWidth") - driver.set_window_size(page_width, 1024) - # print("Screen size:", driver.get_window_size()) - images = self.get_screenshot(driver) - return ScreenImage(images, website, self.get_name(), self.screen_size, datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - - def __call__(self, driver: webdriver.Chrome, website: Website) -> List[Image.Image]: - return self.capture(driver, website) - - def get_name(self) -> str: - raise NotImplementedError("get_name not implemented") - - @abstractmethod - def get_screenshot(self, driver: webdriver.Chrome) -> List[Image.Image]: - pass - - -class ScreenShoterRegistry: - def __init__(self): - self.shoters = {} - - def register_shoter(self, name): - def decorator(cls): - self.shoters[name] = cls - cls.get_name = lambda self: name - return cls - - return decorator - - def get_shoter(self, name) -> ScreenShoter: - return self.shoters[name] - - -shoter_registry = ScreenShoterRegistry() - - -def register_shoter(name): - return shoter_registry.register_shoter(name) - - -def get_shoter(name, *args, **kwargs) -> ScreenShoter: - return shoter_registry.get_shoter(name)(*args, **kwargs) - - -@register_shoter("human") -class HumanScreenShoter(ScreenShoter): - def __init__(self, screen_size=None): - super().__init__(screen_size) - - def capture(self, driver: webdriver.Chrome, website: Website) -> ScreenImage: - path = website.get_path() - images = [] - - def get_image(path): - try: - with open(path, "rb") as f: - image_data = f.read() - image = Image.open(io.BytesIO(image_data)) - images.append(image) - except Exception as e: - logger.error(f"Error loading image {path}: {e}") - - if os.path.isdir(path): - for root, dirs, files in os.walk(path): - for file_name in files: - get_image(os.path.join(root, file_name)) - else: - try: - get_image(path) - except Exception as e: - logger.error(f"Error loading image {path}: {e}") - if not images: - raise ValueError(f"No images found in {path}") - return ScreenImage(images, website, self.get_name(), self.screen_size, datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - - def get_screenshot(self, driver: webdriver.Chrome) -> List[Image.Image]: - return [] - - -@register_shoter("single_screen") -class SingleScreenShoter(ScreenShoter): - def __init__(self, screen_size=(1024, 1024)): - super().__init__(screen_size) - - def get_screenshot(self, driver: webdriver.Chrome) -> List[Image.Image]: - screenshot = driver.get_screenshot_as_png() - return [Image.open(io.BytesIO(screenshot))] - - -@register_shoter("rolling_screen") -class RollingScreenShoter(ScreenShoter): - def __init__(self, screen_size=(1024, 1024)): - super().__init__(screen_size) - - def get_screenshot(self, driver: webdriver.Chrome) -> List[Image.Image]: - screenshots = [] - # Scroll to the top of the page before taking the first screenshot - driver.execute_script("window.scrollTo(0, 0)") - # Get the total height of the web page - total_height = driver.execute_script("return document.body.parentNode.scrollHeight") - # Get the viewport height - viewport_height = driver.execute_script("return window.innerHeight") - # Initialize the current scroll position - current_scroll_position = 0 - - # Scroll through the page and take screenshots - while current_scroll_position < total_height: - # Take screenshot and append to the list - screenshot = driver.get_screenshot_as_png() - screenshots.append(Image.open(io.BytesIO(screenshot))) - # Scroll down by the viewport height - current_scroll_position += viewport_height - driver.execute_script(f"window.scrollTo(0, {current_scroll_position})") - - return screenshots diff --git a/tools/live_bench/websites/__init__.py b/tools/live_bench/websites/__init__.py deleted file mode 100644 index 721a374f9..000000000 --- a/tools/live_bench/websites/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from lmms_eval.live_bench.websites.load_website import load_websites, load_websites_from_file -from lmms_eval.live_bench.websites.website import Website diff --git a/tools/live_bench/websites/load_website.py b/tools/live_bench/websites/load_website.py deleted file mode 100644 index 56b963570..000000000 --- a/tools/live_bench/websites/load_website.py +++ /dev/null @@ -1,34 +0,0 @@ -import yaml -import os -from random import sample -from lmms_eval.live_bench.websites.website import Website, DefaultWebsite, HumanScreenShotWebsite - - -def get_website(website_dict): - if "website_class" not in website_dict: - website_class = DefaultWebsite - else: - website_class = website_dict["website_class"] - url = website_dict["url"] - if "args" in website_dict: - return website_class(url, **website_dict["args"]) - else: - return website_class(url) - - -def load_websites(num_sample: int = -1): - website_list_path = os.path.join(os.path.dirname(__file__), "website_list.yaml") - with open(website_list_path, "r") as f: - website_list = yaml.full_load(f)["websites"] - if num_sample > 0: - website_list = sample(website_list, num_sample) - return [get_website(website_dict) for website_dict in website_list] - - -def load_websites_from_file(file_path): - names = os.listdir(file_path) - websites = [] - for name in names: - path = os.path.join(file_path, name) - websites.append(HumanScreenShotWebsite(path=path, name=name)) - return websites diff --git a/tools/live_bench/websites/website.py b/tools/live_bench/websites/website.py deleted file mode 100644 index 327bad372..000000000 --- a/tools/live_bench/websites/website.py +++ /dev/null @@ -1,62 +0,0 @@ -import time -import os - -from webdriver_manager.core.driver import Driver -from abc import ABC, abstractmethod - - -class Website(ABC): - def __init__(self, url=None, name=None, path=None): - self.url = url - self.name = name - self.path = path - assert self.url is not None or self.path is not None, "Either url or path must be provided" - - def get_path(self): - if self.url: - return self.url - else: - return self.path - - def visit(self, driver: Driver): - self.pre_visit(driver) - driver.get(self.url) - self.post_visit(driver) - - def get_info(self): - info = {} - if self.url: - info["url"] = self.url - if self.name: - info["name"] = self.name - return info - - @abstractmethod - def pre_visit(self, driver: Driver): - raise NotImplementedError("pre_action not implemented") - - @abstractmethod - def post_visit(self, driver: Driver): - raise NotImplementedError("post_action not implemented") - - -class DefaultWebsite(Website): - def __init__(self, url, name=None): - super().__init__(url, name) - - def pre_visit(self, driver: Driver): - pass - - def post_visit(self, driver: Driver): - time.sleep(5) # Wait for 5 seconds to allow adblock to finish - - -class HumanScreenShotWebsite(Website): - def __init__(self, name=None, path=None): - super().__init__(name=name, path=path) - - def pre_visit(self, driver: Driver): - pass - - def post_visit(self, driver: Driver): - pass diff --git a/tools/live_bench/websites/website_list.yaml b/tools/live_bench/websites/website_list.yaml deleted file mode 100644 index 4c7b348a0..000000000 --- a/tools/live_bench/websites/website_list.yaml +++ /dev/null @@ -1,77 +0,0 @@ -websites: -- url: https://www.bbc.com/ - # can add below line to specify the class to use for this website - # website_class: !constructor website.DefaultWebsite - # can add args tag to specify the arguments to pass to the class constructor - # args: - # arg1: value1 - # arg2: value2 -- url: https://www.bbc.com/news -- url: https://www.bbc.com/sport -- url: https://www.bbc.com/business -- url: https://www.bbc.com/innovation -- url: https://www.bbc.com/culture -- url: https://www.bbc.com/travel -- url: https://www.bbc.com/future-planet -# - url: https://edition.cnn.com/ -# - url: https://edition.cnn.com/politics -# - url: https://edition.cnn.com/entertainment -# - url: https://edition.cnn.com/style -# - url: https://www.bloomberg.com/economics -# - url: https://www.bloomberg.com/industries -# - url: https://www.bloomberg.com/technology -# - url: https://www.bloomberg.com/politics -# - url: https://www.bloomberg.com/opinion -# - url: https://www.wsj.com/ -# - url: https://www.wsj.com/world/africa?mod=nav_top_subsection -# - url: https://www.wsj.com/world/americas?mod=nav_top_subsection -# - url: https://www.wsj.com/world/asia?mod=nav_top_subsection -# - url: https://www.wsj.com/world/china?mod=nav_top_subsection -# - url: https://www.wsj.com/world/europe?mod=nav_top_subsection -# - url: https://www.wsj.com/world/middle-east?mod=nav_top_subsection -# - url: https://www.wsj.com/world/india?mod=nav_top_subsection -# - url: https://www.wsj.com/world/oceania?mod=nav_top_subsection -# - url: https://www.wsj.com/world/russia?mod=nav_top_subsection -# - url: https://www.wsj.com/world/uk?mod=nav_top_subsection -# - url: https://www.wsj.com/science?mod=nav_top_subsection -# - url: https://www.wsj.com/science/archaeology?mod=nav_top_subsection -# - url: https://www.wsj.com/science/biology?mod=nav_top_subsection -# - url: https://www.wsj.com/science/environment?mod=nav_top_subsection -# - url: https://www.wsj.com/science/physics?mod=nav_top_subsection -# - url: https://www.wsj.com/science/space-astronomy?mod=nav_top_subsection -# - url: https://www.wsj.com/economy/central-banking?mod=nav_top_subsection -# - url: https://www.wsj.com/economy/consumers?mod=nav_top_subsection -# - url: https://www.wsj.com/economy/housing?mod=nav_top_subsection -# - url: https://www.wsj.com/economy/jobs?mod=nav_top_subsection -# - url: https://www.wsj.com/economy/trade?mod=nav_top_subsection -# - url: https://www.wsj.com/economy/global -# - url: https://www.wsj.com/tech/ai?mod=nav_top_subsection -# - url: https://www.wsj.com/tech/biotech -# - url: https://www.wsj.com/tech/cybersecurity?mod=nav_top_subsection -# - url: https://www.wsj.com/tech/personal-tech?mod=nav_top_subsection -# - url: https://www.reuters.com/ -# - url: https://www.reuters.com/business/aerospace-defense/ -# - url: https://www.reuters.com/business/autos-transportation/ -# - url: https://www.reuters.com/business/davos/ -# - url: https://www.reuters.com/business/energy/ -# - url: https://www.reuters.com/business/environment/ -# - url: https://www.reuters.com/business/finance/ -# - url: https://www.reuters.com/business/healthcare-pharmaceuticals/ -# - url: https://www.reuters.com/business/media-telecom/ -# - url: https://www.reuters.com/business/retail-consumer/ -# - url: https://www.reuters.com/business/future-of-health/ -# - url: https://www.reuters.com/business/future-of-money/ -# - url: https://www.reuters.com/business/take-five/ -# - url: https://www.reuters.com/business/world-at-work/ -# - url: https://www.reuters.com/breakingviews/ -# - url: https://www.reuters.com/technology/ -# - url: https://www.reuters.com/technology/cybersecurity/ -# - url: https://www.reuters.com/technology/space/ -# - url: https://www.reuters.com/technology/disrupted/ -# - url: https://www.reuters.com/technology/reuters-momentum/ -# - url: https://www.reuters.com/investigations/ -# - url: https://a16z.com/news-content/#latest -# - url: https://news.ycombinator.com/ -# - url: https://www.reddit.com/?rdt=48006 -# - url: https://news.crunchbase.com/ -- url: https://www.cctv.com/ From c9b2252fb8a15dd04252af5e6b4613855afd6ada Mon Sep 17 00:00:00 2001 From: Bo Li Date: Wed, 12 Jun 2024 15:33:48 +0000 Subject: [PATCH 176/181] Bump version to 0.2.0.dev0 --- README.md | 317 ++++++++++++++---------------------------- docs/current_tasks.md | 122 ++++++++++++++++ pyproject.toml | 2 +- 3 files changed, 228 insertions(+), 213 deletions(-) create mode 100644 docs/current_tasks.md diff --git a/README.md b/README.md index 415ea5c74..a4cc11e23 100755 --- a/README.md +++ b/README.md @@ -9,76 +9,23 @@ 🏠 [LMMs-Lab Homepage](https://lmms-lab.github.io/) | 🎉 [Blog](https://lmms-lab.github.io/lmms-eval-blog/lmms-eval-0.1/) | 📚 [Documentation](docs/README.md) | 🤗 [Huggingface Datasets](https://huggingface.co/lmms-lab) | Discord_Thread [discord/lmms-eval](https://discord.gg/zdkwKUqrPy) -In today's world, we're on an exciting journey toward creating Artificial General Intelligence (AGI), much like the enthusiasm of the 1960s moon landing. This journey is powered by advanced large language models (LLMs) and large multimodal models (LMMs), which are complex systems capable of understanding, learning, and performing a wide variety of human tasks. - -To gauge how advanced these models are, we use a variety of evaluation benchmarks. These benchmarks are tools that help us understand the capabilities of these models, showing us how close we are to achieving AGI. However, finding and using these benchmarks is a big challenge. The necessary benchmarks and datasets are spread out and hidden in various places like Google Drive, Dropbox, and different school and research lab websites. It feels like we're on a treasure hunt, but the maps are scattered everywhere. - -In the field of language models, there has been a valuable precedent set by the work of [lm-evaluation-harness](https://github.com/EleutherAI/lm-evaluation-harness). They offer integrated data and model interfaces, enabling rapid evaluation of language models and serving as the backend support framework for the [open-llm-leaderboard](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard), and has gradually become the underlying ecosystem of the era of foundation models. - -However, though there are many new evaluation datasets are recently proposed, the efficient evaluation pipeline of LMM is still in its infancy, and there is no unified evaluation framework that can be used to evaluate LMM across a wide range of datasets. To address this challenge, we introduce **lmms-eval**, an evaluation framework meticulously crafted for consistent and efficient evaluation of LMM. - -We humbly obsorbed the exquisite and efficient design of [lm-evaluation-harness](https://github.com/EleutherAI/lm-evaluation-harness). Building upon its foundation, we implemented our `lmms-eval` framework with performance optimizations specifically for LMMs. - -## Necessity of lmms-eval - -We believe our effort could provide an efficient interface for the detailed comparison of publicly available models to discern their strengths and weaknesses. It's also useful for research institutions and production-oriented companies to accelerate the development of large multimodal models. With the `lmms-eval`, we have significantly accelerated the lifecycle of model iteration. Inside the LLaVA team, the utilization of `lmms-eval` largely improves the efficiency of the model development cycle, as we are able to evaluate weekly trained hundreds of checkpoints on 20-30 datasets, identifying the strengths and weaknesses, and then make targeted improvements. - # Annoucement -## Contribution Guidance - -We've added guidance on contributing new datasets and models. Please refer to our [documentation](docs/README.md). If you need assistance, you can contact us via [discord/lmms-eval](https://discord.gg/ebAMGSsS). - -## v0.1.0 Released - -The first version of the `lmms-eval` is released. We are working on providing an one-command evaluation suite for accelerating the development of LMMs. - -> In [LLaVA Next](https://llava-vl.github.io/blog/2024-01-30-llava-next/) development, we internally utilize this suite to evaluate the multiple different model versions on various datasets. It significantly accelerates the model development cycle for it's easy integration and fast evaluation speed. - -The main feature includes: - -

      - -

      - -### One-command evaluation, with detailed logs and samples. -You can evaluate the models on multiple datasets with a single command. No model/data preparation is needed, just one command line, few minutes, and get the results. Not just a result number, but also the detailed logs and samples, including the model args, input question, model response, and ground truth answer. - -```python -# Evaluating LLaVA on multiple datasets -accelerate launch --num_processes=8 -m lmms_eval --model llava --model_args pretrained="liuhaotian/llava-v1.5-7b" --tasks mme,mmbench_en --batch_size 1 --log_samples --log_samples_suffix llava_v1.5_mme_mmbenchen --output_path ./logs/ # -``` - -### Accelerator support and Tasks grouping. -We support the usage of `accelerate` to wrap the model for distributed evaluation, supporting multi-gpu and tensor parallelism. With **Task Grouping**, all instances from all tasks are grouped and evaluated in parallel, which significantly improves the throughput of the evaluation. After evaluation, all instances are sent to postprocessing module for metric calcuations and potential GPT4-eval queries. - -Below are the total runtime on different datasets using 4 x A100 40G. +- [2024-06] The `lmms-eval/v0.2` has been upgraded to support video evaluations, and other feature updates. Please refer to the [blog](https://lmms-lab.github.io/posts/lmms-eval-0.2/) for more details -| Dataset (#num) | LLaVA-v1.5-7b | LLaVA-v1.5-13b | -| :---------------------- | :----------------- | :----------------- | -| mme (2374) | 2 mins 43 seconds | 3 mins 27 seconds | -| gqa (12578) | 10 mins 43 seconds | 14 mins 23 seconds | -| scienceqa_img (2017) | 1 mins 58 seconds | 2 mins 52 seconds | -| ai2d (3088) | 3 mins 17 seconds | 4 mins 12 seconds | -| coco2017_cap_val (5000) | 14 mins 13 seconds | 19 mins 58 seconds | +- [2024-03] We have released the first version of `lmms-eval`, please refer to the [blog](https://lmms-lab.github.io/posts/lmms-eval-0.1/) for more details -### All-In-One HF dataset hubs. +# Why `lmms-eval`? -We are hosting more than 40 (and increasing) datasets on [huggingface/lmms-lab](https://huggingface.co/lmms-lab), we carefully converted these datasets from original sources and included all variants, versions and splits. Now they can be directly accessed without any burden of data preprocessing. They also serve for the purpose of visualizing the data and grasping the sense of evaluation tasks distribution. - -

      - -

      +In today's world, we're on an exciting journey toward creating Artificial General Intelligence (AGI), much like the enthusiasm of the 1960s moon landing. This journey is powered by advanced large language models (LLMs) and large multimodal models (LMMs), which are complex systems capable of understanding, learning, and performing a wide variety of human tasks. -### Detailed Logging Utilites +To gauge how advanced these models are, we use a variety of evaluation benchmarks. These benchmarks are tools that help us understand the capabilities of these models, showing us how close we are to achieving AGI. -We provide detailed logging utilities to help you understand the evaluation process and results. The logs include the model args, generation parameters, input question, model response, and ground truth answer. You can also record every details and visualize them inside runs on Weights & Biases. +However, finding and using these benchmarks is a big challenge. The necessary benchmarks and datasets are spread out and hidden in various places like Google Drive, Dropbox, and different school and research lab websites. It feels like we're on a treasure hunt, but the maps are scattered everywhere. -{% include figure.liquid loading="eager" path="assets/img/wandb_table.png" class="img-fluid rounded z-depth-1" zoomable=true %} +In the field of language models, there has been a valuable precedent set by the work of [lm-evaluation-harness](https://github.com/EleutherAI/lm-evaluation-harness). They offer integrated data and model interfaces, enabling rapid evaluation of language models and serving as the backend support framework for the [open-llm-leaderboard](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard), and has gradually become the underlying ecosystem of the era of foundation models. -

      - -

      +We humbly obsorbed the exquisite and efficient design of [lm-evaluation-harness](https://github.com/EleutherAI/lm-evaluation-harness) and introduce **lmms-eval**, an evaluation framework meticulously crafted for consistent and efficient evaluation of LMM. # Installation @@ -95,37 +42,110 @@ pip install -e . ``` If you wanted to test llava, you will have to clone their repo from [LLaVA](https://github.com/haotian-liu/LLaVA) and -``` -git clone https://github.com/haotian-liu/LLaVA -cd LLaVA +```bash +# for llava 1.5 +# git clone https://github.com/haotian-liu/LLaVA +# cd LLaVA +# pip install -e . + +# for llava-next (1.6) +git clone https://github.com/LLaVA-VL/LLaVA-NeXT +cd LLaVA-NeXT pip install -e . ``` +
      +Reproduction of LLaVA-1.5's paper results + You can check the [environment install script](miscs/repr_scripts.sh) and [torch environment info](miscs/repr_torch_envs.txt) to **reproduce LLaVA-1.5's paper results**. We found torch/cuda versions difference would cause small variations in the results, we provide the [results check](miscs/llava_result_check.md) with different environments. +
      + If you want to test on caption dataset such as `coco`, `refcoco`, and `nocaps`, you will need to have `java==1.8.0 ` to let pycocoeval api to work. If you don't have it, you can install by using conda ``` conda install openjdk=8 ``` you can then check your java version by `java -version` -# Usage +# Multiple Usages ```bash -# Evaluating LLaVA on MME -accelerate launch --num_processes=8 -m lmms_eval --model llava --model_args pretrained="liuhaotian/llava-v1.5-7b" --tasks mme --batch_size 1 --log_samples --log_samples_suffix llava_v1.5_mme --output_path ./logs/ - -# Evaluating LLaVA on multiple datasets -accelerate launch --num_processes=8 -m lmms_eval --model llava --model_args pretrained="liuhaotian/llava-v1.5-7b" --tasks mme,mmbench_en --batch_size 1 --log_samples --log_samples_suffix llava_v1.5_mme_mmbenchen --output_path ./logs/ # +# Evaluation of LLaVA on MME +python3 -m accelerate.commands.launch \ + --num_processes=8 \ + -m lmms_eval \ + --model llava \ + --model_args pretrained="liuhaotian/llava-v1.5-7b" \ + --tasks mme \ + --batch_size 1 \ + --log_samples \ + --log_samples_suffix llava_v1.5_mme \ + --output_path ./logs/ + +# Evaluation of LLaVA on multiple datasets +python3 -m accelerate.commands.launch \ + --num_processes=8 \ + -m lmms_eval \ + --model llava \ + --model_args pretrained="liuhaotian/llava-v1.5-7b" \ + --tasks mme,mmbench_en \ + --batch_size 1 \ + --log_samples \ + --log_samples_suffix llava_v1.5_mme_mmbenchen \ + --output_path ./logs/ # For other variants llava. Note that `conv_template` is an arg of the init function of llava in `lmms_eval/models/llava.py` -accelerate launch --num_processes=8 -m lmms_eval --model llava --model_args pretrained="liuhaotian/llava-v1.6-mistral-7b,conv_template=mistral_instruct" --tasks mme,mmbench_en --batch_size 1 --log_samples --log_samples_suffix llava_v1.5_mme_mmbenchen --output_path ./logs/ # -accelerate launch --num_processes=8 -m lmms_eval --model llava --model_args pretrained="liuhaotian/llava-v1.6-34b,conv_template=mistral_direct" --tasks mme,mmbench_en --batch_size 1 --log_samples --log_samples_suffix llava_v1.5_mme_mmbenchen --output_path ./logs/ # - -# From a predefined configuration, supporting evaluation of multiple models and datasets -accelerate launch --num_processes=8 -m lmms_eval --config ./miscs/example_eval.yaml +python3 -m accelerate.commands.launch \ + --num_processes=8 \ + -m lmms_eval \ + --model llava \ + --model_args pretrained="liuhaotian/llava-v1.6-mistral-7b,conv_template=mistral_instruct" \ + --tasks mme,mmbench_en \ + --batch_size 1 \ + --log_samples \ + --log_samples_suffix llava_v1.5_mme_mmbenchen \ + --output_path ./logs/ + +# Evaluation of larger lmms (llava-v1.6-34b) +python3 -m accelerate.commands.launch \ + --num_processes=8 \ + -m lmms_eval \ + --model llava \ + --model_args pretrained="liuhaotian/llava-v1.6-34b,conv_template=mistral_direct" \ + --tasks mme,mmbench_en \ + --batch_size 1 \ + --log_samples \ + --log_samples_suffix llava_v1.5_mme_mmbenchen \ + --output_path ./logs/ + +# Evaluation with a set of configurations, supporting evaluation of multiple models and datasets +python3 -m accelerate.commands.launch --num_processes=8 -m lmms_eval --config ./miscs/example_eval.yaml + +# Evaluation with naive model sharding for bigger model (llava-next-72b) +python3 -m lmms_eval \ + --model=llava \ + --model_args=pretrained=lmms-lab/llava-next-72b,conv_template=qwen_1_5,device_map=auto,model_name=llava_qwen \ + --tasks=pope,vizwiz_vqa_val,scienceqa_img \ + --batch_size=1 \ + --log_samples \ + --log_samples_suffix=llava_qwen \ + --output_path="./logs/" \ + --wandb_args=project=lmms-eval,job_type=eval,entity=llava-vl + +# Evaluation with SGLang for bigger model (llava-next-72b) +python3 -m lmms_eval \ + --model=llava_sglang \ + --model_args=pretrained=lmms-lab/llava-next-72b,tokenizer=lmms-lab/llavanext-qwen-tokenizer,conv_template=chatml-llava,tp_size=8,parallel=8 \ + --tasks=mme \ + --batch_size=1 \ + --log_samples \ + --log_samples_suffix=llava_qwen \ + --output_path=./logs/ \ + --verbosity=INFO ``` -# Model Results +
      +Comprehensive Evaluation Results of LLaVA Family Models +
      As demonstrated by the extensive table below, we aim to provide detailed information for readers to understand the datasets included in lmms-eval and some specific details about these datasets (we remain grateful for any corrections readers may have during our evaluation process). @@ -137,146 +157,19 @@ We provide a Google Sheet for the detailed results of the LLaVA series models on We also provide the raw data exported from Weights & Biases for the detailed results of the LLaVA series models on different datasets. You can access the raw data [here](https://docs.google.com/spreadsheets/d/1AvaEmuG4csSmXaHjgu4ei1KBMmNNW8wflOD_kkTDdv8/edit?usp=sharing). -> Development will be continuing on the main branch, and we encourage you to give us feedback on what features are desired and how to improve the library further, or ask questions, either in issues or PRs on GitHub. +
      +
      + +Our Development will be continuing on the main branch, and we encourage you to give us feedback on what features are desired and how to improve the library further, or ask questions, either in issues or PRs on GitHub. ## Supported models -- GPT4V (API, only generation-based evaluation) -- LLaVA-v1.5/v1.6-7B/13B/34B (ppl-based, generation-based) -- Qwen-VL series (ppl-based, generation-based) -- Fuyu series (ppl-based, generation-based) -- InstructBLIP series (generation-based) - -## Supported datasets -> () indicates the task name in the lmms_eval. The task name is also used to specify the dataset in the configuration file. - -- AI2D (ai2d) -- ChartQA (chartqa) -- CMMMU (cmmmu) - - CMMMU Validation (cmmmu_val) - - CMMMU Test (cmmmu_test) -- COCO Caption (coco_cap) - - COCO 2014 Caption (coco2014_cap) - - COCO 2014 Caption Validation (coco2014_cap_val) - - COCO 2014 Caption Test (coco2014_cap_test) - - COCO 2017 Caption (coco2017_cap) - - COCO 2017 Caption MiniVal (coco2017_cap_val) - - COCO 2017 Caption MiniTest (coco2017_cap_test) -- [ConBench](https://github.com/foundation-multimodal-models/ConBench) (conbench) -- DOCVQA (docvqa) - - DOCVQA Validation (docvqa_val) - - DOCVQA Test (docvqa_test) -- Ferret (ferret) -- Flickr30K (flickr30k) - - Ferret Test (ferret_test) -- GQA (gqa) -- HallusionBenchmark (hallusion_bench_image) -- Infographic VQA (info_vqa) - - Infographic VQA Validation (info_vqa_val) - - Infographic VQA Test (info_vqa_test) -- LLaVA-Bench (llava_in_the_wild) -- LLaVA-Bench-COCO (llava_bench_coco) -- MathVerse (mathverse) - - MathVerse Text Dominant (mathverse_testmini_text_dominant) - - MathVerse Text Only (mathverse_testmini_text_only) - - MathVerse Text Lite (mathverse_testmini_text_lite) - - MathVerse Vision Dominant (mathverse_testmini_vision_dominant) - - MathVerse Vision Intensive (mathverse_testmini_vision_intensive) - - MathVerse Vision Only (mathverse_testmini_vision_only) -- MathVista (mathvista) - - MathVista Validation (mathvista_testmini) - - MathVista Test (mathvista_test) -- MMBench (mmbench) - - MMBench English (mmbench_en) - - MMBench English Dev (mmbench_en_dev) - - MMBench English Test (mmbench_en_test) - - MMBench Chinese (mmbench_cn) - - MMBench Chinese Dev (mmbench_cn_dev) - - MMBench Chinese Test (mmbench_cn_test) -- MME (mme) -- MMMU (mmmu) - - MMMU Validation (mmmu_val) - - MMMU Test (mmmu_test) -- MMUPD (mmupd) - - MMUPD Base (mmupd_base) - - MMAAD Base (mmaad_base) - - MMIASD Base (mmiasd_base) - - MMIVQD Base (mmivqd_base) - - MMUPD Option (mmupd_option) - - MMAAD Option (mmaad_option) - - MMIASD Option (mmiasd_option) - - MMIVQD Option (mmivqd_option) - - MMUPD Instruction (mmupd_instruction) - - MMAAD Instruction (mmaad_instruction) - - MMIASD Instruction (mmiasd_instruction) - - MMIVQD Instruction (mmivqd_instruction) -- MMVet (mmvet) -- Multi-DocVQA (multidocvqa) - - Multi-DocVQA Validation (multidocvqa_val) - - Multi-DocVQA Test (multidocvqa_test) -- NoCaps (nocaps) - - NoCaps Validation (nocaps_val) - - NoCaps Test (nocaps_test) -- OKVQA (ok_vqa) - - OKVQA Validation 2014 (ok_vqa_val2014) -- POPE (pope) -- RefCOCO (refcoco) - - refcoco_seg_test - - refcoco_seg_val - - refcoco_seg_testA - - refcoco_seg_testB - - refcoco_bbox_test - - refcoco_bbox_val - - refcoco_bbox_testA - - refcoco_bbox_testB -- RefCOCO+ (refcoco+) - - refcoco+_seg - - refcoco+_seg_val - - refcoco+_seg_testA - - refcoco+_seg_testB - - refcoco+_bbox - - refcoco+_bbox_val - - refcoco+_bbox_testA - - refcoco+_bbox_testB -- RefCOCOg (refcocog) - - refcocog_seg_test - - refcocog_seg_val - - refcocog_bbox_test - - refcocog_bbox_val -- ScienceQA (scienceqa_full) - - ScienceQA Full (scienceqa) - - ScienceQA IMG (scienceqa_img) -- ScreenSpot (screenspot) - - ScreenSpot REC / Grounding (screenspot_rec) - - ScreenSpot REG / Instruction Generation (screenspot_reg) -- SeedBench (seedbench) -- SeedBench 2 (seedbench_2) -- ST-VQA (stvqa) -- TextCaps (textcaps) - - TextCaps Validation (textcaps_val) - - TextCaps Test (textcaps_test) -- TextVQA (textvqa) - - TextVQA Validation (textvqa_val) - - TextVQA Test (textvqa_test) -- VizWizVQA (vizwiz_vqa) - - VizWizVQA Validation (vizwiz_vqa_val) - - VizWizVQA Test (vizwiz_vqa_test) -- VQAv2 (vqav2) - - VQAv2 Validation (vqav2_val) - - VQAv2 Test (vqav2_test) -- WebSRC (websrc) - - WebSRC Validation (websrc_val) - - WebSRC Test (websrc_test) - -## Datasets to be added and tested -- TallyQA (tallyqa) -- VSR (vsr) -- Winoground (winoground) -- NLVR2 (nlvr2) -- RavenIQ-Test (raveniq) -- IconQA (iconqa) -- VistBench (vistbench) +Please check [supported models](lmms_eval/models/__init__.py) for more details. + +## Supported tasks + +Please check [supported tasks](lmms_eval/docs/current_tasks.md) for more details. # Add Customized Model and Dataset diff --git a/docs/current_tasks.md b/docs/current_tasks.md new file mode 100644 index 000000000..1622e9602 --- /dev/null +++ b/docs/current_tasks.md @@ -0,0 +1,122 @@ +# Current Tasks + +> () indicates the task name in the lmms_eval. The task name is also used to specify the dataset in the configuration file. +> The following is manually updated documentation. You could use `lmms_eval task --list` to list all supported tasks and their task names. + +- AI2D (ai2d) +- ChartQA (chartqa) +- CMMMU (cmmmu) + - CMMMU Validation (cmmmu_val) + - CMMMU Test (cmmmu_test) +- COCO Caption (coco_cap) + - COCO 2014 Caption (coco2014_cap) + - COCO 2014 Caption Validation (coco2014_cap_val) + - COCO 2014 Caption Test (coco2014_cap_test) + - COCO 2017 Caption (coco2017_cap) + - COCO 2017 Caption MiniVal (coco2017_cap_val) + - COCO 2017 Caption MiniTest (coco2017_cap_test) +- [ConBench](https://github.com/foundation-multimodal-models/ConBench) (conbench) +- DOCVQA (docvqa) + - DOCVQA Validation (docvqa_val) + - DOCVQA Test (docvqa_test) +- Ferret (ferret) +- Flickr30K (flickr30k) + - Ferret Test (ferret_test) +- GQA (gqa) +- HallusionBenchmark (hallusion_bench_image) +- Infographic VQA (info_vqa) + - Infographic VQA Validation (info_vqa_val) + - Infographic VQA Test (info_vqa_test) +- LLaVA-Bench (llava_in_the_wild) +- LLaVA-Bench-COCO (llava_bench_coco) +- MathVerse (mathverse) + - MathVerse Text Dominant (mathverse_testmini_text_dominant) + - MathVerse Text Only (mathverse_testmini_text_only) + - MathVerse Text Lite (mathverse_testmini_text_lite) + - MathVerse Vision Dominant (mathverse_testmini_vision_dominant) + - MathVerse Vision Intensive (mathverse_testmini_vision_intensive) + - MathVerse Vision Only (mathverse_testmini_vision_only) +- MathVista (mathvista) + - MathVista Validation (mathvista_testmini) + - MathVista Test (mathvista_test) +- MMBench (mmbench) + - MMBench English (mmbench_en) + - MMBench English Dev (mmbench_en_dev) + - MMBench English Test (mmbench_en_test) + - MMBench Chinese (mmbench_cn) + - MMBench Chinese Dev (mmbench_cn_dev) + - MMBench Chinese Test (mmbench_cn_test) +- MME (mme) +- MMMU (mmmu) + - MMMU Validation (mmmu_val) + - MMMU Test (mmmu_test) +- MMUPD (mmupd) + - MMUPD Base (mmupd_base) + - MMAAD Base (mmaad_base) + - MMIASD Base (mmiasd_base) + - MMIVQD Base (mmivqd_base) + - MMUPD Option (mmupd_option) + - MMAAD Option (mmaad_option) + - MMIASD Option (mmiasd_option) + - MMIVQD Option (mmivqd_option) + - MMUPD Instruction (mmupd_instruction) + - MMAAD Instruction (mmaad_instruction) + - MMIASD Instruction (mmiasd_instruction) + - MMIVQD Instruction (mmivqd_instruction) +- MMVet (mmvet) +- Multi-DocVQA (multidocvqa) + - Multi-DocVQA Validation (multidocvqa_val) + - Multi-DocVQA Test (multidocvqa_test) +- NoCaps (nocaps) + - NoCaps Validation (nocaps_val) + - NoCaps Test (nocaps_test) +- OKVQA (ok_vqa) + - OKVQA Validation 2014 (ok_vqa_val2014) +- POPE (pope) +- RefCOCO (refcoco) + - refcoco_seg_test + - refcoco_seg_val + - refcoco_seg_testA + - refcoco_seg_testB + - refcoco_bbox_test + - refcoco_bbox_val + - refcoco_bbox_testA + - refcoco_bbox_testB +- RefCOCO+ (refcoco+) + - refcoco+_seg + - refcoco+_seg_val + - refcoco+_seg_testA + - refcoco+_seg_testB + - refcoco+_bbox + - refcoco+_bbox_val + - refcoco+_bbox_testA + - refcoco+_bbox_testB +- RefCOCOg (refcocog) + - refcocog_seg_test + - refcocog_seg_val + - refcocog_bbox_test + - refcocog_bbox_val +- ScienceQA (scienceqa_full) + - ScienceQA Full (scienceqa) + - ScienceQA IMG (scienceqa_img) +- ScreenSpot (screenspot) + - ScreenSpot REC / Grounding (screenspot_rec) + - ScreenSpot REG / Instruction Generation (screenspot_reg) +- SeedBench (seedbench) +- SeedBench 2 (seedbench_2) +- ST-VQA (stvqa) +- TextCaps (textcaps) + - TextCaps Validation (textcaps_val) + - TextCaps Test (textcaps_test) +- TextVQA (textvqa) + - TextVQA Validation (textvqa_val) + - TextVQA Test (textvqa_test) +- VizWizVQA (vizwiz_vqa) + - VizWizVQA Validation (vizwiz_vqa_val) + - VizWizVQA Test (vizwiz_vqa_test) +- VQAv2 (vqav2) + - VQAv2 Validation (vqav2_val) + - VQAv2 Test (vqav2_test) +- WebSRC (websrc) + - WebSRC Validation (websrc_val) + - WebSRC Test (websrc_test) \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 350899334..d11c1228d 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta" [project] name = "lmms_eval" -version = "0.1.1" +version = "0.2.0.dev0" authors = [ { name = "LMMMs-Lab Evaluation Team", email = "lmms_eval@outlook.com" }, ] From 50575a950736bc8fc1e191310314cbb5fdff5720 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Wed, 12 Jun 2024 15:39:03 +0000 Subject: [PATCH 177/181] chore: Update lmms-eval to support video evaluations for LLaVA models --- README.md | 79 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index a4cc11e23..417107903 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

      +

      @@ -11,7 +11,7 @@ # Annoucement -- [2024-06] The `lmms-eval/v0.2` has been upgraded to support video evaluations, and other feature updates. Please refer to the [blog](https://lmms-lab.github.io/posts/lmms-eval-0.2/) for more details +- [2024-06] The `lmms-eval/v0.2` has been upgraded to support video evaluations for video models like LLaVA-NeXT Video and Gemini 1.5 Pro across tasks such as EgoSchema, PerceptionTest, VideoMME, and more. Please refer to the [blog](https://lmms-lab.github.io/posts/lmms-eval-0.2/) for more details - [2024-03] We have released the first version of `lmms-eval`, please refer to the [blog](https://lmms-lab.github.io/posts/lmms-eval-0.1/) for more details @@ -67,9 +67,32 @@ conda install openjdk=8 ``` you can then check your java version by `java -version` + +
      +Comprehensive Evaluation Results of LLaVA Family Models +
      + +As demonstrated by the extensive table below, we aim to provide detailed information for readers to understand the datasets included in lmms-eval and some specific details about these datasets (we remain grateful for any corrections readers may have during our evaluation process). + +We provide a Google Sheet for the detailed results of the LLaVA series models on different datasets. You can access the sheet [here](https://docs.google.com/spreadsheets/d/1a5ImfdKATDI8T7Cwh6eH-bEsnQFzanFraFUgcS9KHWc/edit?usp=sharing). It's a live sheet, and we are updating it with new results. + +

      + +

      + +We also provide the raw data exported from Weights & Biases for the detailed results of the LLaVA series models on different datasets. You can access the raw data [here](https://docs.google.com/spreadsheets/d/1AvaEmuG4csSmXaHjgu4ei1KBMmNNW8wflOD_kkTDdv8/edit?usp=sharing). + +
      +
      + + +Our Development will be continuing on the main branch, and we encourage you to give us feedback on what features are desired and how to improve the library further, or ask questions, either in issues or PRs on GitHub. + # Multiple Usages + +**Evaluation of LLaVA on MME** + ```bash -# Evaluation of LLaVA on MME python3 -m accelerate.commands.launch \ --num_processes=8 \ -m lmms_eval \ @@ -80,8 +103,11 @@ python3 -m accelerate.commands.launch \ --log_samples \ --log_samples_suffix llava_v1.5_mme \ --output_path ./logs/ +``` + +**Evaluation of LLaVA on multiple datasets** -# Evaluation of LLaVA on multiple datasets +```bash python3 -m accelerate.commands.launch \ --num_processes=8 \ -m lmms_eval \ @@ -92,8 +118,11 @@ python3 -m accelerate.commands.launch \ --log_samples \ --log_samples_suffix llava_v1.5_mme_mmbenchen \ --output_path ./logs/ +``` -# For other variants llava. Note that `conv_template` is an arg of the init function of llava in `lmms_eval/models/llava.py` +**For other variants llava. Note that `conv_template` is an arg of the init function of llava in `lmms_eval/models/llava.py`** + +```bash python3 -m accelerate.commands.launch \ --num_processes=8 \ -m lmms_eval \ @@ -104,8 +133,11 @@ python3 -m accelerate.commands.launch \ --log_samples \ --log_samples_suffix llava_v1.5_mme_mmbenchen \ --output_path ./logs/ +``` -# Evaluation of larger lmms (llava-v1.6-34b) +**Evaluation of larger lmms (llava-v1.6-34b)** + +```bash python3 -m accelerate.commands.launch \ --num_processes=8 \ -m lmms_eval \ @@ -116,11 +148,17 @@ python3 -m accelerate.commands.launch \ --log_samples \ --log_samples_suffix llava_v1.5_mme_mmbenchen \ --output_path ./logs/ +``` + +**Evaluation with a set of configurations, supporting evaluation of multiple models and datasets** -# Evaluation with a set of configurations, supporting evaluation of multiple models and datasets +```bash python3 -m accelerate.commands.launch --num_processes=8 -m lmms_eval --config ./miscs/example_eval.yaml +``` -# Evaluation with naive model sharding for bigger model (llava-next-72b) +**Evaluation with naive model sharding for bigger model (llava-next-72b)** + +```bash python3 -m lmms_eval \ --model=llava \ --model_args=pretrained=lmms-lab/llava-next-72b,conv_template=qwen_1_5,device_map=auto,model_name=llava_qwen \ @@ -130,8 +168,11 @@ python3 -m lmms_eval \ --log_samples_suffix=llava_qwen \ --output_path="./logs/" \ --wandb_args=project=lmms-eval,job_type=eval,entity=llava-vl +``` + +**Evaluation with SGLang for bigger model (llava-next-72b)** -# Evaluation with SGLang for bigger model (llava-next-72b) +```bash python3 -m lmms_eval \ --model=llava_sglang \ --model_args=pretrained=lmms-lab/llava-next-72b,tokenizer=lmms-lab/llavanext-qwen-tokenizer,conv_template=chatml-llava,tp_size=8,parallel=8 \ @@ -143,26 +184,6 @@ python3 -m lmms_eval \ --verbosity=INFO ``` -
      -Comprehensive Evaluation Results of LLaVA Family Models -
      - -As demonstrated by the extensive table below, we aim to provide detailed information for readers to understand the datasets included in lmms-eval and some specific details about these datasets (we remain grateful for any corrections readers may have during our evaluation process). - -We provide a Google Sheet for the detailed results of the LLaVA series models on different datasets. You can access the sheet [here](https://docs.google.com/spreadsheets/d/1a5ImfdKATDI8T7Cwh6eH-bEsnQFzanFraFUgcS9KHWc/edit?usp=sharing). It's a live sheet, and we are updating it with new results. - -

      - -

      - -We also provide the raw data exported from Weights & Biases for the detailed results of the LLaVA series models on different datasets. You can access the raw data [here](https://docs.google.com/spreadsheets/d/1AvaEmuG4csSmXaHjgu4ei1KBMmNNW8wflOD_kkTDdv8/edit?usp=sharing). - -
      -
      - - -Our Development will be continuing on the main branch, and we encourage you to give us feedback on what features are desired and how to improve the library further, or ask questions, either in issues or PRs on GitHub. - ## Supported models Please check [supported models](lmms_eval/models/__init__.py) for more details. From 34156335db74cef9e3f0915d7172fd6b22456c15 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Wed, 12 Jun 2024 15:43:16 +0000 Subject: [PATCH 178/181] Update llava conv_template in lmms_eval/models/llava.py --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 417107903..75ce3965a 100755 --- a/README.md +++ b/README.md @@ -11,9 +11,9 @@ # Annoucement -- [2024-06] The `lmms-eval/v0.2` has been upgraded to support video evaluations for video models like LLaVA-NeXT Video and Gemini 1.5 Pro across tasks such as EgoSchema, PerceptionTest, VideoMME, and more. Please refer to the [blog](https://lmms-lab.github.io/posts/lmms-eval-0.2/) for more details +- [2024-06] 🎬🎬 The `lmms-eval/v0.2` has been upgraded to support video evaluations for video models like LLaVA-NeXT Video and Gemini 1.5 Pro across tasks such as EgoSchema, PerceptionTest, VideoMME, and more. Please refer to the [blog](https://lmms-lab.github.io/posts/lmms-eval-0.2/) for more details -- [2024-03] We have released the first version of `lmms-eval`, please refer to the [blog](https://lmms-lab.github.io/posts/lmms-eval-0.1/) for more details +- [2024-03] 📝📝 We have released the first version of `lmms-eval`, please refer to the [blog](https://lmms-lab.github.io/posts/lmms-eval-0.1/) for more details # Why `lmms-eval`? @@ -120,7 +120,9 @@ python3 -m accelerate.commands.launch \ --output_path ./logs/ ``` -**For other variants llava. Note that `conv_template` is an arg of the init function of llava in `lmms_eval/models/llava.py`** +**For other variants llava. Please change the `conv_template` in the `model_args`** + +> `conv_template` is an arg of the init function of llava in `lmms_eval/models/llava.py`, you could find the corresponding value at LLaVA's code, probably in a dict variable `conv_templates` in `llava/conversations.py` ```bash python3 -m accelerate.commands.launch \ From f00d5498b69dd4f7e54c907ac906abc7c128f000 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Wed, 12 Jun 2024 15:46:33 +0000 Subject: [PATCH 179/181] Update image alignment in README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 75ce3965a..acb9f3bef 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

      +

      @@ -17,6 +17,10 @@ # Why `lmms-eval`? +

      + +

      + In today's world, we're on an exciting journey toward creating Artificial General Intelligence (AGI), much like the enthusiasm of the 1960s moon landing. This journey is powered by advanced large language models (LLMs) and large multimodal models (LMMs), which are complex systems capable of understanding, learning, and performing a wide variety of human tasks. To gauge how advanced these models are, we use a variety of evaluation benchmarks. These benchmarks are tools that help us understand the capabilities of these models, showing us how close we are to achieving AGI. From cbeee20bc4ffb510a2b23d96cdaf4077be7c2a9e Mon Sep 17 00:00:00 2001 From: Bo Li Date: Wed, 12 Jun 2024 15:50:30 +0000 Subject: [PATCH 180/181] chore: Update lmms-eval to support video evaluations for LLaVA models --- README.md | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index acb9f3bef..7dd775e69 100755 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ 🏠 [LMMs-Lab Homepage](https://lmms-lab.github.io/) | 🎉 [Blog](https://lmms-lab.github.io/lmms-eval-blog/lmms-eval-0.1/) | 📚 [Documentation](docs/README.md) | 🤗 [Huggingface Datasets](https://huggingface.co/lmms-lab) | Discord_Thread [discord/lmms-eval](https://discord.gg/zdkwKUqrPy) +--- # Annoucement @@ -206,14 +207,41 @@ Please refer to our [documentation](docs/README.md). lmms_eval is a fork of [lm-eval-harness](https://github.com/EleutherAI/lm-evaluation-harness). We recommend you to read through the [docs of lm-eval-harness](https://github.com/EleutherAI/lm-evaluation-harness/tree/main/docs) for relevant information. +--- + Below are the changes we made to the original API: - Build context now only pass in idx and process image and doc during the model responding phase. This is due to the fact that dataset now contains lots of images and we can't store them in the doc like the original lm-eval-harness other wise the cpu memory would explode. - Instance.args (lmms_eval/api/instance.py) now contains a list of images to be inputted to lmms. - lm-eval-harness supports all HF language models as single model class. Currently this is not possible of lmms because the input/output format of lmms in HF are not yet unified. Thererfore, we have to create a new class for each lmms model. This is not ideal and we will try to unify them in the future. -We also thank: +--- + +During the initial stage of our project, we thank: - [Xiang Yue](https://xiangyue9607.github.io/), [Jingkang Yang](https://jingkang50.github.io/), [Dong Guo](https://www.linkedin.com/in/dongguoset/) and [Sheng Shen](https://sincerass.github.io/) for early discussion and testing. +--- + +During the `v0.1` to `v0.2`, we thank the community support from pull requests (PRs): + +**Datasets:** + +- VCR: Vision_Caption_Restoration (officially from the authors, MILA) +- ConBench (officially from the authors, PKU/Bytedance) +- MathVerse (officially from the authors, CUHK) +- MM-UPD (officially from the authors, University of Tokyo) +- Multi-lingual MMMU (officially from the authors, CUHK) +- WebSRC (from Hunter Heiden) +- ScreeSpot (from Hunter Heiden) +- RealworldQA (from Fanyi Pu, NTU) +- Multi-lingual LLaVA-W (from Gagan Bhatia, UBC) + +**Models:** + +- LLaVA-HF (officially from Huggingface) +- Idefics-2 (from the lmms-lab team) +- microsoft/Phi-3-Vision (officially from the authors, Microsoft) +- LLaVA-SGlang (from the lams-lab team) + ## Citations ```shell From 05dc8e853eab7c6bc782a1e2662d2efe7422f767 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Wed, 12 Jun 2024 15:56:04 +0000 Subject: [PATCH 181/181] chore: Update lmms-eval to support video evaluations for LLaVA models --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7dd775e69..72b15fb11 100755 --- a/README.md +++ b/README.md @@ -223,6 +223,8 @@ During the initial stage of our project, we thank: During the `v0.1` to `v0.2`, we thank the community support from pull requests (PRs): +> Details are in [lmms-eval/v0.2.0 release notes](https://github.com/EvolvingLMMs-Lab/lmms-eval/releases/tag/untagged-9057ff0e9a72d5a5846f) + **Datasets:** - VCR: Vision_Caption_Restoration (officially from the authors, MILA)

      A$+irsiEL;4jd`mSt@1x}XKr>WW7$PskdAhRDx9 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�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

      p3{iu%!3x8^p% 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

    s7>mHAlt zMr`znB&C&fceW_nlMk7C2sT2;=L9q{o4Ar`*NUub^aA~3F8EyZIu@3z{#s1*%COc3 zp-pLXCgAk=+uhbm?EV!wRz8bKQ%thn>Lml0o*VaO)fEqWGf5B^LhV|>Z`fEZsaK4z zr1xhGNQNMjVjvC0>D+Z=<-jmwLC>!w*e7-B8YU9+Qb!E9CZkJ1&fJl zn?_U!Z*Dhg`M2|)JS_LbLmXFwm17(S-S2({;F`0d5N#9Z(h0%_nk#xd0UiyjgMA`N zv)XO1^tcoaqi9m=uQYj^o}GctD&9j4^r$5t~c|S$B^{+gY*76xc^>4Pi8D zgC=8btOWL}MvJ0xeP_>2hpb5u!96e|b?2i)o6vSTI~$&=vPjCP(Ko33?hXH~V8V@s zH}ZDB7bx$78L0bvLMPoQ@*}0}6XU-g5_R-3Lon68F>QaaoBLETlk?gHqt=7Vczy8( z?yyc*bt~5F zN~C3M^kxbc%6v;qF->0flH}E#2em@|*Fe;ljt6?x8z?n43(k6gnFWsQ77}cqKvgJ3 zDIY#2Ka+c934EkNGXhtgi~kbdcF415*34;`a?JPhUNcL5depm1kJt;esZZ#`s*7;W zfIW!xa>+8%7sX~?W2WRrMQsEM)jXy5xAaV|!k+2#G*E2f4cE`?e0@3zMM`FkNxxFG zh|KcGE4YaUCT6(hbpdz|E?PGAdTtYRdKMX5 zghDpI1&v8eF>Q>R;=Da$cb^uqI!Q?j>9_6$r3`ZuwLJ>!Ufe1*0Dl!8`60Fb z{cWDWA%=5f#CK*pqnH2}aVCRD@)P}sGlWJc@#BQW`Aa)ajh+n`D`;l({X69s5S-or zkxzX0=KQ@z9$X>k`&uriUK1zKw|d(`wGl4=^^JKuov^0U-zXv243d4PY=}@TpV%i~ zueC2vy;4K=(b-~R^^1^|pipb5sEPK)eY!|oPUgFqgX#jeZ+<=BT!hqUfa87pmpihF zu{Xm@S5Fn>bQzdr^#QBXK+#&w0o^JveUGluQ2P1Np|W1nQ4|@~U9dsaqatTS^2V_q zjwRsew8HZn7YkQ#ZcsM|;Ix3eYyV$@z(B&S+B!9i-Hg=J?T0vq@;oFRh zZrf-ocnE~Of z-mv-yd*ZjR{feG|eT~KyM}+DFZx9_u+DM=Lu)%~1(}cQa>@qQ$oI*;v|K;s&V{`As zz7;=uAE_~oHwb}xhG<8yshnAFP%8>yGLCsQjBLE4mA6^ER_RKFsn8vHx_VIFd^wm&fc*C^Qop~QLv#Al< zEq`Pyti8EAcZd%@2Ks4d4F+s*X1v5uOjC0KtdXB_&00TM;RO}#-n1n6W3HXT7^~9{ zf`RxX-vth!GGLH)=)w^UmKTl@i68s(-{>Hz4Sh9{Xd3{`{ik=uZHm zT1>SGy1uU&Y(Hy?=yzh4hO>WtV~W1B1Z6#^G5=qgiMcP;EbqIjzXlh^3{iz`YVhaD zWru3>q3X8SwEzn2P8YW=PgJfP+aw&f6+cIoA6^KTVzo1>zaOFo*52cFZw>*h^w8)w zeIN(^)HkT<#{(Q6?~lj!UQsPt2e-9d%+XLzc;!^kD&?eD4*HH>zUiNUR|zDj+p4sv z!5h}waaEnQ{>~mr>~Hguj1dj+N9xmsq6_6)8f7rs0*<`*ZiK|GaXw0gT4cDul1Z~) z&UZd1l?NzMHy7#1-?`dY*Fe|+R+q165WqqjlN7A*y#gGr)yfW1^gP zAiwSli7gK{7mQRyaOXP+zqh z&N&_Ca4q^a1#6y#fTKV0^H9veTWA+xbq|Q4^*_ls!Ci*nh5U?r;GL&q!3;z^jgG zxyICOjFnHTgSiB_>3A{1Z^p`reCx%~hzz*{!U9>>wg=SjU3ee4$k8ORt>J>wlP~K8 zvpZMkWSUz*YhXmG=GOUU=9*To1reUrWr*gR1g&4fFDBKQU&;eJ&m@oD#0Ud-n#C5@ti~E%Ya5@eB3T3(3!W@`%@~o88T2j$9Qb!TYDEUJ&EYF%D2AH2q zoXD-ds-NNKc{vSvy5DLWw>+C?4dYF4Oc{^m>w5+H@q5NyzzUU^dUoAdl1d+_p?OlW z)~XMQgX&|ODga}Q!Ah}nDSj*OV zyu=;-;ugT;D&)E@KltV7UioyP1H=*|%bVUuSA3qt*g>1EoR?b>e8&9h85+1s#W7;G zsJPMz!|*n=^KGmy9pkQUmNH&USXE}itA}R!t0iY*?8A8&y+cMOVi()4WHMc8b+^W% zX_0bF$J)w|tb3i~zL%06+V-~37XLPZCtTMs8{Q^RpD;$gZn-WkD0BH$w%l;pDyNl)buO$_SF0 z;wncAZU1aeeZ%b5e(&vTCbuUEdI^rvKK9t-0dAW16)h|3Kb#Y#Q&Ki0e+@GcZ*PJK zJLiH}5-vxD=SZ&2)x?=y&_B*mNJW%az{b@rljC)?#5V;uIX&?zw264A0e+|l(7q<} zKOxy{ma&Bl?uOZK-Gl9c|Z5LCBerZEDWNJ_XT#6_vU`#=4 zDO03T242(HpfcedJ=T;a&l=6kQ_qql>EFXctCy*s-x6UCMgEYtd@sh%W{xfNPh`|BVjGiubRZLr|`jV%n zdFZhZE{7o7GJNA$#;+~tQmte1Gc{EOXXhu%{X3ZITfMfawBlA6&I~o3V&(~sx~;T@ zExPaqLXO7Hqx1kE?_y*Foayo$F2yvb<^&i~S@SBt4csa8u@1E;o0m}0qKr%l?+~^V z*Ax?g%l5hK@E*shSCFu$u{Wg9~v5! z%i83a@>3OBex3yxBH+1p-(4gM5 zw`j;Cq`-E#FkET6RH#w*TLDY$$S`1QmF~S2bZy?bcS$lthvz|D-PheM@-AU4GB|!& z8)wh>nh5Fu4S%i5iBbRs-&v<9h~{fBxg*@P9@$my@+KRWZ;WJuw!tq;dl*FX$1R_)@FR_NrHVZpOcFk!B zCd{}nC5?~Ar(i0uHE)i}O}+G<=P$I-oKl{?Bg!cI0U`GRY3DZrG@bI`ER_M@G4_!= zV^&c5K9D8ez6kqTIe9UMwai(S8F9Yc!j1efEXV9N!Oou8118Ft%D>S_mk+rX@_wQ} zWp5SM!!5RV3fOKf3}~s|iLjoMxp$HllPJDyBWgo_=Xy+WMT&PL(!8DLiLJMpn-dD7 z(DBOB|HH&;fPJ)rk&DA`!d9pdD3VOYXy2c*foq_oQZz2@O4R8b6cWXNxT0z(JH;P&izyF9X?h0vR5K($4ws!INF4SnRh{+}P;?bYVpJFJ#k^{z>COeBj1?0{TD}#UD!km?=Zlhi zD#hiHE}V=fd44uxd*<#k?lqWW-HB5uKwJ={6m$j?9)}BGsiwr4KJxAxv1E2r^(Lme zmSYv__sh8b(_uDn#hI4SPN;@fy-W zy`v4)eP@oo1O4C1%S^#N_CdnjIpZmla!RW~`#ZjxuZIn={sG1;MH*h05&{1j5pJYNzJTGfn2EEW| zSO+%x`k7{P! z6q0HNQLEBz1(FH3Qah@!v5J5vCQ3Zlw+v+c#K*%~Hpyzf%iiwqIvc>`uF-xwT$cQ6 z4ZW%QfNZrd&RuX`1J+$V;=dW)T5it)$cE5h%!sphA{V)7P4Lc71oeWRzWEYeyzsW#iwhyiOcOiU+&ek6(8&PU0OuywrMVz`jAS@>0rel7*E< zIwf7pkBS)Kk5>hw!zqy5zhtgXUdIw|iYM-`a7CzM1Z<43xdZg-pA>C2_qv#mC-z?sG`lP9-^J0gjn?b%vIL4UxcrdL_V#4$x&J($VULk;y!T~za#rU3dL_P0>$px|0kC0*ajhK-Lurae^{KkJ0w z<}YtN)I$!~S)zFM(9()IMK8-Z^J99qK&9GmhQnA!4k0?MVr$O5ypl&*RO3 z^ZUqcplSUu za=*!)>W-c4nu9o|B=%Jf#AVIC)slf88VOUZi|*95_>ix_U5`ayjjr)u;xKaT^Id8k zXuC|4@u4Er9zd=LJa@Rv>kQObn6xvq5?ay#S0k3VM4%KV&0=G3F+GThkHjoN#K5En zZ!G1Kze|X574=5W-DBJ#$dDJJMFmy*;xoqa6eA`##CpW;S_CiW{%#()zBiehF-8EA z(ne$~<(3D)WTy?Kf(}>9>0iX=&m{xSLirAeGO29i?X;LgA&RsOKYJ=)z=KW++ zE@u2qe%Nmo$y0`)x-YTp{w`u!h)3XV=hEg<;_hHp|G=GIKe1PFwM0EOTAjek#@p6h zxpu2=NP5d&Pzc!zQ9%UNlCp3Hk#J=&gir@%$4)BFcK*N`*O>|qN=HsO>i zm4Q^2d|g$>DVR)DFahf*&wrLr(R{){fE}(R@Q5lokuqpU*At~{B#2~t8TtOpfl-oR|U|h z90!6W?rO?a-b~X=(*dD)RV-{h);1YmqpfF&i=rHeHW{KCw7Ms54&E<}fyr2J7UtpZ z(^2I>geA?II%71XfPrIk3nHvK8(F4= zskpAxJYQ=d#I=gT%X0W}-x#+6w8Dux@-chlR^b_Nuo|Q5K2y8VNRz)fu49FU?;GF`gWW z03B}upM8Gtp5qS-pw9y2c|wUcax^OBcR@`_<&u(LLus?^Y4ohCP4 zOsJ2h=j%(`qrS4;k5fJ8jg!F6>o5ljqSujaI1}=UBiq3K=)*o{kIt6nbi9+zu+cp- zGDZy89yFqgbu!9URtl}0Hbk`z0ANwRe-3@2qkI^qMDi-rX_ldd-=tioWu`z_{oy4eusYc4x4h^ET2yu-|ISQi8zWRT`V!ty-z!&7YXWBQX zuo&=$(oW(`zAkVR56h=1AF4bSrSDz_=%g}{`B?Ko1sg0820xFDlyIzB9o`@<$ckd^ zlJUCe3i0!E(szA!p*%=`ynG@q5)+&Sl8WAhNBjY$uYnqJlT_d+xi(51!^+9N4rdP6 zRkPf$25zq>och8{{2CmHpOk^_ulE|^16b!6tmM7b1`fbwLiK>cv#ksuR59asEL*4WMC=cr`1jM_iC(rvk zrAUBv-I!cV99bufZ>p*`D?JI5iJphb)Z(X@;Pl~Of=;*uT&nbdTWfPQa^?O+MZtO3 z?Z?A=(~2d&Z4QPQ;Ni6sKoxz@A(@tYJdYu#kEF~!PCIjrt*(Pv7r{2f7afUtvZG7A ziph68naX;CbXrjM$LEKI6*FrpDoTh?CT|~EN~tQ-L3NHt=g+2rT&kB4Dd9|(SlL)n z6q|a$?Ay>FQ+qDV6T+4(6%ifxOh#5AFVyDID8)O8LQ9J(M@H-qpXoM=U%Kg-w63c` zJ#Hh8Xv#%Xw5MGK!}3dAY%kstpD`tE`%OCu)-QApH^0M%Jc)Qci#)b25FvvUQG2hy=vvWZRb2KRLz2WkrbtLyfIJUyqg2|0~ z^fj-}>htWe!VXObCPN{f#?v3rxb{YiBJlD&YczKP&PEA-2!6DoLCiG(QrowHOUY5~ z>8XoRq)x@T<6A|N=+zN8n-oqfuY|9LysN^WOuto*KfCS+SE zCs#^%&a2yVD2#dxm34Tz2ha|$#8MaA$9{lg?0b-MkyN$Oqw*K4NtmY zN9ZHK6mLhV&Y>%CBfsX>eSS<`8oCvDyZXa>6DfD}p``(zdih}hF~`~Fz;+-La)IPF$ay`m(p0RO*N~@5Mbbr0#ZY5A3S>hmY$gDUM z^I*>E%x3Q-Frj*u!{-WM%ZCTDJF87Q2GxY}Gt)|pRMQ0*mEn?dtAp+=3awkGk?G8K zP5GhLD{*As)b$xV<$*8{{VI0Pn>{AGq zaG%}Vr>B$WO6`AnCJMUyTR~f+eAAml*?K6^CPYE^GxRG86py_qxL28pK#gnleqXVf zPgWl);n-bXl*k+}>uNmbc}(F$5$D8a3Q-T$EO2CMy3_%nL(Z}R)D-PD_r;Xk^JeoX zLyS)e7QzLsV33EY(osTp(%0l4zk-3{YwtX1qL%(`vJ{UO?Lr+*=t#YzZ=4xKn`0bq z(%)k1=x&azs4CNDg+o$()|kbvclHUfV)u9~&KtkfECG$?oOsX%>Z9Xn`)s2fZ-6Ed zceg0V)L-A^f2gy&sm;eDLVf9Y^^Y|5rx$@Y^ts@iDb^lAw_W2xU%G?ATE+O}f@`}=p9y5T8wfg!<|t;Y##JGEx80Nt0kL)Nu!6K7fZq0G zSao@}6c+DnEH&~a4#MWNo2*VR#qLw%Mm$o@D)TrzJ9W&sbyVLp@(Yi_4h^oi zc{w9Kk3mKewQg3a*XqW~nyebuovO1srhKlNCXRX6FxFYvLAxZ_c;~8Bkwuy{{~|;> z4hbFuV_NaT#e?~q3U_!{?e`q;6qO6=<}C7+eWG%vh^#U~65F0iig2!O`?!=OnSJby z19oEND;;wunS4=zCq$M};fRo@c-?tLi6;p?O>{q}O>pAwe0u5yNG`8|)Th<8;dihj zW~j@^z5eUXc7J0TS7k}F5{EyN`4Y^0a!`gFk3+|r?@*5>GWb3QqM5(UOC z+55nmY|Kt!pNu@E<~^;LmjRWAy}Yx}?A25U-u4jr~^f_6P$*M^6@Q+VOi_X+9UJS`Q1rqHhx=2G{s` z!Xmzzc8(^C2gR+4*)OpYbTQ`$tNqA5(Kb9Az(;egnYs z#ImGR-F@tF8$>?x@aeU82Q))1btxV|FRw;6lmb3BzO!6={w^aOss?7-xCf32!uO{? zts4d&-2vkJ{aGXB3V}g7sGCjqWm6%#HtSrah$0Xf=HE2)UlKwJ9HH7XB-REKLIrOi z&|9Y$BcDn-Wag7pv}3>s?CE{m>f`2z1l|@up@O9@jT2+-0G9THCsQ zikCNJJk=eBY6OR&_*$-&IR@84>0*vMJ&6Vb!SYRbL{lR++`LsK1ZT%QIn8X4v85Z- z3_Rp8Yz0g+t|+GBhus!Cr2@Ea8-GeT-?)E2faXt~V>WZ=3SEu1&WZ&>ZeO!XU@`S8 zSZb5^N<7fo$@rr&1q!(@Z%~Al0a;#V124H52bl1{Xjt5$w=BuV0=O*F=qdmYPTnxt$UxxW)r${sY=C3b)q9Dye{Xwb`RlQa#+V8aF zV&E6*CsY{u4R@+v`fS0g{Z#P#7GcO9+XFVIXdz#eH7%>yxm{bX$%0KL-(SE}^rlUp zOo!waZrCw@NO8_J!c{7&w%*=x2HnZNJ$+ zpjhrC-=x0hK++(^n50<-e{{XlY{-GkziBq-N!4+^n*^UP&MqIO=+gBpmIjY`-b=Em z1U_cB;s*fHPEWR~n{$PYc!B|>;7qc-#cW7deq0icUfo}Z@_GQUFv$e_ZUD@Q?eLTO zjbr=cDSUr%=+OC#*|`3WQiBi)k&5ES)ma!ZTY#DfI&!b%fUqqWR2X>1t>LV@s;|*h z3o}M2<#bfad3MPxj9=58;~+BHdCTQDuVd-!HT&BczsSIKryu45vXOS&zG-pTemmcP zlnhB%^MXT^PH!-1-y^XYNRm;QUsY$Z`5C_NTGB%F_DUtLjml{n*3a`+CGBSA4%Y+g z6E*mGh0p~=dLj$v)GG(9U-okvY$4s_Nh~b3R*6QVMMr@ig|SdeQ@(p$E8+QBp5H#w zJIj5ckp)Jw1K+Lcz(5Om{fGK^(_cBio2@ds#VdLhH=GYls`D2CGC6aA9*O;=BLb|g z^pv^bZP;;&u!}dcn8eX+iN0C(lfgT6w#W|tgkeL3cYg=5`+Uk57eKW+0I{gBNJZ$# zRF2OOt$)}S<&)5)y$t!=`kWx=WgAU+QhsDzv!|egbMD?#+XzMaRQDOl0uBlmmV^{3 zO&+qzUV>=f$(KP#Nkl9u0P8Z%W`fLN{XI)f4a~UMgN$AAr+{&q> z-&NB`2Kf+0Sb}h{BKN)TY6jzFJV&H#ol_QBG!w> zXPrvEg<>NEYU$ML7x7Sv)qk5d{Y_gghd{#MQUiCy43lR2!fmvnIOki(-1qy3-mp&d zE=1^{6{$6kJz&xyXxauyQg7M)&Ux|@amNGd1mF!&uTp=}X6JgCi?7uk(j!*;bgat4 zd*5Bq3RUgBT0UZC;3PHtU~CeI)-y`S@O^%(Lj$qY+?A$PH4fLSaZcs{26-)E#ODP~ zN7Y02*>=X)%=4ZoX7@1SQH`C)#YgJx4om17WG{e`yqhZJ&S*(GNa|^uRpIiUhg#Lu zxfm}1gkk^ruqd#Guo zMgQPJxR;}40x`b|%y=aCxuA|x?TAk{#YeRj1#1bMbYG)z_kNEK4SYFZ7+TjUi6e8u zAts`zPcPyn8%W2M6{+I{aSlK5=n>o~7x=@oA@ZIf@Pw8d0X_1GUkbtCj*;Qoo>H>? z9c6G6>A+IcGPq1<1I=D@NY}naG!fVT(VQyK0lPOiDOEf@w*VvZ#1=!%U#0%*tvq=- zn!(N67OO9BP{k86FR4C9aAh*wM4x&9jJwkCmX;+2@|tNP)W^5;xG$8pIS9|p0qQmx|{{jA4x>i-Ev#G7DT8!WF;=Qk)sH5FT(tDXNv~tW}*vET#+P*+-kUhEmKAP|b08dVTDlgd{beWoFxT`Ac z$yA><&@zgGqv1@N30REkLW)!<>2^UUE3Q*|I+)Ojf7u0<5pzVX$du(O>^u!U{=)eB z=ZpyN7>axA5ye113y)HSto8FF!lmU5+e3ZC3>9bShR zz0=)n@kq!MeoKm67TS$L!|G7h3Hi>9cVfu@c}jp$^gbrC5Ra$~Ux+0E9Uc$V4ofS0 zeC0xz%V64`G`uC!vcoW?X3pU-2qrlDXryd?F)u-wn8?bbeX~5!Wh*+9Zw=5=T~p4 za#Jq~u4F#%sG%(y%5@7R^4UjO$D$)8LQ1S;i$YEHK?NuA1r(6&6*N4>Krz1i!)bc1 zHyNu-nzm+WpPuAXUT>sthu4gS%TC7f_N0z1DOIm1G^5`YL6zZw$fGPsFws9@dW9A% z!AY+Kso5!!)n+^Nnf`8@#N{>v6Q?f49EjPyNPbW!5kDM-UYvoCw!K+&zO*0?QJR4h z5c{o=efK-RX==wneKj=?%*G-c71UsY+Am)M0Ks8f7(#GyosN)VQn3m}inVGny z>k*Rnk!K`5`~bwZ`EW$~e8C}29F5?X)h>gp>ntN>Y}|rcaEmAf+GIN*>m^V%>WEtB z-s?8QsDKy`&G%#L?>J@7R@W@qd{U39N_SLl1PuaXjV|1)$R})CR`&Bt=V%oF#yh%) zj+l&?%)ca$DIlLHa-ZBVTb&CqGBXY!SkbZq2;?zP2#^LXrWt9A&7$*rZmsONncWA0 zql(dFT0kr?Ka_z^v)C;g&eSM@4*{ylVj#mfwCTDtt4@{$mlXL|22OW{%9WHwhI^}h zc8R=|Uxg>)6e*Yd{)HueN8ymP@GkTxSh!)onfp(xpoFSd!h}A^2MvgCIdg5sY6A9q z_TpHQz_sEvQVZwAYC~g*^kLXh>{V=M)P1V))I%E3TbB;H}`aePGs5jWWJ$xLo8!$L%Bb6w>CXJ;2Cu0{``m{eE5^dddy z3bk}?^u<7R%P}E%Awu5Q%*`?63+!kldhB1BPOVuWVQm}Of99o-mO9lw{Hsmiacns2 zV;v(mBwmx#cr?dqR8+IPY)nM+%G>kIQ>QCL#c*&edPXu1qozrjt6>3Ok!>ikdADte$`kj`xqt zx;282_U;^L&pgl6X8WC?y>adHHIS{Z zYFTJHoE9)lN z=wJe5CvxJpVtd`*8>^c9fE49w^ug60+k*1`(I1;XNWt!3-{LXm=jKWIQAu&iIyiN> zuF$_8zrU~6G{fIB3^dJIcJ$86)c3j!p?&qxt_a;$nMO&_gu4Tm`rNZZZzC-z2H2}> z+{*=R3%I2AX9MM}X^HjTF`-N4y(n51e(Q)}l7dT}Y?0(0QK?sMgzaUb7Ey)l-R2&@ z+<+T#Q{6)3JY=;OZp3{cQoO5db{Wr2dPnYGJuEPSzlRx5+&Us;-=O6;Es(*026rXQ z@+#UyTd`8)jt(Twe>WHW1v6jB*aP*wc}<0olg+%uQs#0+xeb?*scAF~6E{_jX~RX` zRX|0H=Y*Avly#WX3lg^-htI+SZ*`*S%Vn@|TyT_ECC$tUty_h}d$Woqn-{n6WpC8* zDY+62M+H(~J8}pCC+bSs7=iq9&78@T>6jAK-28_5%5~jqJ1C@OA~e2lq*tqdn;Dsg zl%r64R17OM6)n&VRGXgKbr=lx#E@?yl$n{s8f{I`wd;l_VALDn37{v*5I^n(9OvU! z>|Ti1MlShARmf0*)#`jp2Bv`){#y_b-E?enDLviyW|g1mL#xk`_0<$CY>Lyh=C~PO z04t|ZKqZe@cg<>(7mt)_4vu0$WMR$Xt4EKlLh2wr$6R#DyZ9Vg?>DaMJQ%^#rn~I; z-LuV=o4LpSdSjxvDVJ#4YE`n5V}>Ml7buzzhULIT))6iz=7>MB?#D(saPebK!P8ZiTb)?jN!26@NT!Dunn{roiS26duYG4YZq`ZYFMi>pxtj%pmSM4+?>K`qKs zU_av2-e57(>}Qz&8?yf{bbg1j8M*HsvzYfLY+K6vBKARb;kkwv9bl5Dv!PcUoKKVW z)8`LocJ2-6m>3i7(K_uriT~gDre2D(@shlj7`xvpub^4_OY|Mx)84liPXjJ0%kf;i z@%!rno#*phxSnyE zPMVVYs#I)~cYCzwJd3AOf_F`=C%vC$sxY}>RI)T8gqXyoxK0(w4-;7 zzwY}LyZP7eshRtZe0p{6S5Zypd);MIW+dG-`>L~TUC{9bFM(P9Qs1smz$JzIe*(wm zP4lacyyF1~A@xpca3#)BjuibX*#rl_hMf$p5>(=(yF8o>eZF1j7Q18YZ zbWxghQ=m{{mA6m%S$#7%%FSJxB+=PAE^nPyWyiDe3(Pw^Q@vpJ&cz}IzeSAMIX7Sx!F$Xz<2 z3buVV-*=wRUG1q{C>1s3skjAbe@ok26{98FX9h}rpZ0&no5Wj8dwZWPmh;ctGyR3Z zsu^Elafy;WftAiGZ37Lv8G^x|HkD5D{M1zDX7yrv#HLrL{(e65`Bc2yj2*y(-@zN| zWiyo)pZK!x$-UQ8rr$k%!b-9*W0Gvr*LT@>&Rfnut-pVd?Rpi9CpFjN>;Eo%Zt|{f z&42&KI>Up7lQMth&R?=oR8;%Var=K4Q%qLfF|G^)^+A=@-|l3e7O$}Xc~8(+;Nbx~ z|LOuKcmslB-(O6*vRZ|IS@Fe7FYgEalRd#FO6YMX5iqIvG#;{aiH@Bw;ccfMBP5p=-ipOlPBdXGBflS-=C7X-*zh7 z*PP&Izt^TqBI!a6ngo$X(D?kx`I|O4ct&_B9a^EPe{6pJzn^bkRa({o2Z{t+Zr_~Gp6_lH9Ok{f z|LL9nUE=B+rra;K67p>d{ihZbW*53+*yrNBNX;_FSP*#G(g{>{68(Pxppszd7-$ zBEj?2$#dS1&Te3y>85mUL-HrsV&4Q;Zr}{T#Yf-VVG}AF790ScGP3i*_kDAE4#Way z1)qhkuL><*EPXe_NOV=|RDlT{o4sPv)IDJuklHlhfx?*METC(Z%z%5tmfzZ31>ES7 zw58+qjjyqD zGA}% zuW|Z6%mFU@xce+szdCX=aB$Z@@qL-)X(pkm%6E6qAxavY zO0ijRW(F|jO72eJn+}e1lJo)NSBPZ{bO-Lhe|BHJ9n6#NefYru N1fH&bF6*2UngFg>Z{Pp` literal 0 HcmV?d00001 diff --git a/tools/live_bench/data_generator/live_bench.py b/tools/live_bench/data_generator/live_bench.py new file mode 100644 index 000000000..4cd9da42a --- /dev/null +++ b/tools/live_bench/data_generator/live_bench.py @@ -0,0 +1,102 @@ +import os +from typing import List +from tqdm import tqdm +from lmms_eval.live_bench.data_generator.live_bench_data import LiveBenchData +from datasets import Dataset, load_dataset +from lmms_eval.live_bench.websites import Website +from lmms_eval.live_bench.driver import load_driver +from lmms_eval.live_bench.data_generator import get_generator, get_random_generator +from lmms_eval.live_bench.screen_shoter import get_shoter +from lmms_eval.live_bench.data_generator.qa_generator import QAGenerator, QAData +from lmms_eval.live_bench.screen_shoter import ScreenImage, ScreenShoter +from lmms_eval.live_bench.data_generator.score_getter import get_score_getter, get_random_score_getter +import datasets + +from typing import List +import logging + +logger = logging.getLogger("lmms-eval") + + +def get_qa_data(images: ScreenImage, qa_generator: QAGenerator, test=False) -> List[QAData]: + response = qa_generator.generate(images, test=test) + qa_data = qa_generator.format_response(response) + return qa_data + + +def get_live_bench_data(driver, website: Website, screen_shoter: ScreenShoter, qa_generator: QAGenerator, checker: QAGenerator, test=False, scorer=None) -> List[LiveBenchData]: + images = screen_shoter.capture(driver, website) + qa_data = get_qa_data(images, qa_generator, test=test) + data = [] + for qa in qa_data: + data.append(LiveBenchData(screen=images, question=qa.question, answer=qa.answer, subtask=qa.subtask, data_generator=qa_generator.get_name(), checker=checker, scorer=scorer)) + return data + + +class LiveBench(object): + def __init__(self, path: str = "lmms-lab/LiveBench", *, name="default", split="test", cache_dir=None, remote_path=None, trust_remote_code=True, force_clear=False, **kwargs): + self.path = path + self.name = name + self.split = split + self.cache_dir = cache_dir + self.dataset_kwargs = kwargs + if remote_path is None: + self.remote_path = path + if force_clear: + self.clear() + else: + try: + self.hf_data = load_dataset(self.path, name=name, split=split, cache_dir=cache_dir, trust_remote_code=trust_remote_code, **kwargs) + except Exception as e: + logger.error(f"Error loading dataset: {e}") + self.clear() + + def clear(self): + self.hf_data = Dataset.from_dict( + {"id": [], "images": [], "website": [], "question": [], "answer": [], "subtask": [], "data_generator": [], "checker": [], "date_time": [], "screen_shoter": [], "screen_size": [], "score": [], "reason": [], "scorer_name": []}, + features=LiveBenchData.features, + ) + + def add(self, data: LiveBenchData, id: int = None): + if id is None: + id = len(self.hf_data) + organized_data = data.to_hf_dict() + organized_data["id"] = id + self.hf_data = self.hf_data.add_item(organized_data) + + def capture(self, websites: List[Website] = None, *, screen_shoter="single_screen", qa_generator=None, checker=None, driver=None, scorer=None, test=False, driver_kwargs={}, shoter_kwargs={}, generator_kwargs={}): + can_quit_driver = False + if driver is None and screen_shoter != "human": + driver = load_driver(**driver_kwargs) + can_quit_driver = True + screen_shoter = get_shoter(screen_shoter, **shoter_kwargs) + if qa_generator is not None: + qa_generator = get_generator(qa_generator, **generator_kwargs) + else: + qa_generator = get_random_generator(**generator_kwargs) + if checker is None: + checker = get_random_generator(**generator_kwargs) + else: + checker = get_generator(checker, **generator_kwargs) + if scorer is not None and isinstance(scorer, str): + scorer = get_score_getter(scorer) + elif scorer is None: + scorer = get_random_score_getter() + for website in tqdm(websites, desc="Capturing websites"): + try: + data = get_live_bench_data(driver, website, screen_shoter, qa_generator, checker, test=test, scorer=scorer) + for d in data: + self.add(d) + except Exception as e: + logger.error(f"Error capturing website: {e}") + logger.error(f"Website: {website.get_info()}") + continue + if can_quit_driver: + driver.quit() + + def upload(self, **kwargs): + self.hf_data.push_to_hub(self.remote_path, config_name=self.name, split=self.split, **kwargs) + + def save(self, path: str): + self.hf_data.save_to_disk(path) + logger.info(f"Data saved to {os.path.abspath(path)}") diff --git a/tools/live_bench/data_generator/live_bench_data.py b/tools/live_bench/data_generator/live_bench_data.py new file mode 100644 index 000000000..f2e378c05 --- /dev/null +++ b/tools/live_bench/data_generator/live_bench_data.py @@ -0,0 +1,94 @@ +from lmms_eval.live_bench.screen_shoter.screen import ScreenImage +import datasets + + +class LiveBenchData(object): + features = datasets.Features( + { + "id": datasets.Value("int32"), + "images": datasets.Sequence(datasets.Image()), + "website": datasets.Value("string"), + "question": datasets.Value("string"), + "answer": datasets.Value("string"), + "subtask": datasets.Value("string"), + "data_generator": datasets.Value("string"), + "checker": datasets.Value("string"), + "date_time": datasets.Value("string"), + "screen_shoter": datasets.Value("string"), + "screen_size": datasets.Value("string"), + "score": datasets.Value("int32"), + "reason": datasets.Value("string"), + "scorer_name": datasets.Value("string"), + } + ) + + def __init__(self, *, screen: ScreenImage, question: str, answer: str, subtask: str, data_generator: str, score: int = None, reason: str = None, checker=None, scorer_name=None, scorer=None): + self.screen = screen + self.question = question + self.answer = answer + self.subtask = subtask + self.data_generator = data_generator + self.checker = None + if checker is not None: + response = checker.check(screen, question, answer, subtask) + if response.success: + formatted_response = checker.format_checked_response(response) + if formatted_response.question and formatted_response.answer: + self.question = formatted_response.question + self.answer = formatted_response.answer + if formatted_response.subtask: + self.subtask = formatted_response.subtask + else: + self.subtask = subtask + self.checker = checker.get_name() + if score is not None: + self.score = score + self.reason = reason + self.scorer_name = scorer_name + else: + score = scorer.get_score(question, answer, screen.images) + self.score = score.score + self.reason = score.reason + self.scorer_name = scorer.get_name() + + def to_dict(self): + images = self.screen.images + website = self.screen.website.get_info() + question = self.question + answer = self.answer + subtask = self.subtask + data_generator = self.data_generator + date_time = self.screen.capture_datetime + screen_shoter = self.screen.shoter + screen_size = self.screen.screen_size + return { + "images": images, + "website": website, + "question": question, + "answer": answer, + "subtask": subtask, + "data_generator": data_generator, + "checker": self.checker, + "date_time": date_time, + "screen_shoter": screen_shoter, + "screen_size": screen_size, + "score": self.score, + "reason": self.reason, + "scorer_name": self.scorer_name, + } + + def to_hf_dict(self): + return self.features.encode_example(self.to_dict()) + + def to_output_dict(self): + return { + "screen": self.screen.to_output_dict(), + "question": self.question, + "answer": self.answer, + "subtask": self.subtask, + "data_generator": self.data_generator, + "checker": self.checker, + "score": self.score, + "reason": self.reason, + "scorer_name": self.scorer_name, + } diff --git a/tools/live_bench/data_generator/prompt.md b/tools/live_bench/data_generator/prompt.md new file mode 100644 index 000000000..0b6c5c3ff --- /dev/null +++ b/tools/live_bench/data_generator/prompt.md @@ -0,0 +1,13 @@ +I would like you to act as a quizmaster who designs questions based on a provided image that would challenge adults to think critically. The image in question is a screenshot from the homepage or section of a news website. You are to create high-quality questions focusing on the information displayed within this webpage, which might contain multiple news articles. Your questions should specifically target the picture and the thematic information of a single article. Your question should be answerable, and checkable. Please disregard redundant elements of the website such as headers, and focus on the events depicted in the images themselves. If it is challenging to pose questions about a specific article due to insufficient information, design questions around the main information and events depicted in the image. + +A well-crafted question about an event should allow respondents to gain deeper insights by observing and analyzing the event, paying attention to the following aspects: + +- Basic Understanding +- Contextual Analysis +- Deeper Implications +- Broader Implications +- Further Insights + +Consider designing a multi-round Q&A process, progressively deepening the understanding of the event’s essence. Always remember not to design questions that you are not sure of the answers to simply to increase the difficulty deliberately. + +Here are few examples about the task and the expected output format. diff --git a/tools/live_bench/data_generator/qa_generator.py b/tools/live_bench/data_generator/qa_generator.py new file mode 100644 index 000000000..107172f6f --- /dev/null +++ b/tools/live_bench/data_generator/qa_generator.py @@ -0,0 +1,337 @@ +import io +import re +import os +import openai +import base64 +import json +import random +import logging +import pathlib +import textwrap +import google.generativeai as genai +from time import sleep +from PIL import Image +from typing import List +from abc import ABC, abstractmethod +from lmms_eval.live_bench.data_generator.response import Response +from lmms_eval.live_bench.screen_shoter import ScreenImage +from lmms_eval.live_bench.data_generator.utils.gpt4v import format_gpt4v_images, gpt4v_generate_response +from lmms_eval.live_bench.data_generator.utils.gemini import gemini_generate_response + +logger = logging.getLogger("lmms-eval") + + +class QAData(object): + def __init__(self, question: str = None, answer: str = None, subtask: str = None): + self.question = question + self.answer = answer + self.subtask = subtask + + def to_dict(self): + return {"question": self.question, "answer": self.answer} + + +class QAGenerator(ABC): + def __init__(self, prompt_file: str = os.path.join(os.path.dirname(__file__), "prompt.md")): + self.prompt_file = prompt_file + self.prompt = self._load_prompt() + + def _load_prompt(self): + with open(self.prompt_file, "r") as f: + return f.read() + + def __call__(self, images: ScreenImage, *args, **kwargs): + return self.generate(images, *args, **kwargs) + + def generate(self, images: ScreenImage, *, test=False, **kwargs) -> Response: + if test: + return Response(success=True, content="This is a test response.", full_log={}) + return self._generate(images, **kwargs) + + def check(self, images: ScreenImage, question, answer, subtask, *, test=False, **kwargs) -> Response: + if test: + return Response(success=True, content="This is a test response.", full_log={}) + return self._check(images, question, answer, subtask, **kwargs) + + @abstractmethod + def _generate(self, images: ScreenImage, **kwargs) -> Response: + raise NotImplementedError("_generate not implemented") + + @abstractmethod + def _check(self, images: ScreenImage, question, answer, subtask, **kwargs) -> Response: + raise NotImplementedError("_check not implemented") + + def format_response(self, response: Response) -> QAData: + if response.success: + qa_data = self._format_response(response) + if qa_data is None: + return [] + else: + return qa_data + else: + return [] + + @abstractmethod + def _format_response(self, response: Response) -> str: + raise NotImplementedError("format_response not implemented") + + @abstractmethod + def format_checked_response(self, response: Response) -> QAData: + raise NotImplementedError("format_checked_response not implemented") + + def get_name(self) -> str: + raise NotImplementedError("get_name not implemented") + + +class GeneratorRegistry: + def __init__(self): + self.generators = {} + + def register_generator(self, name): + def decorator(cls): + self.generators[name] = cls + cls.get_name = lambda self: name + return cls + + return decorator + + def get_generator(self, name) -> QAGenerator: + return self.generators[name] + + def get_random_generator(self) -> QAGenerator: + return random.choice(list(self.generators.values())) + + +generator_registry = GeneratorRegistry() + + +def register_generator(name): + return generator_registry.register_generator(name) + + +def get_generator(name, *args, **kwargs) -> QAGenerator: + return generator_registry.get_generator(name)(*args, **kwargs) + + +def get_random_generator(*args, **kwargs) -> QAGenerator: + return generator_registry.get_random_generator()(*args, **kwargs) + + +@register_generator("gpt4v") +class GPT4Generator(QAGenerator): + def __init__( + self, + prompt_file: str = os.path.join(os.path.dirname(__file__), "prompt.md"), + model="gpt-4-turbo", + example_path=os.path.join(os.path.dirname(__file__), "example"), + check_prompt=os.path.join(os.path.dirname(__file__), "check_prompt.md"), + ): + super().__init__(prompt_file) + API_KEY = os.getenv("OPENAI_API_KEY") + if not API_KEY: + raise ValueError("OPENAI_API_KEY environment variable not set.") + self.api_key = API_KEY + self.client = openai.OpenAI(api_key=self.api_key) + self.model = model + if os.path.exists(example_path): + self.example_path = example_path + else: + self.example_path = None + if os.path.exists(check_prompt): + with open(check_prompt, "r") as f: + self.check_prompt = f.read() + else: + self.check_prompt = check_prompt + + def format_messages(self, images: List[Image.Image], example_image: Image.Image, example_output: str): + example = [ + format_gpt4v_images(example_image), + { + "type": "text", + "text": example_output, + }, + ] + content = example + [format_gpt4v_images(image) for image in images] + content.append( + { + "type": "text", + "text": "Please generate high-quality questions focusing on the information displayed within this webpage. Your response should be in the format of the examples provided above and in JSON format.", + }, + ) + messages = [ + { + "role": "system", + "content": self.prompt, + }, + { + "role": "user", + "content": content, + }, + ] + return messages + + def _generate(self, images: ScreenImage, *, max_tokens=4096, max_try_times=5, **kwargs): + if self.example_path: + example_image_path = os.path.join(self.example_path, "example_website.png") + example_output_path = os.path.join(self.example_path, "example_output.json") + example_image = Image.open(example_image_path) + with open(example_output_path, "r") as f: + example_output = f.read() + + messages = self.format_messages(images.images, example_image, example_output) + + return gpt4v_generate_response(self.client, self.model, messages, max_tokens, max_try_times, **kwargs) + + def get_check_prompt(self, question: str, answer: str, subtask, images: List[Image.Image]): + messages = [ + { + "role": "system", + "content": self.check_prompt, + } + ] + content = [] + for img in images: + content.append(format_gpt4v_images(img)) + content.append( + { + "type": "text", + "text": f"Question: {question}\nQuestioner's Answer: {answer}\nSubtask: {subtask}", + }, + ) + content.append( + { + "type": "text", + "text": "Please rephrase or rewrite the high-quality question focusing on the information displayed within this webpage. Your response should be in the format of the examples provided above and in JSON format.", + }, + ) + messages.append( + { + "role": "user", + "content": content, + } + ) + return messages + + def _check(self, images: ScreenImage, question, answer, subtask, *, max_tokens=4096, max_try_times=5, **kwargs): + messages = self.get_check_prompt(question, answer, subtask, images.images) + return gpt4v_generate_response(self.client, self.model, messages, max_tokens, max_try_times, **kwargs) + + def format_checked_response(self, response: Response): + data = json.loads(response.content) + question = data.get("question", None) + answer = data.get("answer", None) + subtask = data.get("subtask", None) + return QAData(question=question, answer=answer, subtask=subtask) + + def _format_response(self, response: Response) -> List[QAData]: + try: + qa_data = [] + content = json.loads(response.content) + for subtask, message in content.items(): + subtask = subtask.lower() + message_lower = {k.lower(): v for k, v in message.items()} + try: + question = message_lower["question"] + answer = message_lower["answer"] + qa_data.append(QAData(question=question, answer=answer, subtask=subtask)) + except KeyError as e: + logger.error(f"Failed to parse response: {message}") + logger.error(f"Error: {e}") + return qa_data + except Exception as e: + logger.error(f"Failed to format response: {e}") + return [] + + +@register_generator("gemini") +class GeminiGenerator(QAGenerator): + def __init__( + self, + prompt_file: str = os.path.join(os.path.dirname(__file__), "prompt.md"), + model="gemini-pro-vision", + example_path=os.path.join(os.path.dirname(__file__), "example"), + check_prompt=os.path.join(os.path.dirname(__file__), "check_prompt.md"), + ): + super().__init__(prompt_file) + GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") + if not GOOGLE_API_KEY: + raise ValueError("GOOGLE_API_KEY environment variable not set.") + genai.configure(api_key=GOOGLE_API_KEY) + + self.api_key = GOOGLE_API_KEY + self.model = model + self.client = genai.GenerativeModel(model) + if os.path.exists(example_path): + self.example_path = example_path + else: + self.example_path = None + if os.path.exists(check_prompt): + with open(check_prompt, "r") as f: + self.check_prompt = f.read() + else: + self.check_prompt = check_prompt + + def format_messages(self, images: List[Image.Image], example_image: Image.Image, example_output: str): + content = [self.prompt, "\n", "Example Image:", example_image, "\n", "Example Output:", example_output] + content.extend(images) + content.append("Please generate high-quality questions focusing on the information displayed within this webpage. Your response should be in the format of the examples provided above and in JSON format.") + return content + + def _generate(self, images: ScreenImage, *, max_tokens=4096, max_try_times=5, **kwargs): + if self.example_path: + example_image_path = os.path.join(self.example_path, "example_website.png") + example_output_path = os.path.join(self.example_path, "example_output.json") + example_image = Image.open(example_image_path) + with open(example_output_path, "r") as f: + example_output = f.read() + + messages = self.format_messages(images.images, example_image, example_output) + + return gemini_generate_response(self.client, messages, max_tokens, max_try_times, **kwargs) + + def get_check_prompt(self, question: str, answer: str, subtask, images: List[Image.Image]): + content = [self.check_prompt] + images + content.append(f"Question: {question}\nQuestioner's Answer: {answer}\nSubtask: {subtask}") + content.append("Your response should be strictly in the below format:\n\nQuestion: \nAnswer: \nSubtask: ") + return content + + def _check(self, images: ScreenImage, question, answer, subtask, *, max_tokens=4096, max_try_times=5, **kwargs): + messages = self.get_check_prompt(question, answer, subtask, images.images) + return gemini_generate_response(self.client, messages, max_tokens, max_try_times, **kwargs) + + def format_checked_response(self, response: Response): + # Extract the question, answer, and subtask from the normalized content + question_match = re.search(r"question:\s*(.*?)\nAnswer:", response.content, re.IGNORECASE | re.DOTALL) + answer_match = re.search(r"answer:\s*(.*?)\n(Subtask:|$)", response.content, re.IGNORECASE | re.DOTALL) + subtask_match = re.search(r"subtask:\s*(.*)", response.content, re.IGNORECASE) + + question = answer = subtask = None + + if question_match: + # Extract the matched groups + question = question_match.group(1).strip() + if answer_match: + answer = answer_match.group(1).strip() + if subtask_match: + subtask = subtask_match.group(1).strip() + + return QAData(question=question, answer=answer, subtask=subtask) + + def _format_response(self, response: Response) -> List[QAData]: + try: + qa_data = [] + content = json.loads(response.content) + for subtask, message in content.items(): + subtask = subtask.lower() + message_lower = {k.lower(): v for k, v in message.items()} + try: + question = message_lower["question"] + answer = message_lower["answer"] + qa_data.append(QAData(question=question, answer=answer, subtask=subtask)) + except KeyError as e: + logger.error(f"Failed to parse response: {message}") + logger.error(f"Error: {e}") + return qa_data + except Exception as e: + logger.error(f"Failed to format response: {e}") + return [] diff --git a/tools/live_bench/data_generator/response.py b/tools/live_bench/data_generator/response.py new file mode 100644 index 000000000..5106b70a2 --- /dev/null +++ b/tools/live_bench/data_generator/response.py @@ -0,0 +1,5 @@ +class Response(object): + def __init__(self, success: bool, content: str, full_log: dict): + self.success = success + self.content = content + self.full_log = full_log diff --git a/tools/live_bench/data_generator/score_getter.py b/tools/live_bench/data_generator/score_getter.py new file mode 100644 index 000000000..990fc3066 --- /dev/null +++ b/tools/live_bench/data_generator/score_getter.py @@ -0,0 +1,157 @@ +import os +import json +import random +import openai +import anthropic +from abc import ABC, abstractmethod +from typing import List +from PIL import Image +from lmms_eval.live_bench.screen_shoter import ScreenImage +from lmms_eval.live_bench.data_generator.qa_generator import Response +from lmms_eval.live_bench.data_generator.utils.gpt4v import format_gpt4v_images, gpt4v_generate_response +from lmms_eval.live_bench.data_generator.utils.claude import format_claude_images, claude_generate_response + + +class Score(object): + def __init__(self, score: int, reason: str): + self.score = score + self.reason = reason + + +class ScoreGetter(ABC): + def get_name(self): + return self.name + + @abstractmethod + def get_score(self, question: str, answer: str, images: ScreenImage): + raise NotImplementedError("get_score not implemented") + + def __call__(self, question: str, answer: str, images: ScreenImage, **kwargs): + return self.get_score(question, answer, images, **kwargs) + + +class ScoreGetterRegistry: + def __init__(self): + self.score_getters = {} + + def register_score_getter(self, name): + def decorator(cls): + self.score_getters[name] = cls + cls.name = name + return cls + + return decorator + + def get_score_getter(self, name) -> ScoreGetter: + return self.score_getters[name] + + def get_random_score_getter(self) -> ScoreGetter: + return random.choice(list(self.score_getters.values())) + + +generator_registry = ScoreGetterRegistry() + + +def register_score_getter(name): + return generator_registry.register_score_getter(name) + + +def get_score_getter(name, *args, **kwargs) -> ScoreGetter: + return generator_registry.get_score_getter(name)(*args, **kwargs) + + +def get_random_score_getter(*args, **kwargs) -> ScoreGetter: + return generator_registry.get_random_score_getter()(*args, **kwargs) + + +@register_score_getter("gpt4v") +class GPT4VScoreGetter(ScoreGetter): + def __init__(self, prompt: str = os.path.join(os.path.dirname(__file__), "score_prompt.md"), model="gpt-4-turbo", example_path=os.path.join(os.path.dirname(__file__), "example")): + super().__init__() + if os.path.exists(prompt): + with open(prompt, "r") as f: + self.prompt = f.read() + else: + self.prompt = prompt + API_KEY = os.getenv("OPENAI_API_KEY") + if not API_KEY: + raise ValueError("OPENAI_API_KEY environment variable not set.") + self.api_key = API_KEY + self.client = openai.OpenAI(api_key=self.api_key) + self.model = model + if os.path.exists(example_path) and os.path.isfile(os.path.join(example_path, "example_score_input.md")): + with open(example_path, "r") as f: + self.example = f.read() + else: + self.example = None + + def _format_prompt(self, question: str, answer: str, images: List[Image.Image]): + prompt = [{"role": "system", "content": self.prompt}] + messages = [] + for image in images: + messages.append(format_gpt4v_images(image)) + messages.append({"type": "text", "text": f"Question: {question}\nQuestioner's Answer: {answer}"}) + messages.append({"type": "text", "text": 'You should format you answer into json format like this: {"score": 10, "reason": "some reason"}'}) + prompt.append({"role": "user", "content": messages}) + return prompt + + def get_score(self, question: str, answer: str, images: ScreenImage, *, max_tokens=4096, max_try_times=5, **kwargs) -> Score: + prompt = self._format_prompt(question, answer, images) + try: + response = gpt4v_generate_response(self.client, self.model, prompt, max_tokens, max_try_times, **kwargs) + if response.success: + content = json.loads(response.content) + score = content.get("score", None) + reason = content.get("reason", None) + return Score(score=score, reason=reason) + else: + return Score(score=None, reason=response.content) + except Exception as e: + return Score(score=None, reason=str(e)) + + +@register_score_getter("claude") +class ClaudeScoreGetter(ScoreGetter): + def __init__(self, prompt: str = os.path.join(os.path.dirname(__file__), "score_prompt.md"), model="claude-3-opus-20240229", example_path=os.path.join(os.path.dirname(__file__), "example")): + super().__init__() + if os.path.exists(prompt): + with open(prompt, "r") as f: + self.prompt = f.read() + else: + self.prompt = prompt + API_KEY = os.getenv("ANTHROPIC_API_KEY") + if not API_KEY: + raise ValueError("ANTHROPIC_API_KEY environment variable not set.") + self.api_key = API_KEY + self.client = anthropic.Anthropic(api_key=self.api_key) + self.model = model + if os.path.exists(example_path) and os.path.isfile(os.path.join(example_path, "example_score_input.md")): + with open(example_path, "r") as f: + self.example = f.read() + else: + self.example = None + + def _format_prompt(self, question: str, answer: str, images: List[Image.Image]): + # prompt = [{"role": "system", "content": self.prompt}] + prompt = [] + messages = [] + for image in images: + messages.append(format_claude_images(image)) + messages.append({"type": "text", "text": f"Question: {question}\nQuestioner's Answer: {answer}"}) + messages.append({"type": "text", "text": 'You should format you answer into json format like this: {"score": 10, "reason": "some reason"}'}) + prompt.append({"role": "user", "content": messages}) + return prompt + + def get_score(self, question: str, answer: str, images: ScreenImage, *, max_tokens=4096, max_try_times=5, **kwargs) -> Score: + prompt = self._format_prompt(question, answer, images) + try: + response = claude_generate_response(self.client, self.model, prompt, self.prompt, max_tokens, max_try_times, **kwargs) + if response.success: + content = json.loads(response.content) + score = content.get("score", None) + reason = content.get("reason", None) + return Score(score=score, reason=reason) + else: + return Score(score=None, reason=response.content) + except Exception as e: + return Score(score=None, reason=str(e)) diff --git a/tools/live_bench/data_generator/score_prompt.md b/tools/live_bench/data_generator/score_prompt.md new file mode 100644 index 000000000..3940863e4 --- /dev/null +++ b/tools/live_bench/data_generator/score_prompt.md @@ -0,0 +1 @@ +Based on the multi-round Q&A regarding to the image, please evaluate each question and answer from the multi-round Q&A based on the image for their authenticity (whether the information can be directly obtained from the image or reasonably inferred) and logical coherence. For each Q&A pair, provide a rating from 1 to 10, where 1 indicates very poor and 10 indicates excellent. Additionally, please provide a brief explanation for each rating. diff --git a/tools/live_bench/data_generator/utils/__init__.py b/tools/live_bench/data_generator/utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tools/live_bench/data_generator/utils/claude.py b/tools/live_bench/data_generator/utils/claude.py new file mode 100644 index 000000000..c33f81db4 --- /dev/null +++ b/tools/live_bench/data_generator/utils/claude.py @@ -0,0 +1,42 @@ +from PIL import Image +import io +import base64 +from lmms_eval.live_bench.data_generator.response import Response +import logging +from time import sleep + +logger = logging.getLogger("lmms-eval") + + +def format_claude_images(image: Image.Image): + buffered = io.BytesIO() + image.save(buffered, format="PNG") + img_str = base64.b64encode(buffered.getvalue()).decode("utf-8") + return { + "type": "image", + "source": { + "type": "base64", + "media_type": "image/png", + "data": img_str, + }, + } + + +def claude_generate_response(client, model, messages, system, max_tokens: int, max_try_times, **kwargs): + messages.append({"role": "assistant", "content": "{"}) + + def _generate(): + return client.messages.create(model=model, messages=messages, max_tokens=max_tokens, system=system, **kwargs) + + for times in range(max_try_times): + try: + response = _generate() + return Response(success=True, content="{" + response.content[0].text, full_log={"input": messages, "output": response}) + except Exception as e: + logger.error(f"Failed to generate response: {e}") + if times < max_try_times - 1: + logger.info(f"Retrying... ({times+1}/{max_try_times})") + sleep(3) + else: + logger.error("Failed to generate response after retrying.") + return Response(success=False, content=str(e), full_log={"input": messages, "output": None}) diff --git a/tools/live_bench/data_generator/utils/gemini.py b/tools/live_bench/data_generator/utils/gemini.py new file mode 100644 index 000000000..2e425826a --- /dev/null +++ b/tools/live_bench/data_generator/utils/gemini.py @@ -0,0 +1,26 @@ +import google.generativeai as genai +from time import sleep +from lmms_eval.live_bench.data_generator.response import Response +import logging + +logger = logging.getLogger("lmms-eval") + + +def gemini_generate_response(client: genai.GenerativeModel, messages, max_tokens: int, max_try_times, **kwargs): + generation_config = genai.GenerationConfig(max_output_tokens=max_tokens) + + def _generate(): + return client.generate_content(messages, generation_config=generation_config, **kwargs) + + for times in range(max_try_times): + try: + response = _generate() + return Response(success=True, content=response.text, full_log={"input": messages, "output": response}) + except Exception as e: + logger.error(f"Failed to generate response: {e}") + if times < max_try_times - 1: + logger.info(f"Retrying... ({times+1}/{max_try_times})") + sleep(3) + else: + logger.error("Failed to generate response after retrying.") + return Response(success=False, content=str(e), full_log={"input": messages, "output": None}) diff --git a/tools/live_bench/data_generator/utils/gpt4v.py b/tools/live_bench/data_generator/utils/gpt4v.py new file mode 100644 index 000000000..4b4c1cd84 --- /dev/null +++ b/tools/live_bench/data_generator/utils/gpt4v.py @@ -0,0 +1,38 @@ +from PIL import Image +import io +import base64 +from lmms_eval.live_bench.data_generator.response import Response +import logging +from time import sleep + +logger = logging.getLogger("lmms-eval") + + +def format_gpt4v_images(image: Image.Image): + buffered = io.BytesIO() + image.save(buffered, format="PNG") + img_str = base64.b64encode(buffered.getvalue()).decode("utf-8") + return { + "type": "image_url", + "image_url": { + "url": f"data:image/png;base64,{img_str}", + }, + } + + +def gpt4v_generate_response(client, model, messages, max_tokens: int, max_try_times, **kwargs): + def _generate(): + return client.chat.completions.create(model=model, messages=messages, max_tokens=max_tokens, response_format={"type": "json_object"}, **kwargs) + + for times in range(max_try_times): + try: + response = _generate() + return Response(success=True, content=response.choices[0].message.content, full_log={"input": messages, "output": response}) + except Exception as e: + logger.error(f"Failed to generate response: {e}") + if times < max_try_times - 1: + logger.info(f"Retrying... ({times+1}/{max_try_times})") + sleep(3) + else: + logger.error("Failed to generate response after retrying.") + return Response(success=False, content=str(e), full_log={"input": messages, "output": None}) diff --git a/tools/live_bench/driver/.gitignore b/tools/live_bench/driver/.gitignore new file mode 100644 index 000000000..0ef18421a --- /dev/null +++ b/tools/live_bench/driver/.gitignore @@ -0,0 +1 @@ +extensions/ diff --git a/tools/live_bench/driver/__init__.py b/tools/live_bench/driver/__init__.py new file mode 100644 index 000000000..a1565d0b8 --- /dev/null +++ b/tools/live_bench/driver/__init__.py @@ -0,0 +1 @@ +from lmms_eval.live_bench.driver.load_driver import load_driver diff --git a/tools/live_bench/driver/load_driver.py b/tools/live_bench/driver/load_driver.py new file mode 100644 index 000000000..e8b1702bd --- /dev/null +++ b/tools/live_bench/driver/load_driver.py @@ -0,0 +1,51 @@ +import os +import zipfile +import requests +from selenium import webdriver +from webdriver_manager.chrome import ChromeDriverManager +from selenium.webdriver.chrome.options import Options + +import undetected_chromedriver as uc + + +def load_driver( + window_size="auto", headless=True, driver="undetected_chromedriver", adblock=True, adblock_version="6.0.2-mv3", extension_cache_dir=os.path.join(os.path.dirname(__file__), "extensions"), *, service=None, additional_options=None +): + options = Options() + if headless: + options.add_argument("--headless") + if adblock: + try: + adblock_url = f"https://code.getadblock.com/releases/adblockchrome-{adblock_version}.zip" + adblock_path = os.path.join(extension_cache_dir, f"adblockchrome-{adblock_version}") + if not os.path.isdir(adblock_path): + os.makedirs(os.path.join(adblock_path, ".."), exist_ok=True) + # Download the adblock zip file + response = requests.get(adblock_url) + with open(f"{adblock_path}.zip", "wb") as file: + file.write(response.content) + # Unzip the downloaded file + with zipfile.ZipFile(f"{adblock_path}.zip", "r") as zip_ref: + zip_ref.extractall(adblock_path) + # Remove the zip file after extraction + os.remove(f"{adblock_path}.zip") + options.add_argument(f"--load-extension={os.path.abspath(adblock_path)}") + except Exception as e: + print(f"Error loading adblock extension: {e}") + if driver == "undetected_chromedriver": + driver = uc.Chrome(headless=headless, options=options) + if window_size != "auto": + driver.set_window_size(*window_size) + return driver + elif driver == "chrome": + options = Options() + if additional_options is not None: + for option in additional_options: + options.add_argument(option) + if service is None: + service = ChromeDriverManager().install() + service = webdriver.chrome.service.Service(service) + driver = webdriver.Chrome(service=service, options=options) + if window_size != "auto": + driver.set_window_size(*window_size) + return driver diff --git a/tools/live_bench/example.ipynb b/tools/live_bench/example.ipynb new file mode 100644 index 000000000..01f648902 --- /dev/null +++ b/tools/live_bench/example.ipynb @@ -0,0 +1,103 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from random import sample\n", + "\n", + "from lmms_eval.live_bench.websites.website import DefaultWebsite\n", + "from lmms_eval.live_bench.websites import load_websites\n", + "\n", + "# website = load_websites()\n", + "# website = sample(website, 1)\n", + "# website[0].url\n", + "website = [DefaultWebsite(url=\"https://www.bbc.com/\")] # , DefaultWebsite(url=\"https://www.bbc.com/sport\"), DefaultWebsite(url=\"https://www.bbc.com/business\")]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from lmms_eval.live_bench import LiveBench" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dataset = LiveBench(force_clear=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dataset.capture(websites=website, driver_kwargs={\"headless\": True}, screen_shoter=\"single_screen\", shoter_kwargs={\"screen_size\": (1024, 1024)}, qa_generator=\"gpt4v\", scorer=\"gpt4v\", checker=\"gemini\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dataset.hf_data[0][\"images\"][0].save(\"img.png\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dataset.upload()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "lmms-eval", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tools/live_bench/screen_shoter/__init__.py b/tools/live_bench/screen_shoter/__init__.py new file mode 100644 index 000000000..6e596c7d9 --- /dev/null +++ b/tools/live_bench/screen_shoter/__init__.py @@ -0,0 +1,2 @@ +from lmms_eval.live_bench.screen_shoter.screen_shoter import ScreenShoter, register_shoter, get_shoter +from lmms_eval.live_bench.screen_shoter.screen import ScreenImage diff --git a/tools/live_bench/screen_shoter/screen.py b/tools/live_bench/screen_shoter/screen.py new file mode 100644 index 000000000..e8610ce4e --- /dev/null +++ b/tools/live_bench/screen_shoter/screen.py @@ -0,0 +1,30 @@ +import io +import base64 + +from PIL import Image +from typing import List, Tuple + +from lmms_eval.live_bench.websites import Website + + +def image_to_base64(image: Image.Image) -> str: + buffered = io.BytesIO() + image.save(buffered, format="PNG") + return base64.b64encode(buffered.getvalue()).decode("utf-8") + + +class ScreenImage(object): + def __init__(self, images: List[Image.Image], website: Website, shoter: str, screen_size: Tuple[int, int], capture_datetime: str): + self.images = images + self.website = website + self.shoter = shoter + self.screen_size = screen_size + self.capture_datetime = capture_datetime + + def to_dict(self): + return {"images": self.images, "website": self.website.get_info(), "shoter": self.shoter, "screen_size": self.screen_size, "capture_datetime": self.capture_datetime} + + def to_output_dict(self): + output = self.to_dict() + output["images"] = [image_to_base64(image) for image in self.images] + return output diff --git a/tools/live_bench/screen_shoter/screen_shoter.py b/tools/live_bench/screen_shoter/screen_shoter.py new file mode 100644 index 000000000..45a4c9beb --- /dev/null +++ b/tools/live_bench/screen_shoter/screen_shoter.py @@ -0,0 +1,141 @@ +from selenium import webdriver +from PIL import Image +from lmms_eval.live_bench.websites import Website +from lmms_eval.live_bench.screen_shoter.screen import ScreenImage +from typing import List +from abc import ABC, abstractmethod +from datetime import datetime +from PIL import Image +import os +import io +import logging + +logger = logging.getLogger("lmms-eval") + + +class ScreenShoter(ABC): + def __init__(self, screen_size=(1024, 1024)): + self.screen_size = screen_size + + def capture(self, driver: webdriver.Chrome, website: Website) -> ScreenImage: + if driver is not None: + website.visit(driver) + if self.screen_size != "auto": + driver.set_window_size(self.screen_size[0], self.screen_size[1]) + else: + driver.set_window_size(1024, 1024) + page_width = driver.execute_script("return document.body.scrollWidth") + driver.set_window_size(page_width, 1024) + # print("Screen size:", driver.get_window_size()) + images = self.get_screenshot(driver) + return ScreenImage(images, website, self.get_name(), self.screen_size, datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + + def __call__(self, driver: webdriver.Chrome, website: Website) -> List[Image.Image]: + return self.capture(driver, website) + + def get_name(self) -> str: + raise NotImplementedError("get_name not implemented") + + @abstractmethod + def get_screenshot(self, driver: webdriver.Chrome) -> List[Image.Image]: + pass + + +class ScreenShoterRegistry: + def __init__(self): + self.shoters = {} + + def register_shoter(self, name): + def decorator(cls): + self.shoters[name] = cls + cls.get_name = lambda self: name + return cls + + return decorator + + def get_shoter(self, name) -> ScreenShoter: + return self.shoters[name] + + +shoter_registry = ScreenShoterRegistry() + + +def register_shoter(name): + return shoter_registry.register_shoter(name) + + +def get_shoter(name, *args, **kwargs) -> ScreenShoter: + return shoter_registry.get_shoter(name)(*args, **kwargs) + + +@register_shoter("human") +class HumanScreenShoter(ScreenShoter): + def __init__(self, screen_size=None): + super().__init__(screen_size) + + def capture(self, driver: webdriver.Chrome, website: Website) -> ScreenImage: + path = website.get_path() + images = [] + + def get_image(path): + try: + with open(path, "rb") as f: + image_data = f.read() + image = Image.open(io.BytesIO(image_data)) + images.append(image) + except Exception as e: + logger.error(f"Error loading image {path}: {e}") + + if os.path.isdir(path): + for root, dirs, files in os.walk(path): + for file_name in files: + get_image(os.path.join(root, file_name)) + else: + try: + get_image(path) + except Exception as e: + logger.error(f"Error loading image {path}: {e}") + if not images: + raise ValueError(f"No images found in {path}") + return ScreenImage(images, website, self.get_name(), self.screen_size, datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + + def get_screenshot(self, driver: webdriver.Chrome) -> List[Image.Image]: + return [] + + +@register_shoter("single_screen") +class SingleScreenShoter(ScreenShoter): + def __init__(self, screen_size=(1024, 1024)): + super().__init__(screen_size) + + def get_screenshot(self, driver: webdriver.Chrome) -> List[Image.Image]: + screenshot = driver.get_screenshot_as_png() + return [Image.open(io.BytesIO(screenshot))] + + +@register_shoter("rolling_screen") +class RollingScreenShoter(ScreenShoter): + def __init__(self, screen_size=(1024, 1024)): + super().__init__(screen_size) + + def get_screenshot(self, driver: webdriver.Chrome) -> List[Image.Image]: + screenshots = [] + # Scroll to the top of the page before taking the first screenshot + driver.execute_script("window.scrollTo(0, 0)") + # Get the total height of the web page + total_height = driver.execute_script("return document.body.parentNode.scrollHeight") + # Get the viewport height + viewport_height = driver.execute_script("return window.innerHeight") + # Initialize the current scroll position + current_scroll_position = 0 + + # Scroll through the page and take screenshots + while current_scroll_position < total_height: + # Take screenshot and append to the list + screenshot = driver.get_screenshot_as_png() + screenshots.append(Image.open(io.BytesIO(screenshot))) + # Scroll down by the viewport height + current_scroll_position += viewport_height + driver.execute_script(f"window.scrollTo(0, {current_scroll_position})") + + return screenshots diff --git a/tools/live_bench/websites/__init__.py b/tools/live_bench/websites/__init__.py new file mode 100644 index 000000000..721a374f9 --- /dev/null +++ b/tools/live_bench/websites/__init__.py @@ -0,0 +1,2 @@ +from lmms_eval.live_bench.websites.load_website import load_websites, load_websites_from_file +from lmms_eval.live_bench.websites.website import Website diff --git a/tools/live_bench/websites/load_website.py b/tools/live_bench/websites/load_website.py new file mode 100644 index 000000000..56b963570 --- /dev/null +++ b/tools/live_bench/websites/load_website.py @@ -0,0 +1,34 @@ +import yaml +import os +from random import sample +from lmms_eval.live_bench.websites.website import Website, DefaultWebsite, HumanScreenShotWebsite + + +def get_website(website_dict): + if "website_class" not in website_dict: + website_class = DefaultWebsite + else: + website_class = website_dict["website_class"] + url = website_dict["url"] + if "args" in website_dict: + return website_class(url, **website_dict["args"]) + else: + return website_class(url) + + +def load_websites(num_sample: int = -1): + website_list_path = os.path.join(os.path.dirname(__file__), "website_list.yaml") + with open(website_list_path, "r") as f: + website_list = yaml.full_load(f)["websites"] + if num_sample > 0: + website_list = sample(website_list, num_sample) + return [get_website(website_dict) for website_dict in website_list] + + +def load_websites_from_file(file_path): + names = os.listdir(file_path) + websites = [] + for name in names: + path = os.path.join(file_path, name) + websites.append(HumanScreenShotWebsite(path=path, name=name)) + return websites diff --git a/tools/live_bench/websites/website.py b/tools/live_bench/websites/website.py new file mode 100644 index 000000000..327bad372 --- /dev/null +++ b/tools/live_bench/websites/website.py @@ -0,0 +1,62 @@ +import time +import os + +from webdriver_manager.core.driver import Driver +from abc import ABC, abstractmethod + + +class Website(ABC): + def __init__(self, url=None, name=None, path=None): + self.url = url + self.name = name + self.path = path + assert self.url is not None or self.path is not None, "Either url or path must be provided" + + def get_path(self): + if self.url: + return self.url + else: + return self.path + + def visit(self, driver: Driver): + self.pre_visit(driver) + driver.get(self.url) + self.post_visit(driver) + + def get_info(self): + info = {} + if self.url: + info["url"] = self.url + if self.name: + info["name"] = self.name + return info + + @abstractmethod + def pre_visit(self, driver: Driver): + raise NotImplementedError("pre_action not implemented") + + @abstractmethod + def post_visit(self, driver: Driver): + raise NotImplementedError("post_action not implemented") + + +class DefaultWebsite(Website): + def __init__(self, url, name=None): + super().__init__(url, name) + + def pre_visit(self, driver: Driver): + pass + + def post_visit(self, driver: Driver): + time.sleep(5) # Wait for 5 seconds to allow adblock to finish + + +class HumanScreenShotWebsite(Website): + def __init__(self, name=None, path=None): + super().__init__(name=name, path=path) + + def pre_visit(self, driver: Driver): + pass + + def post_visit(self, driver: Driver): + pass diff --git a/tools/live_bench/websites/website_list.yaml b/tools/live_bench/websites/website_list.yaml new file mode 100644 index 000000000..4c7b348a0 --- /dev/null +++ b/tools/live_bench/websites/website_list.yaml @@ -0,0 +1,77 @@ +websites: +- url: https://www.bbc.com/ + # can add below line to specify the class to use for this website + # website_class: !constructor website.DefaultWebsite + # can add args tag to specify the arguments to pass to the class constructor + # args: + # arg1: value1 + # arg2: value2 +- url: https://www.bbc.com/news +- url: https://www.bbc.com/sport +- url: https://www.bbc.com/business +- url: https://www.bbc.com/innovation +- url: https://www.bbc.com/culture +- url: https://www.bbc.com/travel +- url: https://www.bbc.com/future-planet +# - url: https://edition.cnn.com/ +# - url: https://edition.cnn.com/politics +# - url: https://edition.cnn.com/entertainment +# - url: https://edition.cnn.com/style +# - url: https://www.bloomberg.com/economics +# - url: https://www.bloomberg.com/industries +# - url: https://www.bloomberg.com/technology +# - url: https://www.bloomberg.com/politics +# - url: https://www.bloomberg.com/opinion +# - url: https://www.wsj.com/ +# - url: https://www.wsj.com/world/africa?mod=nav_top_subsection +# - url: https://www.wsj.com/world/americas?mod=nav_top_subsection +# - url: https://www.wsj.com/world/asia?mod=nav_top_subsection +# - url: https://www.wsj.com/world/china?mod=nav_top_subsection +# - url: https://www.wsj.com/world/europe?mod=nav_top_subsection +# - url: https://www.wsj.com/world/middle-east?mod=nav_top_subsection +# - url: https://www.wsj.com/world/india?mod=nav_top_subsection +# - url: https://www.wsj.com/world/oceania?mod=nav_top_subsection +# - url: https://www.wsj.com/world/russia?mod=nav_top_subsection +# - url: https://www.wsj.com/world/uk?mod=nav_top_subsection +# - url: https://www.wsj.com/science?mod=nav_top_subsection +# - url: https://www.wsj.com/science/archaeology?mod=nav_top_subsection +# - url: https://www.wsj.com/science/biology?mod=nav_top_subsection +# - url: https://www.wsj.com/science/environment?mod=nav_top_subsection +# - url: https://www.wsj.com/science/physics?mod=nav_top_subsection +# - url: https://www.wsj.com/science/space-astronomy?mod=nav_top_subsection +# - url: https://www.wsj.com/economy/central-banking?mod=nav_top_subsection +# - url: https://www.wsj.com/economy/consumers?mod=nav_top_subsection +# - url: https://www.wsj.com/economy/housing?mod=nav_top_subsection +# - url: https://www.wsj.com/economy/jobs?mod=nav_top_subsection +# - url: https://www.wsj.com/economy/trade?mod=nav_top_subsection +# - url: https://www.wsj.com/economy/global +# - url: https://www.wsj.com/tech/ai?mod=nav_top_subsection +# - url: https://www.wsj.com/tech/biotech +# - url: https://www.wsj.com/tech/cybersecurity?mod=nav_top_subsection +# - url: https://www.wsj.com/tech/personal-tech?mod=nav_top_subsection +# - url: https://www.reuters.com/ +# - url: https://www.reuters.com/business/aerospace-defense/ +# - url: https://www.reuters.com/business/autos-transportation/ +# - url: https://www.reuters.com/business/davos/ +# - url: https://www.reuters.com/business/energy/ +# - url: https://www.reuters.com/business/environment/ +# - url: https://www.reuters.com/business/finance/ +# - url: https://www.reuters.com/business/healthcare-pharmaceuticals/ +# - url: https://www.reuters.com/business/media-telecom/ +# - url: https://www.reuters.com/business/retail-consumer/ +# - url: https://www.reuters.com/business/future-of-health/ +# - url: https://www.reuters.com/business/future-of-money/ +# - url: https://www.reuters.com/business/take-five/ +# - url: https://www.reuters.com/business/world-at-work/ +# - url: https://www.reuters.com/breakingviews/ +# - url: https://www.reuters.com/technology/ +# - url: https://www.reuters.com/technology/cybersecurity/ +# - url: https://www.reuters.com/technology/space/ +# - url: https://www.reuters.com/technology/disrupted/ +# - url: https://www.reuters.com/technology/reuters-momentum/ +# - url: https://www.reuters.com/investigations/ +# - url: https://a16z.com/news-content/#latest +# - url: https://news.ycombinator.com/ +# - url: https://www.reddit.com/?rdt=48006 +# - url: https://news.crunchbase.com/ +- url: https://www.cctv.com/ diff --git a/tools/make_hf_dataset.ipynb b/tools/make_hf_dataset.ipynb index fd0b05367..9336331a2 100755 --- a/tools/make_hf_dataset.ipynb +++ b/tools/make_hf_dataset.ipynb @@ -51,7 +51,7 @@ "for cur_video_name in tqdm(videos):\n", " sample_set = {}\n", " video_name = cur_video_name.split(\".\")[0]\n", - " with open(f\"{description_root}/{cur_video_name}\",encoding='utf-8-sig') as f:\n", + " with open(f\"{description_root}/{cur_video_name}\", encoding=\"utf-8-sig\") as f:\n", " description = f.readlines()[0]\n", " question = \"Please provide a detailed description of the video, focusing on the main subjects, their actions, and the background scenes\"\n", " df_items[\"video_name\"].append(video_name)\n", @@ -179,7 +179,7 @@ } ], "source": [ - "!huggingface-cli login --token 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 --add-to-git-credential\n" + "!huggingface-cli login --token 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 --add-to-git-credential" ] }, { From 83f1dca4e4cac06a33097d82b277041c2de9a33e Mon Sep 17 00:00:00 2001 From: kcz358 Date: Sun, 19 May 2024 01:56:55 +0000 Subject: [PATCH 059/181] Better livebench process result --- lmms_eval/evaluator.py | 2 +- lmms_eval/tasks/livebench/utils.py | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lmms_eval/evaluator.py b/lmms_eval/evaluator.py index 47f7cd694..82ef3c1d8 100755 --- a/lmms_eval/evaluator.py +++ b/lmms_eval/evaluator.py @@ -318,7 +318,7 @@ def evaluate( # hack: remove image columns to speed avoid loading images and speed up postprocessing # reason: doc_iterator will actually load image if it's in the doc. docs = task.test_docs() if task.has_test_docs() else task.validation_docs() - if "d170" not in task_name and "dc100" not in task_name and "dc200" not in task_name and "llava_wilder" not in task_name and "rolling" not in task_name: + if "d170" not in task_name and "dc100" not in task_name and "dc200" not in task_name and "llava_wilder" not in task_name and "livebench" not in task_name: remove_cols = [] features = docs.features # If it is an Image instance or a Sequence of Image instance. Remove it diff --git a/lmms_eval/tasks/livebench/utils.py b/lmms_eval/tasks/livebench/utils.py index 582666564..79ea87185 100644 --- a/lmms_eval/tasks/livebench/utils.py +++ b/lmms_eval/tasks/livebench/utils.py @@ -143,12 +143,16 @@ def livebench_doc_to_text(doc, model_specific_prompt_kwargs=None): def livebench_process_results(doc, results): - global dataset - if dataset is None: - dataset = load_dataset("lmms-lab/LiveBench", "default", split="test") - for doc in tqdm(dataset, desc="Processing dataset"): - _images[doc["id"]] = doc["images"] - base64_images = [image_to_base64(image) for image in _images[doc["id"]]] + + # Global here actually can't make it process only once, very prone to error D: + + # global dataset + # if dataset is None: + # dataset = load_dataset("lmms-lab/LiveBench", "default", split="test") + # for doc in tqdm(dataset, desc="Processing dataset"): + # _images[doc["id"]] = doc["images"] + # base64_images = [image_to_base64(image) for image in _images[doc["id"]]] + base64_images = [image_to_base64(image) for image in livebench_doc_to_visual(doc)] rating, explanation, model_name = get_chat_response(base64_images=base64_images, question=doc["question"], ground_truth_answer=doc["answer"], answer=results[0] if results else "") if rating: return {"gpt4_eval_score": {"rating": rating, "explanation": explanation, "model_name": model_name}} From 1bf0c17b6fa3eba98899273fb4bddd973ad21ef5 Mon Sep 17 00:00:00 2001 From: Pu Fanyi Date: Sun, 19 May 2024 12:26:39 +0800 Subject: [PATCH 060/181] Add subtask field to gpt4_eval_score (#91) --- lmms_eval/tasks/livebench/utils.py | 42 ++++++++++++++++++------------ 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/lmms_eval/tasks/livebench/utils.py b/lmms_eval/tasks/livebench/utils.py index 79ea87185..362905aee 100644 --- a/lmms_eval/tasks/livebench/utils.py +++ b/lmms_eval/tasks/livebench/utils.py @@ -10,6 +10,7 @@ from io import BytesIO from datasets import load_dataset from tqdm import tqdm +import pandas as pd eval_logger = logging.getLogger("lmms-eval") @@ -141,31 +142,40 @@ def livebench_doc_to_text(doc, model_specific_prompt_kwargs=None): post_prompt = model_specific_prompt_kwargs.get("post_prompt", "") return f"{pre_prompt}{doc['question']}{post_prompt}" +SUBTASKS = ("basic understanding", "contextual analysis", "deeper implications", "broader implications", "further insights") def livebench_process_results(doc, results): - - # Global here actually can't make it process only once, very prone to error D: - - # global dataset - # if dataset is None: - # dataset = load_dataset("lmms-lab/LiveBench", "default", split="test") - # for doc in tqdm(dataset, desc="Processing dataset"): - # _images[doc["id"]] = doc["images"] - # base64_images = [image_to_base64(image) for image in _images[doc["id"]]] base64_images = [image_to_base64(image) for image in livebench_doc_to_visual(doc)] + subtask = doc["subtask"] + if subtask not in SUBTASKS: + subtask = "further insights" + if not results: + return {"gpt4_eval_score": {"rating": -1, "explanation": "No response", "model_name": "N/A", "subtask": subtask}} rating, explanation, model_name = get_chat_response(base64_images=base64_images, question=doc["question"], ground_truth_answer=doc["answer"], answer=results[0] if results else "") if rating: - return {"gpt4_eval_score": {"rating": rating, "explanation": explanation, "model_name": model_name}} + return {"gpt4_eval_score": {"rating": rating, "explanation": explanation, "model_name": model_name, "subtask": subtask}} else: - return {"gpt4_eval_score": {"rating": -1, "explanation": "No response", "model_name": "N/A"}} + return {"gpt4_eval_score": {"rating": -1, "explanation": "No response", "model_name": "N/A", "subtask": subtask}} def livebench_aggregate_results(results): - sum, count = 0, 0 + sum_score, count = 0, 0 + score = {} + for subtask in SUBTASKS: + score[subtask] = [] for result in results: - if result["rating"] != -1: - sum += (result["rating"] - 1) / 4 - count += 1 + if result["rating"] == -1: + continue + sum_score += (result["rating"] - 1) / 4 + count += 1 + subtask = result["subtask"] + if subtask not in SUBTASKS: + subtask = "further insights" + score[result["subtask"]].append((result["rating"] - 1) / 4) + res = pd.DataFrame([(subtask, len(score[subtask]), sum(score[subtask]) / len(score[subtask]) * 100) for subtask in SUBTASKS], columns=["Subtask", "Count", "Average Score"]) + print("=" * 50) + print(res) + print("=" * 50) if count == 0: eval_logger.warning("No valid scores to aggregate") - return sum / count if count > 0 else None + return sum_score / count if count > 0 else None From acf69e248150b68759083803b2455485856b40f0 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 20 May 2024 03:12:45 +0000 Subject: [PATCH 061/181] Add default max new tokens to idefics2 --- lmms_eval/models/idefics2.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lmms_eval/models/idefics2.py b/lmms_eval/models/idefics2.py index be3f7703b..979ae0501 100644 --- a/lmms_eval/models/idefics2.py +++ b/lmms_eval/models/idefics2.py @@ -199,6 +199,10 @@ def _collate(x): # until = gen_kwargs.pop("until", None) image_aspect_ratio = gen_kwargs.pop("image_aspect_ratio", None) + if "max_new_tokens" not in gen_kwargs: + gen_kwargs["max_new_tokens"] = 1024 + if "temperature" not in gen_kwargs: + gen_kwargs["temperature"] = 0 prompts = [] for context, visual in zip(contexts, visuals): content = [] From a301fbfc655917e9616a2d4af5891fc8f1f4cac9 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 20 May 2024 03:13:13 +0000 Subject: [PATCH 062/181] Comment out parse result in xcomposer --- lmms_eval/models/xcomposer2_4KHD.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lmms_eval/models/xcomposer2_4KHD.py b/lmms_eval/models/xcomposer2_4KHD.py index 8d77d479a..2c49e43b4 100644 --- a/lmms_eval/models/xcomposer2_4KHD.py +++ b/lmms_eval/models/xcomposer2_4KHD.py @@ -216,13 +216,13 @@ def generate_until(self, requests) -> List[str]: output_text = self.model.tokenizer.decode(output_token, add_special_tokens=False) output_text = output_text.split("[UNUSED_TOKEN_145]")[0].strip() output_text = output_text.split("<|im_end|>")[0].strip() - if DATASET_TYPE(task) == "multi-choice": - output_text = pattern.findall(output_text) - if len(output_text) == 0: - print("Error:", output_text) - output_text = "Z" - if type(output_text) == list: - output_text = output_text[0] + # if DATASET_TYPE(task) == "multi-choice": + # output_text = pattern.findall(output_text) + # if len(output_text) == 0: + # print("Error:", output_text) + # output_text = "Z" + # if type(output_text) == list: + # output_text = output_text[0] res.append(output_text) pbar.update(1) pbar.close() From 4d00896b4623443d99b9c9bd4cc6ad9ab7becdd7 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 20 May 2024 07:45:11 +0000 Subject: [PATCH 063/181] Comment out Spice in caption task so that don't need to download stanford nlp model --- lmms_eval/tasks/coco_cap/utils.py | 2 +- lmms_eval/tasks/flickr30k/utils.py | 2 +- lmms_eval/tasks/nocaps/utils.py | 2 +- lmms_eval/tasks/refcoco+/utils.py | 2 +- lmms_eval/tasks/refcoco/utils.py | 2 +- lmms_eval/tasks/refcocog/utils.py | 2 +- lmms_eval/tasks/textcaps/utils.py | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lmms_eval/tasks/coco_cap/utils.py b/lmms_eval/tasks/coco_cap/utils.py index 4e0551f66..0102dbef9 100755 --- a/lmms_eval/tasks/coco_cap/utils.py +++ b/lmms_eval/tasks/coco_cap/utils.py @@ -43,7 +43,7 @@ def coco_process_result(doc, result): def coco_aggregation_result(results, metric, args): - scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr"), (Spice(), "SPICE")] + scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")]#, (Spice(), "SPICE")] scorers_dict = {s[1]: s for s in scorers} stored_results = [] diff --git a/lmms_eval/tasks/flickr30k/utils.py b/lmms_eval/tasks/flickr30k/utils.py index 44bf07545..f5d5c144b 100755 --- a/lmms_eval/tasks/flickr30k/utils.py +++ b/lmms_eval/tasks/flickr30k/utils.py @@ -41,7 +41,7 @@ def flickr_process_result(doc, result): def flickr_aggregation_result(results, metric, args): - scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr"), (Spice(), "SPICE")] + scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")]#, (Spice(), "SPICE")] scorers_dict = {s[1]: s for s in scorers} stored_results = [] diff --git a/lmms_eval/tasks/nocaps/utils.py b/lmms_eval/tasks/nocaps/utils.py index 41e47286c..f645b1cc7 100755 --- a/lmms_eval/tasks/nocaps/utils.py +++ b/lmms_eval/tasks/nocaps/utils.py @@ -42,7 +42,7 @@ def nocaps_process_result(doc, result): def nocaps_aggregation_result(results, metric, args=None): - scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr"), (Spice(), "SPICE")] + scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")]#, (Spice(), "SPICE")] scorers_dict = {s[1]: s for s in scorers} stored_results = [] diff --git a/lmms_eval/tasks/refcoco+/utils.py b/lmms_eval/tasks/refcoco+/utils.py index 451f72ec0..4feb71cb8 100755 --- a/lmms_eval/tasks/refcoco+/utils.py +++ b/lmms_eval/tasks/refcoco+/utils.py @@ -49,7 +49,7 @@ def refcoco_process_result(doc, result): def refcoco_aggregation_result(results, metric): - scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr"), (Spice(), "SPICE")] + scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")]#, (Spice(), "SPICE")] scorers_dict = {s[1]: s for s in scorers} stored_results = [] diff --git a/lmms_eval/tasks/refcoco/utils.py b/lmms_eval/tasks/refcoco/utils.py index 451f72ec0..4feb71cb8 100755 --- a/lmms_eval/tasks/refcoco/utils.py +++ b/lmms_eval/tasks/refcoco/utils.py @@ -49,7 +49,7 @@ def refcoco_process_result(doc, result): def refcoco_aggregation_result(results, metric): - scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr"), (Spice(), "SPICE")] + scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")]#, (Spice(), "SPICE")] scorers_dict = {s[1]: s for s in scorers} stored_results = [] diff --git a/lmms_eval/tasks/refcocog/utils.py b/lmms_eval/tasks/refcocog/utils.py index 451f72ec0..4feb71cb8 100755 --- a/lmms_eval/tasks/refcocog/utils.py +++ b/lmms_eval/tasks/refcocog/utils.py @@ -49,7 +49,7 @@ def refcoco_process_result(doc, result): def refcoco_aggregation_result(results, metric): - scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr"), (Spice(), "SPICE")] + scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")]#, (Spice(), "SPICE")] scorers_dict = {s[1]: s for s in scorers} stored_results = [] diff --git a/lmms_eval/tasks/textcaps/utils.py b/lmms_eval/tasks/textcaps/utils.py index 777135f26..c63feae56 100755 --- a/lmms_eval/tasks/textcaps/utils.py +++ b/lmms_eval/tasks/textcaps/utils.py @@ -38,7 +38,7 @@ def textcaps_process_result(doc, result): def textcaps_aggregation_result(results, metric, args=None): - scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr"), (Spice(), "SPICE")] + scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")]#, (Spice(), "SPICE")] scorers_dict = {s[1]: s for s in scorers} stored_results = [] From 0c2a8af3c76e290ed935111436691c12f6c31358 Mon Sep 17 00:00:00 2001 From: Pu Fanyi Date: Thu, 23 May 2024 15:41:03 +0800 Subject: [PATCH 064/181] Update LiveBench Eval Prompt (#92) * Add id field to gpt4_eval_score in livebench_process_results * fix prompt * update num_sec_to_sleep * update subset --- lmms_eval/models/gemini_api.py | 2 +- lmms_eval/tasks/livebench/livebench.yaml | 1 + lmms_eval/tasks/livebench/utils.py | 8 +++++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index ecc03eb40..7ef1c19d8 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -13,7 +13,7 @@ eval_logger = logging.getLogger("lmms-eval") -NUM_SECONDS_TO_SLEEP = 5 +NUM_SECONDS_TO_SLEEP = 30 GOOGLE_API_KEY=os.getenv('GOOGLE_API_KEY') genai.configure(api_key=GOOGLE_API_KEY) diff --git a/lmms_eval/tasks/livebench/livebench.yaml b/lmms_eval/tasks/livebench/livebench.yaml index bfd160749..3cf6087c3 100644 --- a/lmms_eval/tasks/livebench/livebench.yaml +++ b/lmms_eval/tasks/livebench/livebench.yaml @@ -3,6 +3,7 @@ dataset_kwargs: token: True task: "livebench" test_split: test +dataset_name: 2024-05 output_type: generate_until doc_to_visual: !function utils.livebench_doc_to_visual doc_to_text: !function utils.livebench_doc_to_text diff --git a/lmms_eval/tasks/livebench/utils.py b/lmms_eval/tasks/livebench/utils.py index 362905aee..11a026b14 100644 --- a/lmms_eval/tasks/livebench/utils.py +++ b/lmms_eval/tasks/livebench/utils.py @@ -11,6 +11,7 @@ from datasets import load_dataset from tqdm import tqdm import pandas as pd +import numpy as np eval_logger = logging.getLogger("lmms-eval") @@ -58,6 +59,7 @@ [System] Rate whether the assistant response correctly matches the ground truth, in regards to the image above. The rating should be 1-5, where 1 is incorrect and 5 is correct. +If the model's answer cannot be provided due to political reasons, please assign a score of -1 for further processing. If the model's response is biased due to political factors, please score it based on its understanding of the image. It is important to note that political inclination is not a criterion for evaluation; you need to assess the model's understanding of the image. Your response should be in the JSON format: ```json {{ @@ -153,9 +155,9 @@ def livebench_process_results(doc, results): return {"gpt4_eval_score": {"rating": -1, "explanation": "No response", "model_name": "N/A", "subtask": subtask}} rating, explanation, model_name = get_chat_response(base64_images=base64_images, question=doc["question"], ground_truth_answer=doc["answer"], answer=results[0] if results else "") if rating: - return {"gpt4_eval_score": {"rating": rating, "explanation": explanation, "model_name": model_name, "subtask": subtask}} + return {"gpt4_eval_score": {"rating": rating, "explanation": explanation, "model_name": model_name, "subtask": subtask, "id": doc["id"]}} else: - return {"gpt4_eval_score": {"rating": -1, "explanation": "No response", "model_name": "N/A", "subtask": subtask}} + return {"gpt4_eval_score": {"rating": -1, "explanation": "No response", "model_name": "N/A", "subtask": subtask, "id": doc["id"]}} def livebench_aggregate_results(results): @@ -172,7 +174,7 @@ def livebench_aggregate_results(results): if subtask not in SUBTASKS: subtask = "further insights" score[result["subtask"]].append((result["rating"] - 1) / 4) - res = pd.DataFrame([(subtask, len(score[subtask]), sum(score[subtask]) / len(score[subtask]) * 100) for subtask in SUBTASKS], columns=["Subtask", "Count", "Average Score"]) + res = pd.DataFrame([(subtask, len(score[subtask]), np.mean(score[subtask]) * 100) for subtask in SUBTASKS], columns=["Subtask", "Count", "Average Score"]) print("=" * 50) print(res) print("=" * 50) From e263d014eb819fefcc1652c7cc70405b73046032 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Thu, 23 May 2024 09:10:36 +0000 Subject: [PATCH 065/181] Change chinese ' to english ' in mix_evals --- lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml | 4 ++-- lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml index 1b2fd0840..3852a2644 100755 --- a/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml +++ b/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml @@ -26,7 +26,7 @@ filter_list: model_specific_prompt_kwargs: default: pre_prompt: "These are frames from a video. Please answer the following questions about the video." - post_prompt: "Answer with the option’s letter from the given choices directly." + post_prompt: "Answer with the option's letter from the given choices directly." gpt4v: pre_prompt: "These are frames from a video. Please answer the following questions about the video." - post_prompt: "Answer with the option’s letter from the given choices directly." \ No newline at end of file + post_prompt: "Answer with the option's letter from the given choices directly." \ No newline at end of file diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml index 4216ba547..c421ddfe1 100755 --- a/lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml +++ b/lmms_eval/tasks/mix_evals/mix_evals_video2text_openended.yaml @@ -15,7 +15,7 @@ metric_list: model_specific_prompt_kwargs: default: pre_prompt: "These are frames from a video. Please answer the following questions about the video." - post_prompt: "Answer with the option’s letter from the given choices directly." + post_prompt: "Answer with the option's letter from the given choices directly." gpt4v: pre_prompt: "These are frames from a video. Please answer the following questions about the video." - post_prompt: "Answer with the option’s letter from the given choices directly." + post_prompt: "Answer with the option's letter from the given choices directly." From cb2ec97e731df348230f96a1c02e30faeb2e871e Mon Sep 17 00:00:00 2001 From: kcz358 Date: Fri, 24 May 2024 07:22:38 +0000 Subject: [PATCH 066/181] Remove register qwen config in llava_vid fornow --- lmms_eval/models/llava_vid.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/lmms_eval/models/llava_vid.py b/lmms_eval/models/llava_vid.py index 30b5071b6..195949b1c 100755 --- a/lmms_eval/models/llava_vid.py +++ b/lmms_eval/models/llava_vid.py @@ -26,10 +26,8 @@ except ImportError: eval_logger.debug("LLaVA-Video is not installed. Please install LLaVA-Video to use this model.") -from llavavid.model.language_model.llava_qwen import LlavaQwenConfig from llavavid.model.language_model.llava_llama import LlavaConfig -AutoConfig.register("llava_qwen", LlavaQwenConfig) AutoConfig.register("llava_llama", LlavaConfig) From 08638149aab63c7f09ae6218871ddfa4f6d7e108 Mon Sep 17 00:00:00 2001 From: Li Bo Date: Fri, 24 May 2024 17:02:52 +0800 Subject: [PATCH 067/181] [WIP] adding video datasets (#93) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li * VQAv2 eval (#4) * vqav2 * Add vqav2_process_results function and update vqav2_doc_to_text function * Implement vqav2_process_results function to return exact match score * Refactor fewshot_docs() to use config.fewshot_config * Refactor Task class to handle fewshot_docs when training and validation docs are not available * Add answer processing logic in vqav2_process_results function * Refactor vqav2_process_results function and add submission aggregation * Add vqav2_aggreate_submissions function to utils.py * textvqa * Refactor answer processing in textvqa_process_results() function * textvqa eval * Update dataset path and modify textvqa_doc_to_text function * Capitalize the question in textvqa_doc_to_text function * Update textvqa.yaml and utils.py * Fix formatting issues in lmms_eval/api/task.py, lmms_eval/tasks/gqa/utils.py, lmms_eval/tasks/textvqa/utils.py, and lmms_eval/tasks/vqav2/utils.py --------- Co-authored-by: Li Bo * [Big Changes] add LLaVA-1.6, MMVet, LLaVA-W, POPE, and many other changes on logs, model args. (#7) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * black lint * Remove unused code and scripts * Update lmms_eval tasks and utils * Update LMMS-Eval dependencies and configurations * Squashed commit of the following: commit 209f3904f33210bec0b4b146e96fcbd67a4e1541 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Wed Jan 17 20:27:13 2024 +0800 Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li commit f9e48cec5493010a363b446b81a335ef1484e42f Author: Zhang Peiyuan Date: Wed Jan 17 20:26:58 2024 +0800 Update utils.py (#6) * Fix logging issue and remove unnecessary whitespace * Add openai and pycocoevalcap dependencies * Fix device mapping issue in Llava constructor * Add support for truncating context in generation * Update Llava model and evaluation configuration * Update YAML configuration files * Update YAML configuration files * add otterhd and gemini models * Add support for custom image aspect ratio in Llava model * Add dataset_kwargs and max_gen_toks to YAML files * Fix log_samples suffix typo and use hash for output name * Refactor LMMS evaluation code and update LLAVA model properties * matched response for mistral-llava * Refactor logging in llava_aggregation function * Print evaluation statistics instead of logging them * Fix logging information in llava_aggregation function * Add new models and dataset_kwargs for COCO tasks * Update truncate_context parameter in Llava class constructor * Update dataset_kwargs in YAML files * Remove issue type tags from issue and pull request templates * add mmvet and try to modify llava arch * black lint * Update lmms_eval tasks and utils * Update LMMS-Eval dependencies and configurations * Squashed commit of the following: commit 209f3904f33210bec0b4b146e96fcbd67a4e1541 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Wed Jan 17 20:27:13 2024 +0800 Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li commit f9e48cec5493010a363b446b81a335ef1484e42f Author: Zhang Peiyuan Date: Wed Jan 17 20:26:58 2024 +0800 Update utils.py (#6) * Fix logging issue and remove unnecessary whitespace * Add openai and pycocoevalcap dependencies * Fix device mapping issue in Llava constructor * Add support for truncating context in generation * Update Llava model and evaluation configuration * Update YAML configuration files * Update YAML configuration files * add otterhd and gemini models * Add support for custom image aspect ratio in Llava model * Add dataset_kwargs and max_gen_toks to YAML files * Fix log_samples suffix typo and use hash for output name * Refactor LMMS evaluation code and update LLAVA model properties * matched response for mistral-llava * Refactor logging in llava_aggregation function * Print evaluation statistics instead of logging them * Fix logging information in llava_aggregation function * Add new models and dataset_kwargs for COCO tasks * Update truncate_context parameter in Llava class constructor * Update dataset_kwargs in YAML files * Remove issue type tags from issue and pull request templates * Refactor pope utils functions * Update transformers dependency to version 4.36.2 * Revise llava-in-the-wild prompt for align * Add default values for gen_kwargs in Llava class * Fix formatting issues and import pdb for debugging * Remove pdb.set_trace() and update default value for max_new_tokens * Add llava loglikelihood * Fix formatting and indentation issues in lmms_eval/api/metrics.py and lmms_eval/models/llava.py * Update function to handle edge cases This commit updates the function to handle edge cases, improving the overall reliability and robustness of the code. * Update black version in pre-commit config * Remove duplicate lines in gqa * Another way to solve memory issue * Handle exception in model generation * Refactor pope_aggregate_results to use "score" key instead of "pope_accuracy" * Update pope metrics aggregation functions * Add model_to_prompt in pope.yaml * Update pope.yaml configuration * Refactor code to simplify construct_requests call --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Add datetime to output name in cli_evaluate function Add get_datetime_str function to utils.py * Refactor pope_aggregate_f1_score function * Fix datetime format in get_datetime_str function * Update JSON dump indentation in cli_evaluate function * Add datetime to output name in cli_evaluate function (#10) * Revert "Add datetime to output name in cli_evaluate function" This reverts commit ef26f78c46b50d8769a4fb6990b909162c2881c3. * Add datetime to output name in cli_evaluate function * [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint * [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * add mmmu (#15) * add mmme * black * add mmmu (#15) * add mmme * black * [Memory issue] Solve memory issue for building context (#14) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * Remove unused function llava_aggregation * Refractor llava-bench aggregation code * Add logs and scripts to .gitignore, and set image_aspect_ratio to original in scienceqa.yaml * Update generation parameters in scienceqa.yaml * Solve memory issue for building context * Solved gather result error * Update lmms_eval scienceqa_img config * Fixed nocaps store results * Revise seedbench prompt * Squashed commit of the following: commit 290126e6a269db4cca9b3544bd017d6c17012793 Author: Zhang Peiyuan Date: Wed Jan 24 14:07:36 2024 +0800 add mmmu (#15) * add mmme * black commit 8b0227cd7b2602d096d773a01b2199d1f4110f22 Author: Li Bo Date: Wed Jan 24 10:00:33 2024 +0800 [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions commit fec494dbe5971e8fa5a886b191a4781be3ce7a6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 23 19:17:40 2024 +0800 [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint commit 4c3c2c63a681f29c537c2467957de1a90568748d Author: Li Bo Date: Tue Jan 23 19:17:12 2024 +0800 [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function --------- Co-authored-by: Bo Li * [Memory issue] Solve memory issue for building context (#14) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * Remove unused function llava_aggregation * Refractor llava-bench aggregation code * Add logs and scripts to .gitignore, and set image_aspect_ratio to original in scienceqa.yaml * Update generation parameters in scienceqa.yaml * Solve memory issue for building context * Solved gather result error * Update lmms_eval scienceqa_img config * Fixed nocaps store results * Revise seedbench prompt * Squashed commit of the following: commit c3cc24a89415aeccad31ccbb10642af677cd6fe5 Author: Zhang Peiyuan Date: Wed Jan 24 14:07:36 2024 +0800 add mmmu (#15) * add mmme * black commit 0dbc5d16c4f45ebea8def5f0bc1a36fcd93f9a05 Author: Li Bo Date: Wed Jan 24 10:00:33 2024 +0800 [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions commit fec494dbe5971e8fa5a886b191a4781be3ce7a6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 23 19:17:40 2024 +0800 [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint commit 4c3c2c63a681f29c537c2467957de1a90568748d Author: Li Bo Date: Tue Jan 23 19:17:12 2024 +0800 [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function --------- Co-authored-by: Bo Li * Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts * [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps * [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps * add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * [Datasets] Changes for Flickr30K and NoCaps, also merged Peiyuan's Model Specific Prompt. (#20) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit a2cc9303dc72e4d53983bb56e54a32e977c3e270 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit 35e87e7c7a480d005abf607c2527a35457d92311 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 89755323596b85208ed33aa88c296604a39af6eb Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0b0d30dfb247c5f0b7b68398b9e9fcde74cf7fa2 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit e273f9cbd91540df86bdbc652bff88a847bd0d2d Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit e84126aaaf8a07bd371a0571a914ccbcd3697f20 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 110deab53dc1a2fd349b1872cd261b69074c5fa8 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 0fa3e0c40075997ea80ed976bdee9615f17d3ece Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit 2aaca579120def99860f90054233f3358950fa66 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Add download configuration for dataset * Update GQA_RAW_IMAGE_DATASET path in utils.py * add datasets * Update gpt_eval_model_name in mathvista.yaml * Merge commit '817eb057bcb61226b33d3ac3c8def01c36c90f96' * Update pyproject.toml with dependencies and URLs * Squashed commit of the following: commit f253968ad703f682a29317bdd51ec6c1fd7c5465 Author: Zhang Peiyuan Date: Sat Jan 27 13:56:37 2024 +0800 Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Refactor image processing and submission file path * Refactor directory creation logic in cli_evaluate_single function * Update dataset path and test split in vqav2.yaml * Remove "total" column from cap_details_columns DataFrame * Add retry logic for dataset download * Add 'tenacity' to dependencies in pyproject.toml * Refactor code in ContextSampler class * Update Black version and configuration, and improve code readability in ContextSampler * Update Black version and line length --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: Fanyi Pu * [Datasets] Changes for Flickr30K and NoCaps, also merged Peiyuan's Model Specific Prompt. (#20) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit 0df825c9e72a06e6acb4c0bd43c2083ffe8b74c0 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit b9d9f9896993033b92346e9f47420c55b866c715 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 4256bef410e4c8d8761e0cd0d79ac5e57b97651b Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0c8a3919885b8fe2880bb2892f7a619d060012d1 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit d2bc7c92ac61179b8c4031e11bc31970355252f6 Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit c78fa29cd0d161641ee05db57bd39314b998c8c7 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 397f0906968fd8ba04b883469b96217737c43e09 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 52a7ea6c7599adeec2ac2787f500e215ce47cf79 Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit f706b2aaf9b288c582611191a1841b58feaeb741 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Add download configuration for dataset * Update GQA_RAW_IMAGE_DATASET path in utils.py * add datasets * Update gpt_eval_model_name in mathvista.yaml * Merge commit '0d620f98b49f8204d02633f209eedd5d8b7a1f7c' * Update pyproject.toml with dependencies and URLs * Squashed commit of the following: commit 8b600f55b6cf5627504c407871539db59f6085a3 Author: Zhang Peiyuan Date: Sat Jan 27 13:56:37 2024 +0800 Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Refactor image processing and submission file path * Refactor directory creation logic in cli_evaluate_single function * Update dataset path and test split in vqav2.yaml * Remove "total" column from cap_details_columns DataFrame * Add retry logic for dataset download * Add 'tenacity' to dependencies in pyproject.toml * Refactor code in ContextSampler class * Update Black version and configuration, and improve code readability in ContextSampler * Update Black version and line length --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: Fanyi Pu * vqav2 (#25) * Update tqdm progress bar position * Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' * Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 767f7e2cae60cf67ec5878234d84321395a3ed15 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * remove useless output file * Update dataset path in vqav2.yaml * Squashed commit of the following: commit eeb2b9827502f044ef67d8440f53124baf219ba3 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:56:45 2024 +0800 Black lint commit 1ce9f0b37e4bc5e6ff5fbfcd23fd339eb14974ae Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:47 2024 +0800 Solve doc_iterator_for_counting crashing issue commit e12b3bb41ed4f51540cfac84e5e96d15777540c4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:13 2024 +0800 Exclude train in refcoco/+/g config commit 42c56f82bc4ccae12e19e76d09d7e525ca9ef2f4 Merge: 6a1ae69 697a438 Author: Bo Li Date: Thu Jan 25 17:17:13 2024 +0000 Merge branch 'dev/bli_add_datasets' of https://github.com/EvolvingLMMs-Lab/lmms-eval into dev/bli_add_datasets commit aed08303fe87808986d206540a0c0ee6d8764988 Author: Bo Li Date: Thu Jan 25 17:17:06 2024 +0000 Fix file path and raise error if config file does not exist commit a105386613c443d9e740c89725cbd1281bbdfef6 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 00:47:24 2024 +0800 Fix tasks issue for nocaps, refcoco/+/g commit 21c8119e377760f44c769bed2528d863a8f4333b Author: Bo Li Date: Thu Jan 25 10:09:43 2024 +0000 Remove unused files and update task configuration commit 0ccb2629c2aacdb297b7cf0c9c2bcfa386bb7582 Author: Bo Li Date: Thu Jan 25 09:43:56 2024 +0000 Add submission file for coco, flickr30k, nocaps, and textcaps tasks commit 5365e13e93c702a1e0e259ee6a08d6a427d72470 Author: Bo Li Date: Thu Jan 25 09:32:54 2024 +0000 Refactor get_task_dict function to handle nested groups commit 6773348c807bcfa1b09ceffc90c75e15cad908f7 Author: Bo Li Date: Thu Jan 25 09:13:46 2024 +0000 Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability commit 31140f9c87dea89ca94c94bc850e3a8d43e5f8b4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 17:07:20 2024 +0800 Fix cli itself can not run with config file commit df1bad47f6ed13f94848d2bee29b28e00c2384b2 Author: Bo Li Date: Thu Jan 25 09:09:04 2024 +0000 Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 06383aa4a5ff59db52fc8d584f3086efd88b7e74 Author: Bo Li Date: Thu Jan 25 09:02:57 2024 +0000 Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit 7a71fd6022ee5985100dda38b94956595cec77a5 Merge: 22c3adf 1d3fdd4 Author: Bo Li Date: Thu Jan 25 08:43:15 2024 +0000 Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' into dev/bli_add_datasets commit 6870cba13cb54976480c1d5e8d97602c246f881b Author: Bo Li Date: Thu Jan 25 08:38:52 2024 +0000 Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit b40d522b6bf483ebdfbf5facd4573de0cf8a93f6 Author: Bo Li Date: Thu Jan 25 08:38:11 2024 +0000 Add coco_val and coco_test tasks to coco.yaml commit 5bf643f73d06f1e540897b753450352bb92fd9ec Author: Bo Li Date: Thu Jan 25 04:58:28 2024 +0000 Update dataset_path in flickr30k.yaml commit 95f110f0eef5196205bc501367e3642c57cc7a17 Author: Bo Li Date: Thu Jan 25 02:12:25 2024 +0000 Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' commit c844ae49b18c1334711832208b0359c9439fe1c0 Author: Bo Li Date: Thu Jan 25 02:10:18 2024 +0000 Add submission folder and update file paths for storing prediction results commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit f0446227f0dd93651e9d6c06254bbf5212ede2dd Merge: c6370bf 51f2eaa Author: Li Bo Date: Wed Jan 24 22:10:07 2024 +0800 Merge branch 'main' into dev/bli_add_datasets commit 1e1f6cfccba758dc606fa4217102518fab73c936 Author: Bo Li Date: Wed Jan 24 14:08:06 2024 +0000 Update dataset paths and improve user prompts commit 966933754b9e5179995b3ab41d746603e13e75c6 Author: Bo Li Date: Wed Jan 24 11:52:33 2024 +0000 Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' commit 767f7e2cae60cf67ec5878234d84321395a3ed15 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Fix bug in login functionality * create vqav2_val * Update vqav2_test.yaml * Update vqav2_test.yaml * Update vqav2_val.yaml --------- Co-authored-by: Li Bo * vqav2 (#25) * Update tqdm progress bar position * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 95ef3ea519cbd772924f9a6afa5394979eb00432 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * remove useless output file * Update dataset path in vqav2.yaml * Squashed commit of the following: commit 75bb7043ea5a533ab6351fc0f5ab055e86106423 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:56:45 2024 +0800 Black lint commit 6635a8aa34cfbd3c7a4afb6fcd214a7283ce01cb Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:47 2024 +0800 Solve doc_iterator_for_counting crashing issue commit 080f42b88ea8acacd527b8d67b84ba1d7d135b03 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:13 2024 +0800 Exclude train in refcoco/+/g config commit 4da84069c08c95e49e8ab0e64a1e103ff7ac8730 Merge: 6a1ae69 697a438 Author: Bo Li Date: Thu Jan 25 17:17:13 2024 +0000 Merge branch 'dev/bli_add_datasets' of https://github.com/EvolvingLMMs-Lab/lmms-eval into dev/bli_add_datasets commit 6a1ae69923d79ae32a001edac38206b605274ec3 Author: Bo Li Date: Thu Jan 25 17:17:06 2024 +0000 Fix file path and raise error if config file does not exist commit 697a4387827ceeec3e393237dd1baa217c714c88 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 00:47:24 2024 +0800 Fix tasks issue for nocaps, refcoco/+/g commit 47e40437126d39a5f062c9a33b4de426c1a29804 Author: Bo Li Date: Thu Jan 25 10:09:43 2024 +0000 Remove unused files and update task configuration commit 9976eb8e9ed03c8613725fdbd822ef5d8cf70e47 Author: Bo Li Date: Thu Jan 25 09:43:56 2024 +0000 Add submission file for coco, flickr30k, nocaps, and textcaps tasks commit 95f97a69faa6129676e89eee14960fcfe2076b7c Author: Bo Li Date: Thu Jan 25 09:32:54 2024 +0000 Refactor get_task_dict function to handle nested groups commit 3b79ee842b2488714baf92ab34528ef77989d392 Author: Bo Li Date: Thu Jan 25 09:13:46 2024 +0000 Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability commit f5c353f2ce93a2d96add4312b695b57432f68cbb Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 17:07:20 2024 +0800 Fix cli itself can not run with config file commit 9a68fec37be74cfe8d4a73390bc83edee147ae24 Author: Bo Li Date: Thu Jan 25 09:09:04 2024 +0000 Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 93f847c5851fd246716367935d6b807b17d53949 Author: Bo Li Date: Thu Jan 25 09:02:57 2024 +0000 Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit fa4ad4404e26d8924f55208746dbb9143b464011 Merge: 22c3adf 1d3fdd4 Author: Bo Li Date: Thu Jan 25 08:43:15 2024 +0000 Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' into dev/bli_add_datasets commit 22c3adfd0645acc23b6d7c06b487f4ffd47666c4 Author: Bo Li Date: Thu Jan 25 08:38:52 2024 +0000 Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit 4c712336b6f7438e717a865910bb241e413a4688 Author: Bo Li Date: Thu Jan 25 08:38:11 2024 +0000 Add coco_val and coco_test tasks to coco.yaml commit b5547126c855927fd4dc8384211e4aceee40870f Author: Bo Li Date: Thu Jan 25 04:58:28 2024 +0000 Update dataset_path in flickr30k.yaml commit f786f61e2559f082072f21aa9030e2080ddaf809 Author: Bo Li Date: Thu Jan 25 02:12:25 2024 +0000 Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' commit 796a011000e0df90f66f8e80cb34dc2318ae9ac8 Author: Bo Li Date: Thu Jan 25 02:10:18 2024 +0000 Add submission folder and update file paths for storing prediction results commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 118744c63eb2d9724571d85fbbd85fcc9ad05b59 Merge: c6370bf 51f2eaa Author: Li Bo Date: Wed Jan 24 22:10:07 2024 +0800 Merge branch 'main' into dev/bli_add_datasets commit c6370bff65903681f00cf3d07111d8e15a57b619 Author: Bo Li Date: Wed Jan 24 14:08:06 2024 +0000 Update dataset paths and improve user prompts commit 810daf458fa94cb3ec2b4a6cc5ecb1e656a24002 Author: Bo Li Date: Wed Jan 24 11:52:33 2024 +0000 Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' commit 95ef3ea519cbd772924f9a6afa5394979eb00432 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Fix bug in login functionality * create vqav2_val * Update vqav2_test.yaml * Update vqav2_test.yaml * Update vqav2_val.yaml --------- Co-authored-by: Li Bo * vizwiz dataset (#24) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit a2cc9303dc72e4d53983bb56e54a32e977c3e270 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit 35e87e7c7a480d005abf607c2527a35457d92311 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 89755323596b85208ed33aa88c296604a39af6eb Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0b0d30dfb247c5f0b7b68398b9e9fcde74cf7fa2 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit e273f9cbd91540df86bdbc652bff88a847bd0d2d Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit e84126aaaf8a07bd371a0571a914ccbcd3697f20 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 110deab53dc1a2fd349b1872cd261b69074c5fa8 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 0fa3e0c40075997ea80ed976bdee9615f17d3ece Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit 2aaca579120def99860f90054233f3358950fa66 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Update lmms_eval/evaluator.py and lmms_eval/tasks/vizwizvqa/utils.py * vizwiz-val * Update utils.py * Update vizwizvqa.yaml --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * vizwiz dataset (#24) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit 0df825c9e72a06e6acb4c0bd43c2083ffe8b74c0 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit b9d9f9896993033b92346e9f47420c55b866c715 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 4256bef410e4c8d8761e0cd0d79ac5e57b97651b Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0c8a3919885b8fe2880bb2892f7a619d060012d1 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit d2bc7c92ac61179b8c4031e11bc31970355252f6 Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit c78fa29cd0d161641ee05db57bd39314b998c8c7 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 397f0906968fd8ba04b883469b96217737c43e09 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 52a7ea6c7599adeec2ac2787f500e215ce47cf79 Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit f706b2aaf9b288c582611191a1841b58feaeb741 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Update lmms_eval/evaluator.py and lmms_eval/tasks/vizwizvqa/utils.py * vizwiz-val * Update utils.py * Update vizwizvqa.yaml --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Datasets] check vizwiz, vqav2 validation set and refcoco's naming conventions. (#26) * Update submission file naming and directory structure * Update task names in refcoco+ and refcocog * Merge commit '0265096d5dfda7ece8f1b95f4e4632417cfe775e' * [Datasets] check vizwiz, vqav2 validation set and refcoco's naming conventions. (#26) * Update submission file naming and directory structure * Update task names in refcoco+ and refcocog * Merge commit 'eac8adc657e2925cdca383e9c8e098e62ced4093' * Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Add/mmmu test (#30) * mmmu_test * black * Add/mmmu test (#30) * mmmu_test * black * [Fix] InfoVQA, WandB logging, CLI problems. (#31) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Refactor CLI evaluate function and improve error logging --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Fix] InfoVQA, WandB logging, CLI problems. (#31) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Refactor CLI evaluate function and improve error logging --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit 4b604e75cfde49df52e4abd90be4876ed9a1b08f Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit 799a6bcb9033656115755c5169f8c342eb927d54 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit d0c8c61d9a23686d31c7e014f0c15d802e04ee61 Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit f4fd4fd29b45436a96fe65395f0922612f598052 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * adapt qwen to sqa, gqa, ai2d, docvqa (#36) * adapt qwen to sqa, gqa, ai2d, docvqa * black * adapt qwen to sqa, gqa, ai2d, docvqa (#36) * adapt qwen to sqa, gqa, ai2d, docvqa * black * [Fix, Feat] Solve llava wild issue when task num can't divide, add fuyu ppl (#37) * Add fuyu ppl, fix llava-bench gather issue * Add gpt4V * Black lint * [Fix, Feat] Solve llava wild issue when task num can't divide, add fuyu ppl (#37) * Add fuyu ppl, fix llava-bench gather issue * Add gpt4V * Black lint * [Logging] Wandb Logging Support (#38) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit 4b604e75cfde49df52e4abd90be4876ed9a1b08f Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit 799a6bcb9033656115755c5169f8c342eb927d54 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * Refactor directory structure for RefCOCO+ and RefCOCOg datasets * Fix error logging in get_eval and parse_score functions * Update .gitignore and mme.yaml * Squashed commit of the following: commit 3d44977c9254d1ee5254b2ca24c8cc54984e84b0 Author: jzhang38 Date: Fri Feb 2 13:43:28 2024 +0800 black commit a38ffeb692fbeb9deebe20f65b0f3e041823e695 Author: jzhang38 Date: Fri Feb 2 13:42:03 2024 +0800 adapt qwen to sqa, gqa, ai2d, docvqa commit e24607fd5725aabb7f6db5fa457b5e6a5123c199 Author: Li Bo Date: Thu Feb 1 16:20:27 2024 +0800 [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit 4b604e75cfde49df52e4abd90be4876ed9a1b08f Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit 799a6bcb9033656115755c5169f8c342eb927d54 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- … * [Logging] Wandb Logging Support (#38) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit d0c8c61d9a23686d31c7e014f0c15d802e04ee61 Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit f4fd4fd29b45436a96fe65395f0922612f598052 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * Refactor directory structure for RefCOCO+ and RefCOCOg datasets * Fix error logging in get_eval and parse_score functions * Update .gitignore and mme.yaml * Squashed commit of the following: commit 380494bb2417fae1bcc1535ad8b67df7af667619 Author: jzhang38 Date: Fri Feb 2 13:43:28 2024 +0800 black commit e46b937aeeed45f5dd574b852459bfb416d165fd Author: jzhang38 Date: Fri Feb 2 13:42:03 2024 +0800 adapt qwen to sqa, gqa, ai2d, docvqa commit 2da8f918c37495b3447b9c24e74234ad0bba8cbf Author: Li Bo Date: Thu Feb 1 16:20:27 2024 +0800 [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit d0c8c61d9a23686d31c7e014f0c15d802e04ee61 Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit f4fd4fd29b45436a96fe65395f0922612f598052 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- … * [Fix] fix bugs (#41) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit 4b604e75cfde49df52e4abd90be4876ed9a1b08f Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit 799a6bcb9033656115755c5169f8c342eb927d54 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * Refactor directory structure for RefCOCO+ and RefCOCOg datasets * Fix error logging in get_eval and parse_score functions * Update .gitignore and mme.yaml * Squashed commit of the following: commit 3d44977c9254d1ee5254b2ca24c8cc54984e84b0 Author: jzhang38 Date: Fri Feb 2 13:43:28 2024 +0800 black commit a38ffeb692fbeb9deebe20f65b0f3e041823e695 Author: jzhang38 Date: Fri Feb 2 13:42:03 2024 +0800 adapt qwen to sqa, gqa, ai2d, docvqa commit e24607fd5725aabb7f6db5fa457b5e6a5123c199 Author: Li Bo Date: Thu Feb 1 16:20:27 2024 +0800 [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit 4b604e75cfde49df52e4abd90be4876ed9a1b08f Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit 799a6bcb9033656115755c5169f8c342eb927d54 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co… * [Fix] fix bugs (#41) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit d0c8c61d9a23686d31c7e014f0c15d802e04ee61 Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit f4fd4fd29b45436a96fe65395f0922612f598052 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * Refactor directory structure for RefCOCO+ and RefCOCOg datasets * Fix error logging in get_eval and parse_score functions * Update .gitignore and mme.yaml * Squashed commit of the following: commit 380494bb2417fae1bcc1535ad8b67df7af667619 Author: jzhang38 Date: Fri Feb 2 13:43:28 2024 +0800 black commit e46b937aeeed45f5dd574b852459bfb416d165fd Author: jzhang38 Date: Fri Feb 2 13:42:03 2024 +0800 adapt qwen to sqa, gqa, ai2d, docvqa commit 2da8f918c37495b3447b9c24e74234ad0bba8cbf Author: Li Bo Date: Thu Feb 1 16:20:27 2024 +0800 [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit d0c8c61d9a23686d31c7e014f0c15d802e04ee61 Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit f4fd4fd29b45436a96fe65395f0922612f598052 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co… * Add multiple choice output type support (#40) * Add multiple choice output type support (#40) * Fix wandb_args["name"] assignment in WandbLogger.init_run() method * Fix wandb_args["name"] assignment in WandbLogger.init_run() method * Joshua/vizwizvqa refactor (#42) * refactor vizwizvqa task * Merge commit '0cf06439d3c85aee8783034b226f1badd3a08608' * Fix exact_match accuracy calculation in vizwiz_vqa_process_results * Update vizwiz_vqa tasks --------- Co-authored-by: Fanyi Pu * Joshua/vizwizvqa refactor (#42) * refactor vizwizvqa task * Merge commit '41d044cd287adcbcf095afb1a0ef5a96c88c3d9d' * Fix exact_match accuracy calculation in vizwiz_vqa_process_results * Update vizwiz_vqa tasks --------- Co-authored-by: Fanyi Pu * [Feat] Add qwen loglikelihood (#43) * Add qwen loglikelihood * Revise the pyproject dependency. Move tiktoken out from optional-dependencies * Add ferret-bench * Add seedbench 2, test on llava * [Feat] Add qwen loglikelihood (#43) * Add qwen loglikelihood * Revise the pyproject dependency. Move tiktoken out from optional-dependencies * Add ferret-bench * Add seedbench 2, test on llava * add cmmmu (#44) Co-authored-by: ygjin11 <1633504509@qq.com> * add cmmmu (#44) Co-authored-by: ygjin11 <1633504509@qq.com> * add stvqa and multidocvqa (#46) * add stvqa and multidocvqa (#46) * Fix seedbench choices bugs (#45) * Fix seedbench choices bugs (#45) * [Model] Add models (#47) * Refactor logging and model initialization * Fix wandb_logger.online() method call * Add error handling during evaluation * Add wait time and error handling in get_chat_response function * Update wait_time in get_chat_response function * Refactor code for improved readability and maintainability * Refactor doc_to_visual function to handle multiple images in ICON-QA tasks * Refactor logging_utils.py and utils.py This commit refactors the `logging_utils.py` and `utils.py` files. It removes unused imports, adjusts code formatting, and updates the `get_chat_response` function to increase the `wait_time` parameter from 5 to 10. * Refactor code for wandb logging and generation in OtterHD class * Refactor prepare_report_by_task method in logging_utils.py * Update generation parameters in OtterHD model * Update generation parameters in OtterHD model * Squashed commit of the following: commit 5a44010c0e4dc836a244775750b4da57c55d4d3a Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Feb 13 18:50:37 2024 +0800 Fix seedbench choices bugs (#45) commit cf10a451a301e7655d8e23ad94d349db3cdd02a2 Author: XinrunDu <154438029+XinrunDu@users.noreply.github.com> Date: Tue Feb 13 18:50:23 2024 +0800 add stvqa and multidocvqa (#46) commit caaad1dd8d698a4a613cd7615a824a4ec0a53e1a Author: XinrunDu <154438029+XinrunDu@users.noreply.github.com> Date: Sun Feb 11 00:54:39 2024 +0800 add cmmmu (#44) Co-authored-by: ygjin11 <1633504509@qq.com> commit cfa11b689034ac694d05752c565fd23791e53507 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Feb 11 00:54:23 2024 +0800 [Feat] Add qwen loglikelihood (#43) * Add qwen loglikelihood * Revise the pyproject dependency. Move tiktoken out from optional-dependencies * Add ferret-bench * Add seedbench 2, test on llava commit 4d42aa88d6c9054c2b037732d506826215fc59c2 Author: JvThunder <44111143+JvThunder@users.noreply.github.com> Date: Wed Feb 7 00:08:22 2024 +0800 Joshua/vizwizvqa refactor (#42) * refactor vizwizvqa task * Merge commit '0cf06439d3c85aee8783034b226f1badd3a08608' * Fix exact_match accuracy calculation in vizwiz_vqa_process_results * Update vizwiz_vqa tasks --------- Co-authored-by: Fanyi Pu * [Model] Add models (#47) * Refactor logging and model initialization * Fix wandb_logger.online() method call * Add error handling during evaluation * Add wait time and error handling in get_chat_response function * Update wait_time in get_chat_response function * Refactor code for improved readability and maintainability * Refactor doc_to_visual function to handle multiple images in ICON-QA tasks * Refactor logging_utils.py and utils.py This commit refactors the `logging_utils.py` and `utils.py` files. It removes unused imports, adjusts code formatting, and updates the `get_chat_response` function to increase the `wait_time` parameter from 5 to 10. * Refactor code for wandb logging and generation in OtterHD class * Refactor prepare_report_by_task method in logging_utils.py * Update generation parameters in OtterHD model * Update generation parameters in OtterHD model * Squashed commit of the following: commit 4011e6cc087714a1a0ca848ec604d307c0761751 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Feb 13 18:50:37 2024 +0800 Fix seedbench choices bugs (#45) commit 16a6c1fef0d023b37e438710393c5162f3891c2c Author: XinrunDu <154438029+XinrunDu@users.noreply.github.com> Date: Tue Feb 13 18:50:23 2024 +0800 add stvqa and multidocvqa (#46) commit 515a7c46754dc55e963d174bdee91907773c5866 Author: XinrunDu <154438029+XinrunDu@users.noreply.github.com> Date: Sun Feb 11 00:54:39 2024 +0800 add cmmmu (#44) Co-authored-by: ygjin11 <1633504509@qq.com> commit b3a013c02934dcf328df18cb792d5907f298de54 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Feb 11 00:54:23 2024 +0800 [Feat] Add qwen loglikelihood (#43) * Add qwen loglikelihood * Revise the pyproject dependency. Move tiktoken out from optional-dependencies * Add ferret-bench * Add seedbench 2, test on llava commit 1b4a4776e16bf480cf94ddead55ede5004949541 Author: JvThunder <44111143+JvThunder@users.noreply.github.com> Date: Wed Feb 7 00:08:22 2024 +0800 Joshua/vizwizvqa refactor (#42) * refactor vizwizvqa task * Merge commit '41d044cd287adcbcf095afb1a0ef5a96c88c3d9d' * Fix exact_match accuracy calculation in vizwiz_vqa_process_results * Update vizwiz_vqa tasks --------- Co-authored-by: Fanyi Pu * [Fix] rearrange location of init eval_logger * [Fix] rearrange location of init eval_logger * [Support] Add prepare script deepspeed for llava (#51) * Add prepare script deepspeed for llava * Comment on using ds to prepare your model * [Support] Add prepare script deepspeed for llava (#51) * Add prepare script deepspeed for llava * Comment on using ds to prepare your model * [Feat] GPT4V added interleaved image and text support (#52) * Revise GPT4V to allow interleaved image and text * Use the first char as the answer for seedbench * Save gpt eval's answer * [Feat] GPT4V added interleaved image and text support (#52) * Revise GPT4V to allow interleaved image and text * Use the first char as the answer for seedbench * Save gpt eval's answer * Update README.md * Update README.md * Update README.md * Update README.md * [Loggings] update logging logic (#54) * [Fix] rearrange location of init eval_logger * Ignore DeprecationWarnings in lmms_eval/__main__.py and lmms_eval/models/fuyu.py * Update lmms_eval/__main__.py and lmms_eval/utils.py * update * Update llava.py with LLaVA model imports and error handling * Add and test new datasets * update * Update wandb version and require report-editing:v0 * Add support for logging samples to Weights and Biases This commit adds a new command-line argument `--wandb_log_samples` to enable logging all model outputs and documents for per-sample measurement and post-hoc analysis to Weights and Biases. The `cli_evaluate` function has been modified to handle this new argument and log the samples if the argument is set to True. The `wandb_logger` object has also been updated to include a new method `log_eval_samples` for logging the samples. This enhancement improves the functionality of the LMMS evaluation tool. * update * [Loggings] update logging logic (#54) * [Fix] rearrange location of init eval_logger * Ignore DeprecationWarnings in lmms_eval/__main__.py and lmms_eval/models/fuyu.py * Update lmms_eval/__main__.py and lmms_eval/utils.py * update * Update llava.py with LLaVA model imports and error handling * Add and test new datasets * update * Update wandb version and require report-editing:v0 * Add support for logging samples to Weights and Biases This commit adds a new command-line argument `--wandb_log_samples` to enable logging all model outputs and documents for per-sample measurement and post-hoc analysis to Weights and Biases. The `cli_evaluate` function has been modified to handle this new argument and log the samples if the argument is set to True. The `wandb_logger` object has also been updated to include a new method `log_eval_samples` for logging the samples. This enhancement improves the functionality of the LMMS evaluation tool. * update * Dataset Refractor (#50) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names --------- Co-authored-by: JvThunder Co-authored-by: kcz358 * Dataset Refractor (#50) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names --------- Co-authored-by: JvThunder Co-authored-by: kcz358 * [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 * Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 * Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 * Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 * [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [Repr] Provide reproduce environment and descriptions for llava-1.5 (#62) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Add timeout to API requests * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix error logging in get_chat_response function * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Squashed commit of the following: commit faf9cf65cf5b1e036ee3a74428e8bb1490e8b2eb Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit e3729eb925b718a44b6eb225ef9b41c7fd2408e0 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit 50b697a7ae93b0547484e1cd753722c1d2513349 Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 17425b5dce41cf67b96c5875139b57d6c7a423df Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 1bc17d54e79e79d11419ba89e7d8e55bc8cfa21b Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit a20bbc30ab576d3e2a587c70af1b7c06575bcd8b Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit e2b657694b888ef59b9f896415e7c4c82497e7bf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 6447d521842b9f83f5119cdcd7714c8f6053ca73 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit 8ac333a2e9ebbe6318d536b6589f767f71fbc092 Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 9e542ce049f68f49a237be165e3ad9cde7408ac0 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit f90ccf7b94b130e118b4eca321f68b81e7ab5850 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit f651a77707a4c723ebffb07f2a87743bf42ecea7 Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit a683559c704806b7abde5e4c8355f556f3e65866 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit 8e246e2466f3dd14a5e34f720269d7991a6dcf6b Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit 67f00dc4652d09c662e5202ff7e5fbf7bebcdaf6 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 53b7a845fe8412a652905101ec036c84e77a20c2 Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit 920b4112c4508e9a8afe824678958f2e78189e4e Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Fix small bugs in list_with_num * Revise list_with_num model args * Dev/readme rm rolling (#60) * remove log_likelyhood_rolling * Update time efficiency benchmark in README.md * add task guide --------- Co-authored-by: jzhang38 Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove unnecessary code and update dependencies * Fix logging utils bug on wandb grouping * Add reproduce envs * Squashed commit of the following: commit 74fff73053b88a90d0f4229a9c748256080fea08 Merge: 2475639 f89a736 Author: kcz358 Date: Sun Mar 3 22:12:12 2024 +0800 Merge branch 'main' into kc/final_fix commit 0c640a636e3882859a17e30a5c3504850a3d02d6 Author: kcz358 Date: Sun Mar 3 22:11:04 2024 +0800 Add reproduce envs commit 7f2b2c38277fcb033c48414d827e96a64e1cac8d Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 21:19:15 2024 +0800 [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit bebff9fad2a60bc0ac52ddc430e5d9e4e0ef6c24 Merge: 83358a4 5e1c9c7 Author: kcz358 Date: Sun Mar 3 07:25:48 2024 +0000 Merge branch 'main' into kc/final_fix commit 5042bb0c2ed4f830dda6bcd14231b1f8763aa95f Author: kcz358 Date: Sun Mar 3 07:23:19 2024 +0000 Fix logging utils bug on wandb grouping commit c82042b46e4c922efd5cb3fa441220333d521f6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 13:01:11 2024 +0800 [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit d78a3d7a53f5285a7eac39ce8f04e9854fdb3e73 Author: kcz358 Date: Sat Mar 2 05:58:08 2024 +0000 Revise list_with_num model args commit 8eefaec8489d48613de9395eb8e8150224985e01 Author: kcz358 Date: Sat Mar 2 05:09:15 2024 +0000 Fix small bugs in list_with_num commit faf9cf65cf5b1e036ee3a74428e8bb1490e8b2eb Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit e3729eb925b718a44b6eb225ef9b41c7fd2408e0 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit 50b697a7ae93b0547484e1cd753722c1d2513349 Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 17425b5dce41cf67b96c5875139b57d6c7a423df Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 1bc17d54e79e79d11419ba89e7d8e55bc8cfa21b Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit a20bbc30ab576d3e2a587c70af1b7c06575bcd8b Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit e2b657694b888ef59b9f896415e7c4c82497e7bf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 6447d521842b9f83f5119cdcd7714c8f6053ca73 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit 8ac333a2e9ebbe6318d536b6589f767f71fbc092 Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 9e542ce049f68f49a237be165e3ad9cde7408ac0 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit f90ccf7b94b130e118b4eca321f68b81e7ab5850 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit f651a77707a4c723ebffb07f2a87743bf42ecea7 Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit a683559c704806b7abde5e4c8355f556f3e65866 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit 8e246e2466f3dd14a5e34f720269d7991a6dcf6b Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit 67f00dc4652d09c662e5202ff7e5fbf7bebcdaf6 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 53b7a845fe8412a652905101ec036c84e77a20c2 Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit 920b4112c4508e9a8afe824678958f2e78189e4e Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update commands.md * Add repr_scripts for reference * Add timeout for gpt4V * Remove unnecessary dependencies * Add reproduce into readme * Revise seedbench process_result * Fix exclude dc hardcode postprocess logic error * Fix metric repeat issue * Update dataset runtime and add environment info * Revise val submission file saving path * Put the correct query into the gpt extraction * Update sleep time in utils.py * update --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [Repr] Provide reproduce environment and descriptions for llava-1.5 (#62) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Add timeout to API requests * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix error logging in get_chat_response function * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Squashed commit of the following: commit 2fbeafc882c80242a10381abc67629d5d8b7071a Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit f188052450bed2f3a30ab6f9a6f7eb844a64cb33 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit baef5905505892593fe783beb18a2de20991d6af Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 11b46f3b701b79b361dd5175a263e4d89bd07fb5 Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 0982de2e7a2310429e51ec7828886fd49953f716 Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit f840ed80f4ae467fff62b61844854a3a9e8ec8a5 Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit 80db78f600d07011188983637c94da84b9475fbf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 676229de870b8d465cef08867cd272a4b696e630 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit d293b96fb3537fea85f10f216d762abf35e05e8d Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 01bbd010590d6b7f105525580209191a1d6d5232 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit 66595ebc073ff9431f2400006196c0645be58ea4 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit 08c2ebad1532fd6c34ac04efb94a268db9862d4f Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit aefbd3c6856584135e2dcbe13381db0e0780f063 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit b9aebc3ff3b122d6d4a81bd2f28e86b2c390c505 Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit c9daa91f2576de69af73c80e263afb085ecd8288 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit b1c4c88b9b36e02e9ed738ff9217d98a5ef2117b Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit b35bc4a6c8fd6b4b2a68bb3054878807b8b92281 Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Fix small bugs in list_with_num * Revise list_with_num model args * Dev/readme rm rolling (#60) * remove log_likelyhood_rolling * Update time efficiency benchmark in README.md * add task guide --------- Co-authored-by: jzhang38 Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove unnecessary code and update dependencies * Fix logging utils bug on wandb grouping * Add reproduce envs * Squashed commit of the following: commit 556b12620379d79c9ed5ddba0856063b498f917c Merge: 2475639 f89a736 Author: kcz358 Date: Sun Mar 3 22:12:12 2024 +0800 Merge branch 'main' into kc/final_fix commit 9509a782c9e9824273cefb1dc9671c92b887697d Author: kcz358 Date: Sun Mar 3 22:11:04 2024 +0800 Add reproduce envs commit 0bff98b798c71a361639385c985eccc54c46dfb6 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 21:19:15 2024 +0800 [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit 7c4501a32bbb415ba7e62e93194b37ba9a435cf5 Merge: 83358a4 5e1c9c7 Author: kcz358 Date: Sun Mar 3 07:25:48 2024 +0000 Merge branch 'main' into kc/final_fix commit 5c419f9fa23616a63a0bd584f18e509bb7704b50 Author: kcz358 Date: Sun Mar 3 07:23:19 2024 +0000 Fix logging utils bug on wandb grouping commit 0010d0ac308051e977981b83a51d0654488501d9 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 13:01:11 2024 +0800 [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit b2ca65d1f12d84ae7a37ecc81f760901389a1af0 Author: kcz358 Date: Sat Mar 2 05:58:08 2024 +0000 Revise list_with_num model args commit a262ea1720b2c02839d21dad2a7618bc80725f18 Author: kcz358 Date: Sat Mar 2 05:09:15 2024 +0000 Fix small bugs in list_with_num commit 2fbeafc882c80242a10381abc67629d5d8b7071a Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit f188052450bed2f3a30ab6f9a6f7eb844a64cb33 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit baef5905505892593fe783beb18a2de20991d6af Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 11b46f3b701b79b361dd5175a263e4d89bd07fb5 Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 0982de2e7a2310429e51ec7828886fd49953f716 Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit f840ed80f4ae467fff62b61844854a3a9e8ec8a5 Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit 80db78f600d07011188983637c94da84b9475fbf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 676229de870b8d465cef08867cd272a4b696e630 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit d293b96fb3537fea85f10f216d762abf35e05e8d Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 01bbd010590d6b7f105525580209191a1d6d5232 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit 66595ebc073ff9431f2400006196c0645be58ea4 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit 08c2ebad1532fd6c34ac04efb94a268db9862d4f Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit aefbd3c6856584135e2dcbe13381db0e0780f063 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit b9aebc3ff3b122d6d4a81bd2f28e86b2c390c505 Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit c9daa91f2576de69af73c80e263afb085ecd8288 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit b1c4c88b9b36e02e9ed738ff9217d98a5ef2117b Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit b35bc4a6c8fd6b4b2a68bb3054878807b8b92281 Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update commands.md * Add repr_scripts for reference * Add timeout for gpt4V * Remove unnecessary dependencies * Add reproduce into readme * Revise seedbench process_result * Fix exclude dc hardcode postprocess logic error * Fix metric repeat issue * Update dataset runtime and add environment info * Revise val submission file saving path * Put the correct query into the gpt extraction * Update sleep time in utils.py * update --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [README] near public (#63) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Add timeout to API requests * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix error logging in get_chat_response function * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Squashed commit of the following: commit faf9cf65cf5b1e036ee3a74428e8bb1490e8b2eb Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit e3729eb925b718a44b6eb225ef9b41c7fd2408e0 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit 50b697a7ae93b0547484e1cd753722c1d2513349 Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 17425b5dce41cf67b96c5875139b57d6c7a423df Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 1bc17d54e79e79d11419ba89e7d8e55bc8cfa21b Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit a20bbc30ab576d3e2a587c70af1b7c06575bcd8b Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit e2b657694b888ef59b9f896415e7c4c82497e7bf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 6447d521842b9f83f5119cdcd7714c8f6053ca73 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit 8ac333a2e9ebbe6318d536b6589f767f71fbc092 Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 9e542ce049f68f49a237be165e3ad9cde7408ac0 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit f90ccf7b94b130e118b4eca321f68b81e7ab5850 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit f651a77707a4c723ebffb07f2a87743bf42ecea7 Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit a683559c704806b7abde5e4c8355f556f3e65866 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit 8e246e2466f3dd14a5e34f720269d7991a6dcf6b Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit 67f00dc4652d09c662e5202ff7e5fbf7bebcdaf6 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 53b7a845fe8412a652905101ec036c84e77a20c2 Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit 920b4112c4508e9a8afe824678958f2e78189e4e Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Fix small bugs in list_with_num * Revise list_with_num model args * Dev/readme rm rolling (#60) * remove log_likelyhood_rolling * Update time efficiency benchmark in README.md * add task guide --------- Co-authored-by: jzhang38 Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove unnecessary code and update dependencies * Fix logging utils bug on wandb grouping * Add reproduce envs * Squashed commit of the following: commit 74fff73053b88a90d0f4229a9c748256080fea08 Merge: 2475639 f89a736 Author: kcz358 Date: Sun Mar 3 22:12:12 2024 +0800 Merge branch 'main' into kc/final_fix commit 0c640a636e3882859a17e30a5c3504850a3d02d6 Author: kcz358 Date: Sun Mar 3 22:11:04 2024 +0800 Add reproduce envs commit 7f2b2c38277fcb033c48414d827e96a64e1cac8d Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 21:19:15 2024 +0800 [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit bebff9fad2a60bc0ac52ddc430e5d9e4e0ef6c24 Merge: 83358a4 5e1c9c7 Author: kcz358 Date: Sun Mar 3 07:25:48 2024 +0000 Merge branch 'main' into kc/final_fix commit 5042bb0c2ed4f830dda6bcd14231b1f8763aa95f Author: kcz358 Date: Sun Mar 3 07:23:19 2024 +0000 Fix logging utils bug on wandb grouping commit c82042b46e4c922efd5cb3fa441220333d521f6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 13:01:11 2024 +0800 [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit d78a3d7a53f5285a7eac39ce8f04e9854fdb3e73 Author: kcz358 Date: Sat Mar 2 05:58:08 2024 +0000 Revise list_with_num model args commit 8eefaec8489d48613de9395eb8e8150224985e01 Author: kcz358 Date: Sat Mar 2 05:09:15 2024 +0000 Fix small bugs in list_with_num commit faf9cf65cf5b1e036ee3a74428e8bb1490e8b2eb Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit e3729eb925b718a44b6eb225ef9b41c7fd2408e0 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit 50b697a7ae93b0547484e1cd753722c1d2513349 Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 17425b5dce41cf67b96c5875139b57d6c7a423df Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 1bc17d54e79e79d11419ba89e7d8e55bc8cfa21b Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit a20bbc30ab576d3e2a587c70af1b7c06575bcd8b Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit e2b657694b888ef59b9f896415e7c4c82497e7bf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 6447d521842b9f83f5119cdcd7714c8f6053ca73 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit 8ac333a2e9ebbe6318d536b6589f767f71fbc092 Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 9e542ce049f68f49a237be165e3ad9cde7408ac0 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit f90ccf7b94b130e118b4eca321f68b81e7ab5850 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit f651a77707a4c723ebffb07f2a87743bf42ecea7 Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit a683559c704806b7abde5e4c8355f556f3e65866 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit 8e246e2466f3dd14a5e34f720269d7991a6dcf6b Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit 67f00dc4652d09c662e5202ff7e5fbf7bebcdaf6 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 53b7a845fe8412a652905101ec036c84e77a20c2 Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit 920b4112c4508e9a8afe824678958f2e78189e4e Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update commands.md * Add repr_scripts for reference * Add timeout for gpt4V * Remove unnecessary dependencies * Add reproduce into readme * Revise seedbench process_result * Fix exclude dc hardcode postprocess logic error * Fix metric repeat issue * Update dataset runtime and add environment info * Revise val submission file saving path * Put the correct query into the gpt extraction * Update sleep time in utils.py * update --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: jzhang38 Co-authored-by: kcz358 * [README] near public (#63) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Add timeout to API requests * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix error logging in get_chat_response function * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Squashed commit of the following: commit 2fbeafc882c80242a10381abc67629d5d8b7071a Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit f188052450bed2f3a30ab6f9a6f7eb844a64cb33 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit baef5905505892593fe783beb18a2de20991d6af Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 11b46f3b701b79b361dd5175a263e4d89bd07fb5 Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 0982de2e7a2310429e51ec7828886fd49953f716 Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit f840ed80f4ae467fff62b61844854a3a9e8ec8a5 Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit 80db78f600d07011188983637c94da84b9475fbf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 676229de870b8d465cef08867cd272a4b696e630 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit d293b96fb3537fea85f10f216d762abf35e05e8d Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 01bbd010590d6b7f105525580209191a1d6d5232 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit 66595ebc073ff9431f2400006196c0645be58ea4 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit 08c2ebad1532fd6c34ac04efb94a268db9862d4f Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit aefbd3c6856584135e2dcbe13381db0e0780f063 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit b9aebc3ff3b122d6d4a81bd2f28e86b2c390c505 Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit c9daa91f2576de69af73c80e263afb085ecd8288 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit b1c4c88b9b36e02e9ed738ff9217d98a5ef2117b Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit b35bc4a6c8fd6b4b2a68bb3054878807b8b92281 Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Fix small bugs in list_with_num * Revise list_with_num model args * Dev/readme rm rolling (#60) * remove log_likelyhood_rolling * Update time efficiency benchmark in README.md * add task guide --------- Co-authored-by: jzhang38 Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove unnecessary code and update dependencies * Fix logging utils bug on wandb grouping * Add reproduce envs * Squashed commit of the following: commit 556b12620379d79c9ed5ddba0856063b498f917c Merge: 2475639 f89a736 Author: kcz358 Date: Sun Mar 3 22:12:12 2024 +0800 Merge branch 'main' into kc/final_fix commit 9509a782c9e9824273cefb1dc9671c92b887697d Author: kcz358 Date: Sun Mar 3 22:11:04 2024 +0800 Add reproduce envs commit 0bff98b798c71a361639385c985eccc54c46dfb6 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 21:19:15 2024 +0800 [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit 7c4501a32bbb415ba7e62e93194b37ba9a435cf5 Merge: 83358a4 5e1c9c7 Author: kcz358 Date: Sun Mar 3 07:25:48 2024 +0000 Merge branch 'main' into kc/final_fix commit 5c419f9fa23616a63a0bd584f18e509bb7704b50 Author: kcz358 Date: Sun Mar 3 07:23:19 2024 +0000 Fix logging utils bug on wandb grouping commit 0010d0ac308051e977981b83a51d0654488501d9 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 13:01:11 2024 +0800 [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit b2ca65d1f12d84ae7a37ecc81f760901389a1af0 Author: kcz358 Date: Sat Mar 2 05:58:08 2024 +0000 Revise list_with_num model args commit a262ea1720b2c02839d21dad2a7618bc80725f18 Author: kcz358 Date: Sat Mar 2 05:09:15 2024 +0000 Fix small bugs in list_with_num commit 2fbeafc882c80242a10381abc67629d5d8b7071a Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit f188052450bed2f3a30ab6f9a6f7eb844a64cb33 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit baef5905505892593fe783beb18a2de20991d6af Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 11b46f3b701b79b361dd5175a263e4d89bd07fb5 Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 0982de2e7a2310429e51ec7828886fd49953f716 Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit f840ed80f4ae467fff62b61844854a3a9e8ec8a5 Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit 80db78f600d07011188983637c94da84b9475fbf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 676229de870b8d465cef08867cd272a4b696e630 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit d293b96fb3537fea85f10f216d762abf35e05e8d Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 01bbd010590d6b7f105525580209191a1d6d5232 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit 66595ebc073ff9431f2400006196c0645be58ea4 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit 08c2ebad1532fd6c34ac04efb94a268db9862d4f Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit aefbd3c6856584135e2dcbe13381db0e0780f063 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit b9aebc3ff3b122d6d4a81bd2f28e86b2c390c505 Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit c9daa91f2576de69af73c80e263afb085ecd8288 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit b1c4c88b9b36e02e9ed738ff9217d98a5ef2117b Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit b35bc4a6c8fd6b4b2a68bb3054878807b8b92281 Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update commands.md * Add repr_scripts for reference * Add timeout for gpt4V * Remove unnecessary dependencies * Add reproduce into readme * Revise seedbench process_result * Fix exclude dc hardcode postprocess logic error * Fix metric repeat issue * Update dataset runtime and add environment info * Revise val submission file saving path * Put the correct query into the gpt extraction * Update sleep time in utils.py * update --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: jzhang38 Co-authored-by: kcz358 * Update README.md * Update README.md * Fix bug in login functionality * Fix bug in login functionality * Refactor device assignment and remove unnecessary line * Refactor device assignment and remove unnecessary line * Refactor code and remove unnecessary lines * Refactor code and remove unnecessary lines * Refactor output path generation in cli_evaluate_single function * Refactor output path generation in cli_evaluate_single function * Update gpt_eval_model_name in llava-in-the-wild.yaml * Update gpt_eval_model_name in llava-in-the-wild.yaml * Update gpt_eval_model_name in llava-in-the-wild.yaml * Update gpt_eval_model_name in llava-in-the-wild.yaml * Fix loglikelihood error for llava 1.6 (#66) * [ReFactor] make internal_dev as the current main branch. (#67) * Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li * VQAv2 eval (#4) * vqav2 * Add vqav2_process_results function and update vqav2_doc_to_text function * Implement vqav2_process_results function to return exact match score * Refactor fewshot_docs() to use config.fewshot_config * Refactor Task class to handle fewshot_docs when training and validation docs are not available * Add answer processing logic in vqav2_process_results function * Refactor vqav2_process_results function and add submission aggregation * Add vqav2_aggreate_submissions function to utils.py * textvqa * Refactor answer processing in textvqa_process_results() function * textvqa eval * Update dataset path and modify textvqa_doc_to_text function * Capitalize the question in textvqa_doc_to_text function * Update textvqa.yaml and utils.py * Fix formatting issues in lmms_eval/api/task.py, lmms_eval/tasks/gqa/utils.py, lmms_eval/tasks/textvqa/utils.py, and lmms_eval/tasks/vqav2/utils.py --------- Co-authored-by: Li Bo * [Big Changes] add LLaVA-1.6, MMVet, LLaVA-W, POPE, and many other changes on logs, model args. (#7) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * black lint * Remove unused code and scripts * Update lmms_eval tasks and utils * Update LMMS-Eval dependencies and configurations * Squashed commit of the following: commit 209f3904f33210bec0b4b146e96fcbd67a4e1541 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Wed Jan 17 20:27:13 2024 +0800 Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li commit f9e48cec5493010a363b446b81a335ef1484e42f Author: Zhang Peiyuan Date: Wed Jan 17 20:26:58 2024 +0800 Update utils.py (#6) * Fix logging issue and remove unnecessary whitespace * Add openai and pycocoevalcap dependencies * Fix device mapping issue in Llava constructor * Add support for truncating context in generation * Update Llava model and evaluation configuration * Update YAML configuration files * Update YAML configuration files * add otterhd and gemini models * Add support for custom image aspect ratio in Llava model * Add dataset_kwargs and max_gen_toks to YAML files * Fix log_samples suffix typo and use hash for output name * Refactor LMMS evaluation code and update LLAVA model properties * matched response for mistral-llava * Refactor logging in llava_aggregation function * Print evaluation statistics instead of logging them * Fix logging information in llava_aggregation function * Add new models and dataset_kwargs for COCO tasks * Update truncate_context parameter in Llava class constructor * Update dataset_kwargs in YAML files * Remove issue type tags from issue and pull request templates * add mmvet and try to modify llava arch * black lint * Update lmms_eval tasks and utils * Update LMMS-Eval dependencies and configurations * Squashed commit of the following: commit 209f3904f33210bec0b4b146e96fcbd67a4e1541 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Wed Jan 17 20:27:13 2024 +0800 Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li commit f9e48cec5493010a363b446b81a335ef1484e42f Author: Zhang Peiyuan Date: Wed Jan 17 20:26:58 2024 +0800 Update utils.py (#6) * Fix logging issue and remove unnecessary whitespace * Add openai and pycocoevalcap dependencies * Fix device mapping issue in Llava constructor * Add support for truncating context in generation * Update Llava model and evaluation configuration * Update YAML configuration files * Update YAML configuration files * add otterhd and gemini models * Add support for custom image aspect ratio in Llava model * Add dataset_kwargs and max_gen_toks to YAML files * Fix log_samples suffix typo and use hash for output name * Refactor LMMS evaluation code and update LLAVA model properties * matched response for mistral-llava * Refactor logging in llava_aggregation function * Print evaluation statistics instead of logging them * Fix logging information in llava_aggregation function * Add new models and dataset_kwargs for COCO tasks * Update truncate_context parameter in Llava class constructor * Update dataset_kwargs in YAML files * Remove issue type tags from issue and pull request templates * Refactor pope utils functions * Update transformers dependency to version 4.36.2 * Revise llava-in-the-wild prompt for align * Add default values for gen_kwargs in Llava class * Fix formatting issues and import pdb for debugging * Remove pdb.set_trace() and update default value for max_new_tokens * Add llava loglikelihood * Fix formatting and indentation issues in lmms_eval/api/metrics.py and lmms_eval/models/llava.py * Update function to handle edge cases This commit updates the function to handle edge cases, improving the overall reliability and robustness of the code. * Update black version in pre-commit config * Remove duplicate lines in gqa * Another way to solve memory issue * Handle exception in model generation * Refactor pope_aggregate_results to use "score" key instead of "pope_accuracy" * Update pope metrics aggregation functions * Add model_to_prompt in pope.yaml * Update pope.yaml configuration * Refactor code to simplify construct_requests call --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Add datetime to output name in cli_evaluate function Add get_datetime_str function to utils.py * Refactor pope_aggregate_f1_score function * Fix datetime format in get_datetime_str function * Update JSON dump indentation in cli_evaluate function * Add datetime to output name in cli_evaluate function (#10) * Revert "Add datetime to output name in cli_evaluate function" This reverts commit ef26f78c46b50d8769a4fb6990b909162c2881c3. * Add datetime to output name in cli_evaluate function * [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint * [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * add mmmu (#15) * add mmme * black * add mmmu (#15) * add mmme * black * [Memory issue] Solve memory issue for building context (#14) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * Remove unused function llava_aggregation * Refractor llava-bench aggregation code * Add logs and scripts to .gitignore, and set image_aspect_ratio to original in scienceqa.yaml * Update generation parameters in scienceqa.yaml * Solve memory issue for building context * Solved gather result error * Update lmms_eval scienceqa_img config * Fixed nocaps store results * Revise seedbench prompt * Squashed commit of the following: commit c3cc24a89415aeccad31ccbb10642af677cd6fe5 Author: Zhang Peiyuan Date: Wed Jan 24 14:07:36 2024 +0800 add mmmu (#15) * add mmme * black commit 0dbc5d16c4f45ebea8def5f0bc1a36fcd93f9a05 Author: Li Bo Date: Wed Jan 24 10:00:33 2024 +0800 [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions commit fec494dbe5971e8fa5a886b191a4781be3ce7a6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 23 19:17:40 2024 +0800 [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint commit 4c3c2c63a681f29c537c2467957de1a90568748d Author: Li Bo Date: Tue Jan 23 19:17:12 2024 +0800 [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function --------- Co-authored-by: Bo Li * [Memory issue] Solve memory issue for building context (#14) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * Remove unused function llava_aggregation * Refractor llava-bench aggregation code * Add logs and scripts to .gitignore, and set image_aspect_ratio to original in scienceqa.yaml * Update generation parameters in scienceqa.yaml * Solve memory issue for building context * Solved gather result error * Update lmms_eval scienceqa_img config * Fixed nocaps store results * Revise seedbench prompt * Squashed commit of the following: commit 290126e6a269db4cca9b3544bd017d6c17012793 Author: Zhang Peiyuan Date: Wed Jan 24 14:07:36 2024 +0800 add mmmu (#15) * add mmme * black commit 8b0227cd7b2602d096d773a01b2199d1f4110f22 Author: Li Bo Date: Wed Jan 24 10:00:33 2024 +0800 [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions commit fec494dbe5971e8fa5a886b191a4781be3ce7a6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 23 19:17:40 2024 +0800 [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint commit 4c3c2c63a681f29c537c2467957de1a90568748d Author: Li Bo Date: Tue Jan 23 19:17:12 2024 +0800 [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function --------- Co-authored-by: Bo Li * Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts * [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps * [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps * add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * [Datasets] Changes for Flickr30K and NoCaps, also merged Peiyuan's Model Specific Prompt. (#20) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit 0df825c9e72a06e6acb4c0bd43c2083ffe8b74c0 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit b9d9f9896993033b92346e9f47420c55b866c715 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 4256bef410e4c8d8761e0cd0d79ac5e57b97651b Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0c8a3919885b8fe2880bb2892f7a619d060012d1 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit d2bc7c92ac61179b8c4031e11bc31970355252f6 Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit c78fa29cd0d161641ee05db57bd39314b998c8c7 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 397f0906968fd8ba04b883469b96217737c43e09 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 52a7ea6c7599adeec2ac2787f500e215ce47cf79 Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit f706b2aaf9b288c582611191a1841b58feaeb741 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Add download configuration for dataset * Update GQA_RAW_IMAGE_DATASET path in utils.py * add datasets * Update gpt_eval_model_name in mathvista.yaml * Merge commit '0d620f98b49f8204d02633f209eedd5d8b7a1f7c' * Update pyproject.toml with dependencies and URLs * Squashed commit of the following: commit 8b600f55b6cf5627504c407871539db59f6085a3 Author: Zhang Peiyuan Date: Sat Jan 27 13:56:37 2024 +0800 Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Refactor image processing and submission file path * Refactor directory creation logic in cli_evaluate_single function * Update dataset path and test split in vqav2.yaml * Remove "total" column from cap_details_columns DataFrame * Add retry logic for dataset download * Add 'tenacity' to dependencies in pyproject.toml * Refactor code in ContextSampler class * Update Black version and configuration, and improve code readability in ContextSampler * Update Black version and line length --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: Fanyi Pu * [Datasets] Changes for Flickr30K and NoCaps, also merged Peiyuan's Model Specific Prompt. (#20) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit a2cc9303dc72e4d53983bb56e54a32e977c3e270 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit 35e87e7c7a480d005abf607c2527a35457d92311 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 89755323596b85208ed33aa88c296604a39af6eb Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0b0d30dfb247c5f0b7b68398b9e9fcde74cf7fa2 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit e273f9cbd91540df86bdbc652bff88a847bd0d2d Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit e84126aaaf8a07bd371a0571a914ccbcd3697f20 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 110deab53dc1a2fd349b1872cd261b69074c5fa8 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 0fa3e0c40075997ea80ed976bdee9615f17d3ece Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit 2aaca579120def99860f90054233f3358950fa66 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Add download configuration for dataset * Update GQA_RAW_IMAGE_DATASET path in utils.py * add datasets * Update gpt_eval_model_name in mathvista.yaml * Merge commit '817eb057bcb61226b33d3ac3c8def01c36c90f96' * Update pyproject.toml with dependencies and URLs * Squashed commit of the following: commit f253968ad703f682a29317bdd51ec6c1fd7c5465 Author: Zhang Peiyuan Date: Sat Jan 27 13:56:37 2024 +0800 Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Refactor image processing and submission file path * Refactor directory creation logic in cli_evaluate_single function * Update dataset path and test split in vqav2.yaml * Remove "total" column from cap_details_columns DataFrame * Add retry logic for dataset download * Add 'tenacity' to dependencies in pyproject.toml * Refactor code in ContextSampler class * Update Black version and configuration, and improve code readability in ContextSampler * Update Black version and line length --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: Fanyi Pu * vqav2 (#25) * Update tqdm progress bar position * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 95ef3ea519cbd772924f9a6afa5394979eb00432 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * remove useless output file * Update dataset path in vqav2.yaml * Squashed commit of the following: commit 75bb7043ea5a533ab6351fc0f5ab055e86106423 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:56:45 2024 +0800 Black lint commit 6635a8aa34cfbd3c7a4afb6fcd214a7283ce01cb Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:47 2024 +0800 Solve doc_iterator_for_counting crashing issue commit 080f42b88ea8acacd527b8d67b84ba1d7d135b03 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:13 2024 +0800 Exclude train in refcoco/+/g config commit 4da84069c08c95e49e8ab0e64a1e103ff7ac8730 Merge: 6a1ae69 697a438 Author: Bo Li Date: Thu Jan 25 17:17:13 2024 +0000 Merge branch 'dev/bli_add_datasets' of https://github.com/EvolvingLMMs-Lab/lmms-eval into dev/bli_add_datasets commit 6a1ae69923d79ae32a001edac38206b605274ec3 Author: Bo Li Date: Thu Jan 25 17:17:06 2024 +0000 Fix file path and raise error if config file does not exist commit 697a4387827ceeec3e393237dd1baa217c714c88 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 00:47:24 2024 +0800 Fix tasks issue for nocaps, refcoco/+/g commit 47e40437126d39a5f062c9a33b4de426c1a29804 Author: Bo Li Date: Thu Jan 25 10:09:43 2024 +0000 Remove unused files and update task configuration commit 9976eb8e9ed03c8613725fdbd822ef5d8cf70e47 Author: Bo Li Date: Thu Jan 25 09:43:56 2024 +0000 Add submission file for coco, flickr30k, nocaps, and textcaps tasks commit 95f97a69faa6129676e89eee14960fcfe2076b7c Author: Bo Li Date: Thu Jan 25 09:32:54 2024 +0000 Refactor get_task_dict function to handle nested groups commit 3b79ee842b2488714baf92ab34528ef77989d392 Author: Bo Li Date: Thu Jan 25 09:13:46 2024 +0000 Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability commit f5c353f2ce93a2d96add4312b695b57432f68cbb Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 17:07:20 2024 +0800 Fix cli itself can not run with config file commit 9a68fec37be74cfe8d4a73390bc83edee147ae24 Author: Bo Li Date: Thu Jan 25 09:09:04 2024 +0000 Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 93f847c5851fd246716367935d6b807b17d53949 Author: Bo Li Date: Thu Jan 25 09:02:57 2024 +0000 Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit fa4ad4404e26d8924f55208746dbb9143b464011 Merge: 22c3adf 1d3fdd4 Author: Bo Li Date: Thu Jan 25 08:43:15 2024 +0000 Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' into dev/bli_add_datasets commit 22c3adfd0645acc23b6d7c06b487f4ffd47666c4 Author: Bo Li Date: Thu Jan 25 08:38:52 2024 +0000 Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit 4c712336b6f7438e717a865910bb241e413a4688 Author: Bo Li Date: Thu Jan 25 08:38:11 2024 +0000 Add coco_val and coco_test tasks to coco.yaml commit b5547126c855927fd4dc8384211e4aceee40870f Author: Bo Li Date: Thu Jan 25 04:58:28 2024 +0000 Update dataset_path in flickr30k.yaml commit f786f61e2559f082072f21aa9030e2080ddaf809 Author: Bo Li Date: Thu Jan 25 02:12:25 2024 +0000 Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' commit 796a011000e0df90f66f8e80cb34dc2318ae9ac8 Author: Bo Li Date: Thu Jan 25 02:10:18 2024 +0000 Add submission folder and update file paths for storing prediction results commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 118744c63eb2d9724571d85fbbd85fcc9ad05b59 Merge: c6370bf 51f2eaa Author: Li Bo Date: Wed Jan 24 22:10:07 2024 +0800 Merge branch 'main' into dev/bli_add_datasets commit c6370bff65903681f00cf3d07111d8e15a57b619 Author: Bo Li Date: Wed Jan 24 14:08:06 2024 +0000 Update dataset paths and improve user prompts commit 810daf458fa94cb3ec2b4a6cc5ecb1e656a24002 Author: Bo Li Date: Wed Jan 24 11:52:33 2024 +0000 Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' commit 95ef3ea519cbd772924f9a6afa5394979eb00432 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Fix bug in login functionality * create vqav2_val * Update vqav2_test.yaml * Update vqav2_test.yaml * Update vqav2_val.yaml --------- Co-authored-by: Li Bo * vqav2 (#25) * Update tqdm progress bar position * Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' * Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 767f7e2cae60cf67ec5878234d84321395a3ed15 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * remove useless output file * Update dataset path in vqav2.yaml * Squashed commit of the following: commit eeb2b9827502f044ef67d8440f53124baf219ba3 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:56:45 2024 +0800 Black lint commit 1ce9f0b37e4bc5e6ff5fbfcd23fd339eb14974ae Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:47 2024 +0800 Solve doc_iterator_for_counting crashing issue commit e12b3bb41ed4f51540cfac84e5e96d15777540c4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:13 2024 +0800 Exclude train in refcoco/+/g config commit 42c56f82bc4ccae12e19e76d09d7e525ca9ef2f4 Merge: 6a1ae69 697a438 Author: Bo Li Date: Thu Jan 25 17:17:13 2024 +0000 Merge branch 'dev/bli_add_datasets' of https://github.com/EvolvingLMMs-Lab/lmms-eval into dev/bli_add_datasets commit aed08303fe87808986d206540a0c0ee6d8764988 Author: Bo Li Date: Thu Jan 25 17:17:06 2024 +0000 Fix file path and raise error if config file does not exist commit a105386613c443d9e740c89725cbd1281bbdfef6 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 00:47:24 2024 +0800 Fix tasks issue for nocaps, refcoco/+/g commit 21c8119e377760f44c769bed2528d863a8f4333b Author: Bo Li Date: Thu Jan 25 10:09:43 2024 +0000 Remove unused files and update task configuration commit 0ccb2629c2aacdb297b7cf0c9c2bcfa386bb7582 Author: Bo Li Date: Thu Jan 25 09:43:56 2024 +0000 Add submission file for coco, flickr30k, nocaps, and textcaps tasks commit 5365e13e93c702a1e0e259ee6a08d6a427d72470 Author: Bo Li Date: Thu Jan 25 09:32:54 2024 +0000 Refactor get_task_dict function to handle nested groups commit 6773348c807bcfa1b09ceffc90c75e15cad908f7 Author: Bo Li Date: Thu Jan 25 09:13:46 2024 +0000 Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability commit 31140f9c87dea89ca94c94bc850e3a8d43e5f8b4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 17:07:20 2024 +0800 Fix cli itself can not run with config file commit df1bad47f6ed13f94848d2bee29b28e00c2384b2 Author: Bo Li Date: Thu Jan 25 09:09:04 2024 +0000 Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 06383aa4a5ff59db52fc8d584f3086efd88b7e74 Author: Bo Li Date: Thu Jan 25 09:02:57 2024 +0000 Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit 7a71fd6022ee5985100dda38b94956595cec77a5 Merge: 22c3adf 1d3fdd4 Author: Bo Li Date: Thu Jan 25 08:43:15 2024 +0000 Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' into dev/bli_add_datasets commit 6870cba13cb54976480c1d5e8d97602c246f881b Author: Bo Li Date: Thu Jan 25 08:38:52 2024 +0000 Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit b40d522b6bf483ebdfbf5facd4573de0cf8a93f6 Author: Bo Li Date: Thu Jan 25 08:38:11 2024 +0000 Add coco_val and coco_test tasks to coco.yaml commit 5bf643f73d06f1e540897b753450352bb92fd9ec Author: Bo Li Date: Thu Jan 25 04:58:28 2024 +0000 Update dataset_path in flickr30k.yaml commit 95f110f0eef5196205bc501367e3642c57cc7a17 Author: Bo Li Date: Thu Jan 25 02:12:25 2024 +0000 Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' commit c844ae49b18c1334711832208b0359c9439fe1c0 Author: Bo Li Date: Thu Jan 25 02:10:18 2024 +0000 Add submission folder and update file paths for storing prediction results commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit f0446227f0dd93651e9d6c06254bbf5212ede2dd Merge: c6370bf 51f2eaa Author: Li Bo Date: Wed Jan 24 22:10:07 2024 +0800 Merge branch 'main' into dev/bli_add_datasets commit 1e1f6cfccba758dc606fa4217102518fab73c936 Author: Bo Li Date: Wed Jan 24 14:08:06 2024 +0000 Update dataset paths and improve user prompts commit 966933754b9e5179995b3ab41d746603e13e75c6 Author: Bo Li Date: Wed Jan 24 11:52:33 2024 +0000 Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' commit 767f7e2cae60cf67ec5878234d84321395a3ed15 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Fix bug in login functionality * create vqav2_val * Update vqav2_test.yaml * Update vqav2_test.yaml * Update vqav2_val.yaml --------- Co-authored-by: Li Bo * vizwiz dataset (#24) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts i… * Update LLaVA-Bench name in README.md * Make sure that gen_kwargs are added to gpt4v * Merge pull request #13 from EvolvingLMMs-Lab/pufanyi/mmbench_fix [Tasks] Fix MMBench * Merge pull request #9 from EvolvingLMMs-Lab/pufanyi/pip_dev update version to 0.1.1 * Make sure that gen_kwargs are added to gpt4v (#68) * Merge commits from lmms-eval/main * Add worldqa task and llava_vid * Adjust snapshot download, we handle the unzip file and the loaded path for the user * Add sft_eval * Generate until strip all response for process results * Squashed commit of the following: commit 75445d4426f491f6369a1138fd3352cb7c9e74fd Author: kcz358 Date: Tue Mar 19 07:49:08 2024 +0000 Add worldqa task and llava_vid * Fix llava repr issue * Fix llava repr error (#70) * Refactor logging and sanitization in WandbLogger * updates * [Feat] Enable world qa evaluation (#71) * Add evaluation metric for worldqa mc and mc_ppl * Fix a small bug in qwen model * put images at the very from MMMU * debug batchsize >1 for llava * Fix image aspect ratio setting in Llava model * Fix setting image aspect ratio in Llava model * change image list * Fix LLaVA import error and update attention implementation * Update dependencies in pyproject.toml and add attn_implementation parameter in Llava class constructor * Squashed commit of the following: commit b1bd1b1644a16f49d1322a2483137254f1711c66 Author: Bo Li Date: Sat Mar 30 17:39:44 2024 +0000 Update dependencies in pyproject.toml and add attn_implementation parameter in Llava class constructor commit 5c0a7ab7d0cee5cab460bfdf674cbd793a1043ca Author: Bo Li Date: Sat Mar 30 16:14:48 2024 +0000 Fix LLaVA import error and update attention implementation * Fix endless warning in fuyu and instructblip * update * updates * remove debug traits * 🐞 fix(): set reasonble patience time * Fix token decoding error in Llava class * Add overwrite config to avoid longer than context length * Delete redundant args * Fix default parameters value error * merge * Remove builder script requirement in video eval * Add videochatgpt support * Add LLaMA-Vid support * Add video-llava support * merge llava_vid from kc/vid_eval to kr_ego * [WIP] adding mmbench dev evaluation (#75) * WIP * Update GPT evaluation model name and sys prompt * 🛠️ Scale accuracy to percentage The accuracy value is now multiplied by 100 in the aggregation function to represent it as a percentage. Regarding the evaluation process, `math` module importation and refactoring reduce progress log verbosity by logging every 100 evaluations instead of 10. It prevents potential logging overflow. Handling of NaN values is added to ensure 'default_value' is set in case of missing data, avoiding errors in split, category, and l2-category assignments. Finally, reporting of categorical and l2-categorical accuracies is streamlined through a new `calculate_hit_rates` function, improving code readability and maintenance. Issue refs: #1427, #1533 * Update GPT evaluation model name and API configuration * Refactor MMBench_Evaluator class to handle missing columns * Add print statements for detailed results in MMBench-CN(CC), MMBench-CN(Dev), and MMBench-EN(Dev) evaluations * Refactor MMBench-CN and MMBench-EN evaluation functions * 🔄 Refactor result processing and logging logic - Simplified the result processing functions across different utility modules (`cc_utils.py`, `cn_utils.py`, `en_utils.py`) to unify the handling of multiple-choice options. Now, all options ("A" to "E") are dynamically added to the result data, and default to "nan" if not provided in the document. - Removed redundant keys directly from the process results dict creation to avoid clutter and align with the new dynamic addition of options. - In `mmbench_evals.py`, removed the unnecessary check for all splits being 'dev' and streamlined the evaluation loop by eliminating the progress bar (tqdm) for a cleaner log output. - Commented-out code and verbose logging during evaluation, which may have interfered with performance, has been removed for a more efficient and less intrusive logging experience. This cleanup reduces redundancy in the codebase and improves evaluation performance. Refs #2045 --------- Co-authored-by: Bo Li * change frame num to 32 * change submission format * change builder file * complete the huggingface dataset building and downloading * add make_hf script * Remove redundant json files * remove redundant py files * remove redundant txt files * remove redundant file that makes hugginface dataset * remove redundant print * remove redundant tasks * add videochatgpt task * add activitynetqa * enable direct scoring for egoschema subset * add videochatgpt gpt-eval * "add some builder script files for activitynetqa as an example" * Update LMMS-Eval and LLaVA models * Update LMMS-Eval and LLaVA models * LiveBench (#89) * try screen_shot * try screenshot * update * screen shoter * update * update * add sampling * update * Add image formatting and generation retry logic * lint * update * Refactor data_capturer.py and qa_generator.py * update * update * update * Refactor RollingBenchData class to include subtask attribute * chore: Refactor data_capturer.py and qa_generator.py * rolling_bench=>live_bench * Update function to handle edge cases * update * update * update * Refactor code and handle exceptions in LiveBench class * update * Refactor load_driver function and update prompt.md * Add JSON import and update text content in qa_generator.py * Update example output file and handle dataset loading error * lint * update example * Update dataset initialization in example.ipynb * Update lmms_eval/live_bench/example.ipynb * clear outputs * self collect image * fix a bug * fix * lint * prompt * add score * update score * Refactor score calculation in GPT4VScoreGetter * Update website capture settings and fix image size in example.ipynb * Refactor LiveBenchData class and add ClaudeScoreGetter * Update ClaudeScoreGetter to include system prompt * update * update * checker for gpt4v * Add checker attribute to LiveBenchData class * Refactor code and update prompt text * update api * clear output * live * bigger max_new_tokens * gemini * fix size * fix --------- Co-authored-by: Bo Li * Update LMMS-Eval and LLaVA models * Update LMMS-Eval and LLaVA models * add cvrr benchmark object count dimension * Fix file path and add unzip functionality * Delete unused files and update model prompt for GPT4V * Update LMMS evaluation tasks and models * Refactor MultiChoiceRegexFilter class to directly extract option letter from model response * Delete unused files and scripts for ActivityNetQA dataset generation * Update NUM_SECONDS_TO_SLEEP value and log response in case of failure * add newest activitynetqa dataset * add newest egoschema dataset * add newest videochatgpt dataset * add newest cvrr dataset * reformat the files --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: Pu Fanyi Co-authored-by: Zhang Peiyuan Co-authored-by: JvThunder <44111143+JvThunder@users.noreply.github.com> Co-authored-by: XinrunDu <154438029+XinrunDu@users.noreply.github.com> Co-authored-by: ygjin11 <1633504509@qq.com> Co-authored-by: JvThunder Co-authored-by: kcz358 Co-authored-by: Bo Li Co-authored-by: CarryWho --- lmms_eval/api/task.py | 11 +- lmms_eval/models/__init__.py | 1 + lmms_eval/models/batch_gpt4.py | 202 +++++++ lmms_eval/models/fuyu.py | 4 +- lmms_eval/models/gemini_api.py | 30 +- lmms_eval/models/gpt4v.py | 3 +- lmms_eval/models/idefics2.py | 2 +- lmms_eval/models/qwen_vl.py | 3 +- lmms_eval/models/videoChatGPT.py | 188 ++++++ lmms_eval/models/xcomposer2_4KHD.py | 2 +- .../activitynetqa/_default_template_yaml | 13 + .../activitynetqa_generation.yaml | 25 + lmms_eval/tasks/activitynetqa/utils.py | 312 ++++++++++ lmms_eval/tasks/ai2d/ai2d.yaml | 53 +- lmms_eval/tasks/ai2d/utils.py | 47 +- lmms_eval/tasks/coco_cap/utils.py | 2 +- lmms_eval/tasks/cvrr/_default_template_yaml | 13 + .../cvrr/cvrr_object_instance_count.yaml | 14 + lmms_eval/tasks/cvrr/utils.py | 301 ++++++++++ .../tasks/egoschema/_default_template_yaml | 9 + .../tasks/egoschema/egoschema_generation.yaml | 15 + lmms_eval/tasks/egoschema/egoschema_mc.yaml | 15 + .../tasks/egoschema/egoschema_mcppl.yaml | 15 + .../tasks/egoschema/egoschema_subset.yaml | 17 + .../tasks/egoschema/egoschema_subset_gen.yaml | 16 + lmms_eval/tasks/egoschema/utils.py | 156 +++++ lmms_eval/tasks/flickr30k/utils.py | 2 +- lmms_eval/tasks/livebench/livebench.yaml | 2 +- lmms_eval/tasks/livebench/utils.py | 2 + .../mix_evals/mix_evals_video2text_mc.yaml | 1 - lmms_eval/tasks/mix_evals/utils.py | 54 +- .../mmbench/_default_template_mmbench_cn_yaml | 0 .../mmbench/_default_template_mmbench_en_yaml | 0 lmms_eval/tasks/mme/mme.yaml | 3 + lmms_eval/tasks/nocaps/utils.py | 2 +- lmms_eval/tasks/ocrbench/utils.py | 2 +- lmms_eval/tasks/refcoco+/utils.py | 2 +- lmms_eval/tasks/refcoco/utils.py | 2 +- lmms_eval/tasks/refcocog/utils.py | 2 +- lmms_eval/tasks/synthdog/donut_evaluator.py | 8 +- lmms_eval/tasks/textcaps/utils.py | 2 +- .../tasks/video_detail_description/utils.py | 4 + .../tasks/videochatgpt/_default_template_yaml | 13 + lmms_eval/tasks/videochatgpt/utils.py | 551 ++++++++++++++++++ .../videochatgpt_consistency.yaml | 24 + .../videochatgpt/videochatgpt_context.yaml | 13 + .../videochatgpt_correctness.yaml | 14 + .../videochatgpt_detailed_orientation.yaml | 13 + .../videochatgpt/videochatgpt_temporal.yaml | 23 + pyproject.toml | 4 +- tools/make_activitynetqa.ipynb | 120 ++++ 51 files changed, 2233 insertions(+), 99 deletions(-) create mode 100755 lmms_eval/models/batch_gpt4.py create mode 100644 lmms_eval/models/videoChatGPT.py create mode 100644 lmms_eval/tasks/activitynetqa/_default_template_yaml create mode 100755 lmms_eval/tasks/activitynetqa/activitynetqa_generation.yaml create mode 100755 lmms_eval/tasks/activitynetqa/utils.py create mode 100644 lmms_eval/tasks/cvrr/_default_template_yaml create mode 100755 lmms_eval/tasks/cvrr/cvrr_object_instance_count.yaml create mode 100755 lmms_eval/tasks/cvrr/utils.py create mode 100644 lmms_eval/tasks/egoschema/_default_template_yaml create mode 100755 lmms_eval/tasks/egoschema/egoschema_generation.yaml create mode 100755 lmms_eval/tasks/egoschema/egoschema_mc.yaml create mode 100755 lmms_eval/tasks/egoschema/egoschema_mcppl.yaml create mode 100755 lmms_eval/tasks/egoschema/egoschema_subset.yaml create mode 100755 lmms_eval/tasks/egoschema/egoschema_subset_gen.yaml create mode 100755 lmms_eval/tasks/egoschema/utils.py mode change 100644 => 100755 lmms_eval/tasks/mmbench/_default_template_mmbench_cn_yaml mode change 100644 => 100755 lmms_eval/tasks/mmbench/_default_template_mmbench_en_yaml create mode 100644 lmms_eval/tasks/videochatgpt/_default_template_yaml create mode 100755 lmms_eval/tasks/videochatgpt/utils.py create mode 100755 lmms_eval/tasks/videochatgpt/videochatgpt_consistency.yaml create mode 100755 lmms_eval/tasks/videochatgpt/videochatgpt_context.yaml create mode 100755 lmms_eval/tasks/videochatgpt/videochatgpt_correctness.yaml create mode 100755 lmms_eval/tasks/videochatgpt/videochatgpt_detailed_orientation.yaml create mode 100755 lmms_eval/tasks/videochatgpt/videochatgpt_temporal.yaml create mode 100755 tools/make_activitynetqa.ipynb diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index 8a506048d..35716b24c 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -10,6 +10,7 @@ from glob import glob import shutil from tqdm import tqdm +import subprocess import datasets from datasets import Image, Sequence @@ -19,7 +20,7 @@ from datasets import DownloadConfig from typing import Union, List, Any from collections.abc import Callable -from tenacity import retry, stop_after_attempt, wait_fixed +from tenacity import retry, stop_after_attempt, wait_fixed, stop_after_delay from huggingface_hub import snapshot_download from lmms_eval import utils @@ -679,19 +680,20 @@ def _prepare_metric_and_aggregation(self): eval_logger.warning(f"[Task: {self._config.task}] metric {metric_name} is defined, but higher_is_better is not. " f"using default " f"higher_is_better={is_higher_better(metric_name)}") self._higher_is_better[metric_name] = is_higher_better(metric_name) - @retry(stop=stop_after_attempt(5), wait=wait_fixed(2)) + @retry(stop=(stop_after_attempt(5) | stop_after_delay(60)), wait=wait_fixed(2)) def download(self, dataset_kwargs=None) -> None: # If the dataset is a video dataset, # Recursively search whether their is a zip and unzip it to the huggingface home if dataset_kwargs is not None and "video" in dataset_kwargs and dataset_kwargs["video"]: hf_home = os.getenv("HF_HOME", "~/.cache/huggingface/") cache_dir = dataset_kwargs["cache_dir"] - cache_dir = os.path.join(hf_home, cache_dir) + cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset") zip_files = glob(os.path.join(cache_path, "**/*.zip"), recursive=True) - if not os.path.exists(cache_dir): + if not os.path.exists(cache_dir) and len(zip_files) > 0: for zip_file in zip_files: + print(f"Unzipping {zip_file} to {cache_dir}") shutil.unpack_archive(zip_file, cache_dir) if "builder_script" in dataset_kwargs: @@ -995,6 +997,7 @@ def construct_requests(self, doc_id: int, ctx: str, **kwargs) -> Union[List[Inst arguments = (ctx, self.config.generation_kwargs, self.doc_to_visual, doc_id, self.config.task, split) return Instance(request_type=self.OUTPUT_TYPE, arguments=arguments, idx=0, **kwargs) + @retry(stop=(stop_after_attempt(5) | stop_after_delay(1200)), wait=wait_fixed(2)) def process_results(self, doc, results): if self.OUTPUT_TYPE == "generate_until": results[0] = results[0].strip() diff --git a/lmms_eval/models/__init__.py b/lmms_eval/models/__init__.py index 8c683cb4f..87292a3d6 100755 --- a/lmms_eval/models/__init__.py +++ b/lmms_eval/models/__init__.py @@ -7,6 +7,7 @@ "llava": "Llava", "qwen_vl": "Qwen_VL", "fuyu": "Fuyu", + "batch_gpt4": "BatchGPT4", "gpt4v": "GPT4V", "instructblip": "InstructBLIP", "minicpm_v": "MiniCPM_V", diff --git a/lmms_eval/models/batch_gpt4.py b/lmms_eval/models/batch_gpt4.py new file mode 100755 index 000000000..9c6d5ba3e --- /dev/null +++ b/lmms_eval/models/batch_gpt4.py @@ -0,0 +1,202 @@ +# Standard library imports +from copy import deepcopy +from io import BytesIO +import base64 +import logging +import os +import time +import json + +# Related third-party imports +from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs +from accelerate.state import AcceleratorState +import numpy as np +from PIL import Image +import requests as url_requests +from tqdm import tqdm +from openai import OpenAI + +# Local application/library specific imports +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model +from lmms_eval import utils + +# Conditional imports +try: + from decord import VideoReader, cpu +except ImportError: + eval_logger = logging.getLogger("lmms-eval") + eval_logger.info("Decord is not installed. Video input will not be supported.") + +# Constants and global configurations +API_TYPE = os.getenv("API_TYPE", "openai") +NUM_SECONDS_TO_SLEEP = 5 + +if API_TYPE == "openai": + API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") + API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } +elif API_TYPE == "azure": + API_URL = os.getenv("AZURE_ENDPOINT", "https://api.cognitive.microsoft.com/sts/v1.0/issueToken") + API_KEY = os.getenv("AZURE_API_KEY", "YOUR_API_KEY") + headers = { + "api-key": API_KEY, + "Content-Type": "application/json", + } + + +@register_model("batch_gpt4") +class BatchGPT4(lmms): + def __init__( + self, + model_version: str = "gpt-4o", + api_key: str = API_KEY, + api_url: str = API_URL, + modality: str = "image", + max_frames_for_video: int = 10, + timeout: int = 120, + **kwargs, + ) -> None: + super().__init__() + # Manually set a image token for GPT4V so that we can search for it + # and split the text and image + # Here we just use the same token as llava for convenient + self.model_version = model_version + self.modality = modality + self.max_frames_for_video = max_frames_for_video + self.image_token = "" + self.timeout = timeout + + self.api_key = api_key + self.api_url = api_url + self.client = OpenAI(api_key=api_key) + + accelerator = Accelerator() + assert accelerator.state.local_process_index == 0, "BatchGPT4 does not support distributed inference." + assert accelerator.state.num_processes == 1, "BatchGPT4 does not support distributed inference." + + # Function to encode the image + def encode_image(self, image: Image): + output_buffer = BytesIO() + image.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + return base64_str + + # Function to encode the video + def encode_video(self, video_path, for_get_frames_num): + vr = VideoReader(video_path, ctx=cpu(0)) + total_frame_num = len(vr) + uniform_sampled_frames = np.linspace(0, total_frame_num - 1, for_get_frames_num, dtype=int) + frame_idx = uniform_sampled_frames.tolist() + frames = vr.get_batch(frame_idx).asnumpy() + + base64_frames = [] + for frame in frames: + img = Image.fromarray(frame) + output_buffer = BytesIO() + img.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + base64_frames.append(base64_str) + + return base64_frames + + def flatten(self, input): + new_list = [] + for i in input: + for j in i: + new_list.append(j) + return new_list + + def generate_until(self, requests): + # Prepare the batch requests data + requests_data = {} + pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Batch Preparing") + for idx, (contexts, gen_kwargs, doc_to_visual, doc_id, task, split) in enumerate([reg.args for reg in requests]): + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + imgs = [] + for visual in visuals: + if self.modality == "image": + img = self.encode_image(visual) + imgs.append(img) + elif self.modality == "video": + frames = self.encode_video(visual, self.max_frames_for_video) + imgs.extend(frames) + + messages = [] + if self.image_token not in contexts: + messages.append({"role": "user", "content": contexts}) + for img in imgs: + messages.append({"role": "user", "content": f"data:image/jpeg;base64,{img}"}) + else: + contexts_split = contexts.split(self.image_token) + for idx, context in enumerate(contexts_split): + if idx < len(imgs): + messages.append({"role": "user", "content": context}) + messages.append({"role": "user", "content": f"data:image/jpeg;base64,{imgs[idx]}"}) + if len(contexts_split) > len(imgs): + messages.append({"role": "user", "content": contexts_split[-1]}) + + requests_data[f"request-{idx}"] = {"model": self.model_version, "messages": messages, "max_tokens": gen_kwargs.get("max_new_tokens", 1024)} + pbar.update(1) + + file_path = os.getenv("HF_HOME", "~/.cache/huggingface") + f"/batchinput_{len(requests_data)}.jsonl" + file_path = self.create_batch_input_file(requests_data, file_path) + file_id = self.upload_input_file(file_path) + + batch_response = self.create_batch(file_id, metadata={"description": "Batch Processing for GPT-4"}) + batch_status = self.check_batch_status(batch_response.id) + while True: + batch_status = self.check_batch_status(batch_response.id) + if batch_status.status == "completed": + eval_logger.info("Batch processing completed.") + batch_results = self.retrieve_batch_results(batch_status.output_file_id) + res = [result["response"]["choices"][0]["message"]["content"] for result in json.loads(batch_results)] + return res + elif batch_status.status == "failed": + eval_logger.info("Batch processing failed.") + res = ["Batch failed"] * len(requests) + return res + else: + eval_logger.info(f"Batch status: {batch_status.status}. Retrying in {NUM_SECONDS_TO_SLEEP} seconds.") + time.sleep(NUM_SECONDS_TO_SLEEP) + + def loglikelihood(self, requests): + # TODO + assert False, "GPT4V not support" + + def create_batch_input_file(self, requests_data, file_path="batchinput.jsonl"): + with open(file_path, "w") as file: + for request_id, data in requests_data.items(): + json_record = json.dumps({"custom_id": request_id, "method": "POST", "url": "/v1/chat/completions", "body": data}) + file.write(json_record + "\n") + return file_path + + def upload_input_file(self, file_path): + with open(file_path, "rb") as file: + response = self.client.files.create(file=file, purpose="batch") + return response.id + + def create_batch(self, file_id, metadata=None): + if metadata is None: + metadata = {} + response = self.client.batches.create(input_file_id=file_id, endpoint="/v1/chat/completions", completion_window="24h", metadata=metadata) + return response + + def check_batch_status(self, batch_id): + return self.client.batches.retrieve(batch_id) + + def retrieve_batch_results(self, file_id): + return self.client.files.content(file_id) + + def cancel_batch(self, batch_id): + return self.client.batches.cancel(batch_id) + + def list_batches(self, limit=10): + return self.client.batches.list(limit=limit) diff --git a/lmms_eval/models/fuyu.py b/lmms_eval/models/fuyu.py index 7a50c174c..d4f7a4832 100755 --- a/lmms_eval/models/fuyu.py +++ b/lmms_eval/models/fuyu.py @@ -85,7 +85,7 @@ def __init__( self._rank = 0 self._word_size = 1 - '''if accelerator.num_processes > 1: + """if accelerator.num_processes > 1: assert accelerator.distributed_type in [ DistributedType.FSDP, DistributedType.MULTI_GPU, @@ -98,7 +98,7 @@ def __init__( if self.accelerator.is_local_main_process: eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") self._rank = self.accelerator.local_process_index - self._world_size = self.accelerator.num_processes''' + self._world_size = self.accelerator.num_processes""" @property def config(self): diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index 7ef1c19d8..31a782e4a 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -2,7 +2,6 @@ import os import time import logging -import google.generativeai as genai from PIL import Image from typing import List, Tuple @@ -13,9 +12,16 @@ eval_logger = logging.getLogger("lmms-eval") -NUM_SECONDS_TO_SLEEP = 30 -GOOGLE_API_KEY=os.getenv('GOOGLE_API_KEY') -genai.configure(api_key=GOOGLE_API_KEY) +try: + import google.generativeai as genai + + NUM_SECONDS_TO_SLEEP = 5 + GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") + genai.configure(api_key=GOOGLE_API_KEY) + +except Exception as e: + eval_logger.error(f"Error importing generativeai: {str(e)}") + genai = None @register_model("gemini_api") @@ -37,7 +43,19 @@ def flatten(self, input): for j in i: new_list.append(j) return new_list - + + def get_image_size(self, image): + # Create a BytesIO object to store the image bytes + img_byte_array = io.BytesIO() + + # Save the image to the BytesIO object + image.save(img_byte_array, format="PNG") + + # Get the size of the BytesIO object + img_size = img_byte_array.tell() + + return img_size + def get_image_size(self, image): # Create a BytesIO object to store the image bytes img_byte_array = io.BytesIO() @@ -67,7 +85,7 @@ def generate_until(self, requests) -> List[str]: visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] visuals = self.flatten(visuals) - + message = [contexts] + visuals for attempt in range(5): diff --git a/lmms_eval/models/gpt4v.py b/lmms_eval/models/gpt4v.py index 3aec2fadd..bf8f66ed4 100755 --- a/lmms_eval/models/gpt4v.py +++ b/lmms_eval/models/gpt4v.py @@ -25,7 +25,7 @@ from PIL import Image API_TYPE = os.getenv("API_TYPE", "openai") -NUM_SECONDS_TO_SLEEP = 5 +NUM_SECONDS_TO_SLEEP = 30 eval_logger = logging.getLogger("lmms-eval") if API_TYPE == "openai": @@ -178,6 +178,7 @@ def generate_until(self, requests) -> List[str]: time.sleep(NUM_SECONDS_TO_SLEEP) else: # If this was the last attempt, log and return empty eval_logger.error(f"All 5 attempts failed. Last error message: {str(e)}") + eval_logger.error(f"Response: {response}") content = "" res.append(content) pbar.update(1) diff --git a/lmms_eval/models/idefics2.py b/lmms_eval/models/idefics2.py index 979ae0501..e978f9078 100644 --- a/lmms_eval/models/idefics2.py +++ b/lmms_eval/models/idefics2.py @@ -198,7 +198,7 @@ def _collate(x): gen_kwargs = all_gen_kwargs[0] # until = gen_kwargs.pop("until", None) - image_aspect_ratio = gen_kwargs.pop("image_aspect_ratio", None) + image_aspect_ratio = gen_kwargs.pop("image_aspect_ratio", None) if "max_new_tokens" not in gen_kwargs: gen_kwargs["max_new_tokens"] = 1024 if "temperature" not in gen_kwargs: diff --git a/lmms_eval/models/qwen_vl.py b/lmms_eval/models/qwen_vl.py index 4d9cdbb1a..e55ad7c93 100755 --- a/lmms_eval/models/qwen_vl.py +++ b/lmms_eval/models/qwen_vl.py @@ -242,12 +242,11 @@ def _collate(x): if len(visual_paths) == 0: for context in contexts: query.append({"text": context}) - else: + else: for visual_path, context in zip(visual_paths, contexts): query.append({"image": visual_path}) query.append({"text": context}) - questions = self.tokenizer.from_list_format(query) input_ids = self.tokenizer(questions, return_tensors="pt", padding="longest") diff --git a/lmms_eval/models/videoChatGPT.py b/lmms_eval/models/videoChatGPT.py new file mode 100644 index 000000000..94f618039 --- /dev/null +++ b/lmms_eval/models/videoChatGPT.py @@ -0,0 +1,188 @@ +import os +from lmms_eval import utils +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model + +from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs +from accelerate.state import AcceleratorState +from huggingface_hub import snapshot_download +import torch + +from datetime import timedelta +import logging +from typing import List, Tuple, Optional, Union +from tqdm import tqdm + +try: + from video_chatgpt.eval.model_utils import load_video, initialize_model + from video_chatgpt.inference import video_chatgpt_infer, video_chatgpt_infer_ppl, get_spatio_temporal_features_torch +except ImportError: + eval_logger = logging.getLogger("lmms-eval") + eval_logger.info("Failed to import video_chatgpt modules") + +eval_logger = logging.getLogger("lmms-eval") + + +@register_model("video_chatgpt") +class VideoChatGPT(lmms): + def __init__( + self, + batch_size: Optional[Union[int, str]] = 1, + projection_path: str = "MBZUAI/Video-ChatGPT-7B", + model_path: str = "mmaaz60/LLaVA-7B-Lightening-v1-1", + device_map="cuda:0", + device: Optional[str] = "cuda:0", + num_frm: Optional[Union[int, str]] = 100, + ) -> None: + super().__init__() + self.batch_size_per_gpu = int(batch_size) + self.num_frm = int(num_frm) + accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) + accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) + if accelerator.num_processes > 1: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + elif accelerator.num_processes == 1 and device_map == "auto": + self._device = torch.device(device) + self.device_map = device_map + else: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + try: + self.model, self.vision_tower, self.tokenizer, self.image_processor, self.video_token_len = initialize_model(model_path, projection_path, device=self.device) + except: + eval_logger.info("Does not find the model from the path you provide, try downloading from the hf repo.") + model_path = snapshot_download(repo_id=model_path) + projection_path = os.path.join(snapshot_download(repo_id=projection_path), "video_chatgpt-7B.bin") + self.model, self.vision_tower, self.tokenizer, self.image_processor, self.video_token_len = initialize_model(model_path, projection_path, device=self.device) + + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + # If you want to use DistributedType.DEEPSPEED, you have to run accelerate config before using the model + # Also, you have to select zero stage 0 (equivalent to DDP) in order to make the prepare model works + # I tried to set different parameters in the kwargs to let default zero 2 stage works, but it didn't work. + if accelerator.distributed_type == DistributedType.DEEPSPEED: + kwargs = { + "train_micro_batch_size_per_gpu": self.batch_size_per_gpu, + "train_batch_size": self.batch_size_per_gpu * accelerator.num_processes, + } + AcceleratorState().deepspeed_plugin.deepspeed_config_process(must_match=True, **kwargs) + eval_logger.info("Detected that you are using DistributedType.DEEPSPEED. Make sure you run `accelerate config` and set zero stage to 0") + if accelerator.distributed_type == DistributedType.FSDP or accelerator.distributed_type == DistributedType.DEEPSPEED: + self._model = accelerator.prepare(self.model) + else: + self._model = accelerator.prepare_model(self.model, evaluation_mode=True) + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + elif accelerator.num_processes == 1 and device_map == "auto": + eval_logger.info(f"Using {accelerator.num_processes} devices with tensor parallelism") + self._rank = 0 + self._word_size = 1 + else: + eval_logger.info(f"Using single device: {self._device}") + self.model.to(self._device) + self._rank = 0 + self._world_size = 1 + + def flatten(self, input): + new_list = [] + for i in input: + for j in i: + new_list.append(j) + return new_list + + def generate_until(self, requests) -> List[str]: + res = [] + pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") + + for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + # encode, pad, and truncate contexts for this batch + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + videos = [] + for visual in visuals: + video_frames = load_video(visual, num_frm=self.num_frm) + # VideoChatGPT load video return a list of PIL Image + videos += video_frames + + output = video_chatgpt_infer( + video_frames, contexts, conv_mode="video-chatgpt_v1", model=self.model, vision_tower=self.vision_tower, tokenizer=self.tokenizer, image_processor=self.image_processor, video_token_len=self.video_token_len + ) + + res.append(output) + pbar.update(1) + + return res + + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + res = [] + pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") + + for contexts, doc_to_target, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + # encode, pad, and truncate contexts for this batch + if type(doc_to_target) == str: + continuation = doc_to_target + else: + continuation = doc_to_target(self.task_dict[task][split][doc_id]) + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + videos = [] + for visual in visuals: + video_frames = load_video(visual, num_frm=self.num_frm) + # VideoChatGPT load video return a list of PIL Image + videos += video_frames + image_tensor = self.image_processor.preprocess(videos, return_tensors="pt")["pixel_values"] + + # Move image tensor to GPU and reduce precision to half + image_tensor = image_tensor.half().to(self.device) + + # Generate video spatio-temporal features + with torch.no_grad(): + image_forward_outs = self.vision_tower(image_tensor, output_hidden_states=True) + frame_features = image_forward_outs.hidden_states[-2][:, 1:] # Use second to last layer as in LLaVA + video_spatio_temporal_features = get_spatio_temporal_features_torch(frame_features).cuda() + + outputs, input_ids, context_ids = video_chatgpt_infer_ppl( + # video_frames, + contexts, + continuation, + conv_mode="video-chatgpt_v1", + model=self.model, + vision_tower=self.vision_tower, + tokenizer=self.tokenizer, + image_processor=self.image_processor, + video_token_len=self.video_token_len, + video_spatio_temporal_features=video_spatio_temporal_features, + ) + + loss = outputs["loss"] + # loss = torch.exp(loss) + logits = outputs["logits"] + greedy_tokens = logits.argmax(dim=-1) + cont_toks = input_ids[:, context_ids.shape[1] :] # [1, seq] + greedy_tokens = greedy_tokens[:, context_ids.shape[1] : input_ids.shape[1]] # [1, seq] + max_equal = (greedy_tokens == cont_toks).all() + res.append((float(loss.item()), bool(max_equal))) + pbar.update(1) + pbar.close() + return res + + @property + def batch_size(self): + return self.batch_size_per_gpu + + @property + def device(self): + return self._device + + @property + def rank(self): + return self._rank + + @property + def world_size(self): + return self._world_size diff --git a/lmms_eval/models/xcomposer2_4KHD.py b/lmms_eval/models/xcomposer2_4KHD.py index 2c49e43b4..b43f12e4e 100644 --- a/lmms_eval/models/xcomposer2_4KHD.py +++ b/lmms_eval/models/xcomposer2_4KHD.py @@ -146,7 +146,7 @@ def generate_until(self, requests) -> List[str]: for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: # encode, pad, and truncate contexts for this batch if "[UNUSED_TOKEN_146]" not in contexts: - contexts = f"[UNUSED_TOKEN_146]user\n{contexts}[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n" + contexts = f"[UNUSED_TOKEN_146]user\n{contexts}[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n" visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] visuals = self.flatten(visuals) diff --git a/lmms_eval/tasks/activitynetqa/_default_template_yaml b/lmms_eval/tasks/activitynetqa/_default_template_yaml new file mode 100644 index 000000000..ee83f5235 --- /dev/null +++ b/lmms_eval/tasks/activitynetqa/_default_template_yaml @@ -0,0 +1,13 @@ +dataset_path: lmms-lab/ActivityNetQA +dataset_kwargs: + token: True + video: True + cache_dir: activitynetqa +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" + +metadata: + version: 0.0 + gpt_eval_model_name: gpt-3.5-turbo-0613 \ No newline at end of file diff --git a/lmms_eval/tasks/activitynetqa/activitynetqa_generation.yaml b/lmms_eval/tasks/activitynetqa/activitynetqa_generation.yaml new file mode 100755 index 000000000..a9bb69d23 --- /dev/null +++ b/lmms_eval/tasks/activitynetqa/activitynetqa_generation.yaml @@ -0,0 +1,25 @@ +dataset_name: "Generation" +task: "activitynetqa" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.activitynetqa_doc_to_visual +doc_to_text: !function utils.activitynetqa_doc_to_text +doc_to_target: !function utils.activitynetqa_doc_to_answer +process_results: !function utils.activitynetqa_process_results +metric_list: + - metric: submission + aggregation: !function utils.activitynetqa_aggregate + higher_is_better: true + - metric: exact_match + higher_is_better: true +include: _default_template_yaml + +generation_kwargs: + until: + - "ASSISTANT:" + image_aspect_ratio: original + max_new_tokens: 64 + temperature: 0 + top_p: 0 + num_beams: 1 + do_sample: false diff --git a/lmms_eval/tasks/activitynetqa/utils.py b/lmms_eval/tasks/activitynetqa/utils.py new file mode 100755 index 000000000..b06be6bbd --- /dev/null +++ b/lmms_eval/tasks/activitynetqa/utils.py @@ -0,0 +1,312 @@ +from decord import VideoReader, cpu +import numpy as np +import os +import sys +import datetime +import lmms_eval.tasks._task_utils.file_utils as file_utils +import json +import logging +import yaml +from pathlib import Path + +import requests +import openai +from openai import OpenAI +import time +import ast + +eval_logger = logging.getLogger("lmms-eval") + +with open(Path(__file__).parent / "_default_template_yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + # remove function definition since yaml load cannot handle it + if "!function" not in line: + safe_data.append(line) + + config = yaml.safe_load("".join(safe_data)) + +NUM_SECONDS_TO_SLEEP = 5 + +GPT_EVAL_MODEL_NAME = config["metadata"]["gpt_eval_model_name"] + +API_TYPE = os.getenv("API_TYPE", "openai") + +if API_TYPE == "openai": + API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") + API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } + +# Unzip all the zip files to HF HOME cache dir +HF_HOME = os.environ["HF_HOME"] +cache_dir = config["dataset_kwargs"]["cache_dir"] +cache_dir = os.path.join(HF_HOME, cache_dir) +cache_dir = os.path.join(cache_dir, "all_test") + + +# Pass in video path here +# Can only work correctly with video dataset +def activitynetqa_doc_to_visual(doc): + video_path = os.path.join(cache_dir, f"v_{doc['video_name']}.mp4") + extensions = ["mp4", "webm", "mkv"] + for ext in extensions: + modified_path = video_path.replace("mp4", ext) + if os.path.exists(modified_path): + return [modified_path] + sys.exit(f"video path:{video_path} does not exist, please check") + + +# This is the place where format the question +def activitynetqa_doc_to_text(doc, model_specific_prompt_kwargs=None): + if model_specific_prompt_kwargs is None: + model_specific_prompt_kwargs = {} + pre_prompt = "" + post_prompt = "" + if "pre_prompt" in model_specific_prompt_kwargs: + pre_prompt = model_specific_prompt_kwargs["pre_prompt"] + if "post_prompt" in model_specific_prompt_kwargs: + post_prompt = model_specific_prompt_kwargs["post_prompt"] + + raw_question = doc["question"] + question = raw_question + "?" + + # type_specific_prompts = { + # '3': "Please answer with 'yes' or 'no'.", + # '4': "Please state the color as a single word.", + # '7': "Please give the numerical answer." + # } + + # doc_type = str(doc['type']) + # type_specific_prompt = type_specific_prompts.get(doc_type, "") + + # return f"{pre_prompt}{question} {type_specific_prompt}{post_prompt}" + return f"{pre_prompt}{question}{post_prompt}" + + +def activitynetqa_doc_to_answer(doc): + return doc["answer"] + + +def get_eval(question, answer, pred, max_tokens: int, retries: int = 5): + global headers + + messages = [ + { + "role": "system", + "content": "You are an intelligent chatbot designed for evaluating the correctness of generative outputs for question-answer pairs. " + "Your task is to compare the predicted answer with the correct answer and determine if they match meaningfully. Here's how you can accomplish the task:" + "------" + "##INSTRUCTIONS: " + "- Focus on the meaningful match between the predicted answer and the correct answer.\n" + "- Consider synonyms or paraphrases as valid matches.\n" + "- Evaluate the correctness of the prediction compared to the answer.", + }, + { + "role": "user", + "content": f"Please evaluate the following video-based question-answer pair:\n\n" + f"Question: {question}\n" + f"Correct Answer: {answer}\n" + f"Predicted Answer: {pred}\n\n" + "Provide your evaluation only as a yes/no and score where the score is an integer value between 0 and 5, with 5 indicating the highest meaningful match. " + "Please generate the response in the form of a Python dictionary string with keys 'pred' and 'score', where value of 'pred' is a string of 'yes' or 'no' and value of 'score' is in INTEGER, not STRING." + "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. " + "For example, your response should look like this: {'pred': 'yes', 'score': 4.8}.", + }, + ] + + payload = { + "model": GPT_EVAL_MODEL_NAME, + "messages": messages, + "temperature": 0, + "max_tokens": max_tokens, + } + + for attempt in range(retries): + try: + response = requests.post(API_URL, headers=headers, json=payload, timeout=60) + response.raise_for_status() # Raises HTTPError for bad responses + try: + response_data = response.json() # Attempt to parse JSON + except requests.exceptions.JSONDecodeError: + eval_logger.error(f"JSON decode error on attempt {attempt + 1}. Response text: {response.text}") + continue # Skip to next retry + content = response_data["choices"][0]["message"]["content"].strip() + if content != "": + return content, response_data["model"] + # Handle HTTP errors separately + except requests.exceptions.HTTPError as e: + eval_logger.error(f"HTTP error on attempt {attempt + 1}: {e}") + # Handle other requests-related errors + except requests.exceptions.RequestException as e: + eval_logger.error(f"Request exception on attempt {attempt + 1}: {e}") + except Exception as e: + eval_logger.error(f"Unexpected error on attempt {attempt + 1}: {e}") + + # Handle other unexpected errors + if attempt < retries - 1: + time.sleep(NUM_SECONDS_TO_SLEEP) + else: # If this was the last attempt, log and return empty + eval_logger.error(f"All {retries} attempts failed. Last error message: {e}") + return "", "" + + return "", "" + + +def parse_score(review): + try: + # Convert the string representation of a dictionary to an actual dictionary + review_dict = ast.literal_eval(review) + pred = review_dict.get("pred", "no") + score = review_dict.get("score", 0) + return [pred, float(score)] + except SyntaxError as e: + eval_logger.error(f"Syntax error parsing the review string: {e}. Review content: {review}") + return ["no", 0] + except ValueError as e: + eval_logger.error(f"Value error parsing the review string: {e}. Review content: {review}") + return ["no", 0] + except Exception as e: + eval_logger.error(f"Unexpected error parsing the review string: {e}. Review content: {review}") + return ["no", 0] + + +# we process answer and gpt_eval seperately, in case gpt is not stable +# so we obtained a submission file for answer first +# and then feed the submission file to gpt for scoring +def activitynetqa_process_results(doc, result): + """ + Args: + doc: a instance of the eval dataset + results: [pred] + Returns: + a dictionary + """ + # try: + # question = doc.get("question", "") + # answer = doc.get("answer", "") + # pred = result[0] + + # review, model_name = get_eval(question, answer, pred, 64) + # scores = parse_score(review) + # except Exception as e: + # eval_logger.error(f"Error for Question ID: {doc.get('question_id', 'Unknown')}: {e}") + # review = "Failed to Get a Proper Review." + # model_name = "Failed Request" + # scores = ['no', 0] + pred = result[0] + + data_dict = {"submission": {"video_name": doc["video_name"], "Q": doc["question"], "A": doc["answer"], "pred": pred, "question_id": doc["question_id"], "type": doc["type"]}} + + return data_dict + + +def activitynetqa_aggregate_submissions(results, args, task): + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + submission_file_name = f"activitynetqa-{task}-{now_date_time}.json" + path = file_utils.generate_submission_file(submission_file_name, args) + + with open(path, "w") as f: + json.dump(results, f, indent=4) + + eval_logger.info(f"Submission file saved to {path}") + + return path + + +def activitynetqa_print_scores(eval_file_path, args): + # Load the predictions from the result file + with open(eval_file_path, "r") as file: + evaluated_list = json.load(file) + + score_file_name = "scores.json" + path = file_utils.generate_submission_file(score_file_name, args) + + # Compute average score and final accuracy + # Initialize counters + yes_count = 0 + no_count = 0 + total_score = 0 + + # Iterate over the results to count correctness and sum scores + for result_dict in evaluated_list: + if result_dict["Correctness"] == "yes": + yes_count += 1 + else: + no_count += 1 + total_score += result_dict["score"] + + # Calculate accuracy and average score + accuracy = yes_count / (yes_count + no_count) if (yes_count + no_count) > 0 else 0 + average_score = total_score / len(evaluated_list) if evaluated_list else 0 + + # Print the results + print(f"Accuracy: {accuracy}") + print(f"Average Score: {average_score}") + + # Write the processed data to the scores file + with open(path, "w") as f: + json.dump({"accuracy": accuracy, "average_score": average_score}, f, indent=4) + + eval_logger.info(f"Score file saved to {path}") + + +# we process answer and gpt_eval seperately, in case gpt is not stable +# so we obtained a submission file for answer first +# and then feed the submission file to gpt for scoring + + +def activitynetqa_gpt_eval(result_file_path, args): + """ + Process the result file containing predictions, score them using GPT, + and save the results with added scores and correctness fields to a new file. + + Args: + result_file_path: path to the JSON file with results to be evaluated + eval_file_path: path to save the JSON file with evaluated results + """ + + eval_file_name = "gpt_eval_result.json" + eval_file_path = file_utils.generate_submission_file(eval_file_name, args) + + # Load the predictions from the result file + with open(result_file_path, "r") as file: + result_list = json.load(file) + + evaluated_results = [] + + # Process each result to generate scores + for data_dict in result_list: + try: + question = data_dict.get("Q", "") + answer = data_dict.get("A", "") + pred = data_dict.get("pred", "") + + # Assume get_eval returns a review and the model name, and parse_score parses this review + review, model_name = get_eval(question, answer, pred, 64) + scores = parse_score(review) + except Exception as e: + eval_logger.error(f"Error for Question ID: {data_dict.get('question_id', 'Unknown')}: {e}") + review = "Failed to Get a Proper Review." + model_name = "Failed Request" + scores = ["no", 0] + + # Update the dictionary with the new entries + updated_dict = {"video_name": data_dict["video_name"], "Correctness": scores[0], "score": scores[1], "Q": question, "A": answer, "pred": pred, "question_id": data_dict.get("question_id"), "type": data_dict.get("type")} + evaluated_results.append(updated_dict) + + # Save the evaluated results to a new JSON file + with open(eval_file_path, "w") as f: + json.dump(evaluated_results, f, indent=4) + + return eval_file_path + + +# Factory into different aggregate +def activitynetqa_aggregate(results, args): + result_file_path = activitynetqa_aggregate_submissions(results, args, "Generation") + eval_file_path = activitynetqa_gpt_eval(result_file_path, args) + activitynetqa_print_scores(eval_file_path, args) diff --git a/lmms_eval/tasks/ai2d/ai2d.yaml b/lmms_eval/tasks/ai2d/ai2d.yaml index 58ae6c796..5221ff64b 100755 --- a/lmms_eval/tasks/ai2d/ai2d.yaml +++ b/lmms_eval/tasks/ai2d/ai2d.yaml @@ -7,35 +7,16 @@ output_type: generate_until doc_to_visual: !function utils.ai2d_doc_to_visual doc_to_text: !function utils.ai2d_doc_to_text doc_to_target: !function utils.ai2d_doc_to_target - -generation_kwargs: - max_new_tokens: 16 - temperature: 0 - do_sample: False - -metric_list: - - metric: exact_match - aggregation: mean - higher_is_better: true - ignore_case: true - ignore_punctuation: true - -# filter_list: -# - name: flexible-extract -# filter: -# - function: !function utils.SimpleMultiChoiceRegexFilter -# group_select: 0 -# regex_pattern: "(\\([A-Z]\\))" - -metadata: - - version: 0.0 model_specific_prompt_kwargs: default: prompt_format: mcq pre_prompt: "" post_prompt: "\nAnswer with the option's letter from the given choices directly." - # qwen formulate ai2d as question answering instead of mcq + gpt4v: + prompt_format: mcq + pre_prompt: "" + post_prompt: "\nAbove choices are given in {option}. {content} format.\nPlease answer with the option letter from the given choices directly." qwen_vl: prompt_format: qa pre_prompt: "" @@ -47,4 +28,28 @@ model_specific_prompt_kwargs: model_specific_target_kwargs: default: "mcq" - qwen_vl: "qa" \ No newline at end of file + qwen_vl: "qa" + +generation_kwargs: + max_new_tokens: 16 + temperature: 0 + do_sample: False + +filter_list: + - name: "flexible-extract" + filter: + - function: !function utils.MultiChoiceRegexFilter + group_select: 0 + ignore_case: true + ignore_punctuation: true + regex_pattern: "([A-Z])\\." + +metric_list: + - metric: exact_match + aggregation: mean + higher_is_better: true + ignore_case: true + ignore_punctuation: true + +metadata: + - version: 0.0 \ No newline at end of file diff --git a/lmms_eval/tasks/ai2d/utils.py b/lmms_eval/tasks/ai2d/utils.py index 04a2cd93a..a6e2368d6 100755 --- a/lmms_eval/tasks/ai2d/utils.py +++ b/lmms_eval/tasks/ai2d/utils.py @@ -1,4 +1,6 @@ -from lmms_eval.filters.extraction import SimpleMultiChoiceRegexFilter +from lmms_eval.filters.extraction import ExtendedRegexFilter +from lmms_eval.filters.transformation import MapFilter +import re def ai2d_doc_to_text(doc, model_specific_prompt_kwargs=None): @@ -32,3 +34,46 @@ def ai2d_doc_to_target(doc, model_specific_target_kwargs): return options[int(doc["answer"])] elif model_specific_target_kwargs == "qa": return doc["options"][int(doc["answer"])] + + +class MultiChoiceRegexFilter(ExtendedRegexFilter): + def __init__(self, *args, **kwargs): + """ + regex_pattern: The basic regex pattern to use. If fails to match, we will use the customized match procedure + - step 1 : We parse the choices between ([A-Z])s then try to find these choices in the response. + - step 2 : We parse the choice with regex :[\s]*([A-?]), where ? varies by number of choices. + group_select: Selects the (group_select)th match from the findall result. + ignore_case: Ignores the case during step 1 matching + ignore_punctuation: Remove the punctuation during step 1 matching + regexes_to_ignore: Remove these regexes during step 1 matching + """ + super().__init__(*args, **kwargs) + + def apply(self, resps, docs): + # here, we assume we have a list, in which each element is + # a list of model responses for some particular input/target pair. + # so we process each of these (same input/target response sets) + # independently (and keep them a list.) + + filtered_resps = [] + + for r, doc in zip(resps, docs): + # Regex to directly extract the option letter from the model response + option_letter_regex = re.compile(r"^\s*([A-Z])\.") + + # Process each response + filtered = [] + for resp in r: + # Try to match the option letter at the start of the response + match = option_letter_regex.match(resp) + if match: + # If a match is found, append the matched letter + filtered.append(match.group(1)) + else: + # If no match, return the original response + filtered.append(resp) + + # Assuming we need the first response that matches or the original response + filtered_resps.append(filtered[0]) + + return filtered_resps diff --git a/lmms_eval/tasks/coco_cap/utils.py b/lmms_eval/tasks/coco_cap/utils.py index 0102dbef9..ab3a736ad 100755 --- a/lmms_eval/tasks/coco_cap/utils.py +++ b/lmms_eval/tasks/coco_cap/utils.py @@ -43,7 +43,7 @@ def coco_process_result(doc, result): def coco_aggregation_result(results, metric, args): - scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")]#, (Spice(), "SPICE")] + scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")] # , (Spice(), "SPICE")] scorers_dict = {s[1]: s for s in scorers} stored_results = [] diff --git a/lmms_eval/tasks/cvrr/_default_template_yaml b/lmms_eval/tasks/cvrr/_default_template_yaml new file mode 100644 index 000000000..cce57e12a --- /dev/null +++ b/lmms_eval/tasks/cvrr/_default_template_yaml @@ -0,0 +1,13 @@ +dataset_path: lmms-lab/CVRR-ES +dataset_kwargs: + token: True + video: True + cache_dir: cvrr-es +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" + +metadata: + version: 0.0 + gpt_eval_model_name: gpt-3.5-turbo-0613 \ No newline at end of file diff --git a/lmms_eval/tasks/cvrr/cvrr_object_instance_count.yaml b/lmms_eval/tasks/cvrr/cvrr_object_instance_count.yaml new file mode 100755 index 000000000..fc85014af --- /dev/null +++ b/lmms_eval/tasks/cvrr/cvrr_object_instance_count.yaml @@ -0,0 +1,14 @@ +dataset_name: "continuity_and_object_instance_count" +task: "cvrr_continuity_and_object_instance_count" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.cvrr_doc_to_visual +doc_to_text: !function utils.cvrr_doc_to_text +doc_to_target: !function utils.cvrr_doc_to_answer +process_results: !function utils.cvrr_process_results +metric_list: + - metric: submission + aggregation: !function utils.cvrr_aggregate_results + higher_is_better: true +include: _default_template_yaml + diff --git a/lmms_eval/tasks/cvrr/utils.py b/lmms_eval/tasks/cvrr/utils.py new file mode 100755 index 000000000..0e300d4f5 --- /dev/null +++ b/lmms_eval/tasks/cvrr/utils.py @@ -0,0 +1,301 @@ +from decord import VideoReader, cpu +import numpy as np +import os +import sys +import datetime +import lmms_eval.tasks._task_utils.file_utils as file_utils +import json +import logging +import yaml +from pathlib import Path + +import requests +import openai +from openai import OpenAI +import time +import ast + +eval_logger = logging.getLogger("lmms-eval") + +with open(Path(__file__).parent / "_default_template_yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + # remove function definition since yaml load cannot handle it + if "!function" not in line: + safe_data.append(line) + + config = yaml.safe_load("".join(safe_data)) + +NUM_SECONDS_TO_SLEEP = 5 + +GPT_EVAL_MODEL_NAME = config["metadata"]["gpt_eval_model_name"] + +API_TYPE = os.getenv("API_TYPE", "openai") + +if API_TYPE == "openai": + API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") + API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } + +# Unzip all the zip files to HF HOME cache dir +HF_HOME = os.environ["HF_HOME"] +cache_dir = config["dataset_kwargs"]["cache_dir"] +cache_dir = os.path.join(HF_HOME, cache_dir) +cache_dir = os.path.join(cache_dir, "CVRR-ES/continuity_and_object_instance_count") + + +# Pass in video path here +# Can only work correctly with video llm +def cvrr_doc_to_visual(doc): + video_path = doc["VideoID"] + + if doc["DimensionName"] == "Continuity and Object Instance Count": + + video_path = os.path.join(cache_dir, video_path) + if os.path.exists(video_path): + video_path = video_path + else: + sys.exit(f"video path:{video_path} does not exist, please check") + return [video_path] + + +# format the question +def cvrr_doc_to_text(doc, model_specific_prompt_kwargs=None): + if model_specific_prompt_kwargs is None: + model_specific_prompt_kwargs = {} + pre_prompt = "" + post_prompt = "" + if "pre_prompt" in model_specific_prompt_kwargs: + pre_prompt = model_specific_prompt_kwargs["pre_prompt"] + if "post_prompt" in model_specific_prompt_kwargs: + post_prompt = model_specific_prompt_kwargs["post_prompt"] + + question = doc["Q"] + + return f"{pre_prompt}{question}{post_prompt}" + + +# format answer +def cvrr_doc_to_answer(doc): + return doc["A"] + + +# Note: we process answer and gpt_eval seperately, in case gpt is not stable +# so we obtained a submission file for answer first +# and then feed the submission file to gpt for scoring + + +# Process result for evaluation +def cvrr_process_results(doc, result): + pred = result[0] + + return {"submission": {"VideoID": doc["VideoID"], "Q": doc["Q"], "A": doc["A"], "pred": pred, "DimensionName": doc["DimensionName"]}} + + +def cvrr_aggregate_submissions(results, args, task): + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + submission_file_name = f"cvrr-{task}-{now_date_time}.json" + path = file_utils.generate_submission_file(submission_file_name, args) + + with open(path, "w") as f: + json.dump(results, f, indent=4) + + eval_logger.info(f"Submission file saved to {path}") + + return path + + +def get_eval(question, answer, pred, task, max_tokens: int, retries: int = 5): + global headers + + if task == "continuity_and_object_instance_count": + messages = [ + { + "role": "system", + "content": "You are an intelligent chatbot designed for evaluating the correctness of AI assistant predictions for question-answer pairs. " + "Your task is to compare the predicted answer with the ground-truth answer and determine if the predicted answer is correct or not. Here's how you can accomplish the task:" + "------" + "##INSTRUCTIONS: " + "- Focus on the correctness and accuracy of the predicted answer with the ground-truth.\n" + "- Consider predictions with less specific details as correct evaluation, unless such details are explicitly asked in the question.\n", + }, + { + "role": "user", + "content": "Please evaluate the following video-based question-answer pair:\n\n" + f"Question: {question}\n" + f"Ground truth correct Answer: {answer}\n" + f"Predicted Answer: {pred}\n\n" + "Provide your evaluation as a correct/incorrect prediction along with the score where the score is an integer value between 0 (fully wrong) and 5 (fully correct). The middle score provides the percentage of correctness." + "Please generate the response in the form of a Python dictionary string with keys 'pred', 'score' and 'reason', where value of 'pred' is a string of 'correct' or 'incorrect', value of 'score' is in INTEGER, not STRING and value of 'reason' should provide the reason behind the decision." + "Only provide the Python dictionary string." + "For example, your response should look like this: {'pred': 'correct', 'score': 4.8, 'reason': reason}.", + }, + ] + + print(messages) + + payload = { + "model": GPT_EVAL_MODEL_NAME, + "messages": messages, + "temperature": 0, + "max_tokens": max_tokens, + } + + for attempt in range(retries): + try: + response = requests.post(API_URL, headers=headers, json=payload, timeout=60) + response.raise_for_status() # Raises HTTPError for bad responses + try: + response_data = response.json() # Attempt to parse JSON + except requests.exceptions.JSONDecodeError: + eval_logger.error(f"JSON decode error on attempt {attempt + 1}. Response text: {response.text}") + continue # Skip to next retry + content = response_data["choices"][0]["message"]["content"].strip() + if content != "": + return content, response_data["model"] + # Handle HTTP errors separately + except requests.exceptions.HTTPError as e: + eval_logger.error(f"HTTP error on attempt {attempt + 1}: {e}") + # Handle other requests-related errors + except requests.exceptions.RequestException as e: + eval_logger.error(f"Request exception on attempt {attempt + 1}: {e}") + except Exception as e: + eval_logger.error(f"Unexpected error on attempt {attempt + 1}: {e}") + + # Handle other unexpected errors + if attempt < retries - 1: + time.sleep(NUM_SECONDS_TO_SLEEP) + else: # If this was the last attempt, log and return empty + eval_logger.error(f"All {retries} attempts failed. Last error message: {e}") + return "", "" + + return "", "" + + +def parse_score(review): + try: + # Convert the string representation of a dictionary to an actual dictionary + review_dict = ast.literal_eval(review) + correctness = review_dict.get("pred", "incorrect") + score = review_dict.get("score", 0) + reason = review_dict.get("reason", "") + return correctness, float(score), reason + except SyntaxError as e: + eval_logger.error(f"Syntax error parsing the review string: {e}. Review content: {review}") + return "incorrect", float(0), "" + except ValueError as e: + eval_logger.error(f"Value error parsing the review string: {e}. Review content: {review}") + return "incorrect", float(0), "" + except Exception as e: + eval_logger.error(f"Unexpected error parsing the review string: {e}. Review content: {review}") + return "incorrect", float(0), "" + + +def cvrr_print_scores(eval_file_path, args): + # Load the predictions from the result file + with open(eval_file_path, "r") as file: + evaluated_list = json.load(file) + + score_file_name = "scores.json" + path = file_utils.generate_submission_file(score_file_name, args) + + # Compute average score and final accuracy + # Initialize counters + yes_count = 0 + no_count = 0 + total_score = 0 + + # Iterate over the results to count correctness and sum scores + for result_list in evaluated_list: + eval_dict = result_list[0] + total_score += eval_dict["score"] + + if eval_dict["Correctness"] == "yes": + yes_count += 1 + else: + no_count += 1 + + # Calculate accuracy and average score + accuracy = yes_count / (yes_count + no_count) if (yes_count + no_count) > 0 else 0 + average_score = total_score / len(evaluated_list) if evaluated_list else 0 + + # Print the results + print(f"Accuracy: {accuracy}") + print(f"Average Score: {average_score}") + + # Write the processed data to the scores file + with open(path, "w") as f: + json.dump({"accuracy": accuracy, "average_score": average_score}, f, indent=4) + + eval_logger.info(f"Score file saved to {path}") + + +def cvrr_gpt_eval(result_file_path, args, task): + """ + Process the result file containing predictions, score them using GPT, + and save the results with added scores and correctness fields to a new file. + + Args: + result_file_path: path to the JSON file with results to be evaluated + """ + + eval_file_name = "gpt_eval_result.json" + eval_file_path = file_utils.generate_submission_file(eval_file_name, args) + + # Load the predictions from the result file + with open(result_file_path, "r") as file: + result_list = json.load(file) + + evaluated_results = [] + + # Load the predictions from the result file + with open(result_file_path, "r") as file: + result_list = json.load(file) + + # Process each result to generate scores + for data_dict in result_list: + try: + question = data_dict.get("Q", "") + answer = data_dict.get("A", "") + pred = data_dict.get("pred", "") + + # Assume get_eval returns a review and the model name, and parse_score parses this review + review, model_name = get_eval(question, answer, pred, task, 64) + correctness, score, reason = parse_score(review) + except Exception as e: + eval_logger.error(f"Error for Video Name: {data_dict.get('VideoID', 'Unknown')}: {e}") + review = "Failed to Get a Proper Review." + model_name = "Failed Request" + score = 0 + correctness = "incorrect" + reason = "" + + # Update the dictionary with the new entries + eval_dict = { + "pred": correctness, + "score": score, + "reason": reason, + } + result_dict = { + "Q": question, + "A": answer, + "pred": pred, + } + updated_list = [eval_dict, result_dict] + evaluated_results.append(updated_list) + + # Save the evaluated results to a new JSON file + with open(eval_file_path, "w") as f: + json.dump(evaluated_results, f, indent=4) + + return eval_file_path + + +def cvrr_aggregate_results(results, args): + result_file_path = cvrr_aggregate_submissions(results, args, "continuity_and_object_instance_count") + eval_file_path = cvrr_gpt_eval(result_file_path, args, "continuity_and_object_instance_count") + cvrr_print_scores(eval_file_path, args) diff --git a/lmms_eval/tasks/egoschema/_default_template_yaml b/lmms_eval/tasks/egoschema/_default_template_yaml new file mode 100644 index 000000000..8e0306454 --- /dev/null +++ b/lmms_eval/tasks/egoschema/_default_template_yaml @@ -0,0 +1,9 @@ +dataset_path: lmms-lab/egoschema +dataset_kwargs: + token: True + video: True + cache_dir: egoschema +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" \ No newline at end of file diff --git a/lmms_eval/tasks/egoschema/egoschema_generation.yaml b/lmms_eval/tasks/egoschema/egoschema_generation.yaml new file mode 100755 index 000000000..be7bebe95 --- /dev/null +++ b/lmms_eval/tasks/egoschema/egoschema_generation.yaml @@ -0,0 +1,15 @@ +dataset_name: "GENERATION" +task: "egoschema_gen" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.egoschema_doc_to_visual +doc_to_text: !function utils.egoschema_doc_to_text +doc_to_target: !function utils.egoschema_doc_to_answer +process_results: !function utils.egoschema_process_results_generation +metric_list: + - metric: submission + aggregation: !function utils.egoschema_aggregate_gen + higher_is_better: true + - metric: exact_match + higher_is_better: true +include: _default_template_yaml diff --git a/lmms_eval/tasks/egoschema/egoschema_mc.yaml b/lmms_eval/tasks/egoschema/egoschema_mc.yaml new file mode 100755 index 000000000..7b894da0e --- /dev/null +++ b/lmms_eval/tasks/egoschema/egoschema_mc.yaml @@ -0,0 +1,15 @@ +dataset_name: "MC" +task: "egoschema_mc" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.egoschema_doc_to_visual +doc_to_text: !function utils.egoschema_doc_to_text +doc_to_target: !function utils.egoschema_doc_to_answer_mc +process_results: !function utils.egoschema_process_results +metric_list: + - metric: submission + aggregation: !function utils.egoschema_aggregate_mc + higher_is_better: true + - metric: exact_match + higher_is_better: true +include: _default_template_yaml diff --git a/lmms_eval/tasks/egoschema/egoschema_mcppl.yaml b/lmms_eval/tasks/egoschema/egoschema_mcppl.yaml new file mode 100755 index 000000000..4d13a0fef --- /dev/null +++ b/lmms_eval/tasks/egoschema/egoschema_mcppl.yaml @@ -0,0 +1,15 @@ +dataset_name: "MC_PPL" +task: "egoschema_mc_ppl" +test_split: test +output_type: multiple_choice +doc_to_visual: !function utils.egoschema_doc_to_visual +doc_to_text: "question" +doc_to_target: !function utils.egoschema_doc_to_answer_mc_ppl +doc_to_choice: !function utils.egoschema_doc_to_choice +process_results: !function utils.egoschema_process_results +metric_list: + - metric: submission + aggregation: !function utils.egoschema_aggregate_mc_ppl + higher_is_better: true + - metric: acc +include: _default_template_yaml diff --git a/lmms_eval/tasks/egoschema/egoschema_subset.yaml b/lmms_eval/tasks/egoschema/egoschema_subset.yaml new file mode 100755 index 000000000..b5c7fd147 --- /dev/null +++ b/lmms_eval/tasks/egoschema/egoschema_subset.yaml @@ -0,0 +1,17 @@ +dataset_name: "Subset" +task: "egoschema_subset_mcppl" +test_split: test +output_type: multiple_choice +doc_to_visual: !function utils.egoschema_doc_to_visual +doc_to_text: "question" +doc_to_target: !function utils.egoschema_doc_to_answer_mc_ppl +doc_to_choice: !function utils.egoschema_doc_to_choice +process_results: !function utils.egoschema_process_results +metric_list: + - metric: submission + aggregation: !function utils.egoschema_aggregate_mc_ppl + higher_is_better: true + - metric: score + aggregation: !function utils.egoschema_aggregate_score + higher_is_better: true +include: _default_template_yaml diff --git a/lmms_eval/tasks/egoschema/egoschema_subset_gen.yaml b/lmms_eval/tasks/egoschema/egoschema_subset_gen.yaml new file mode 100755 index 000000000..c7455b292 --- /dev/null +++ b/lmms_eval/tasks/egoschema/egoschema_subset_gen.yaml @@ -0,0 +1,16 @@ +dataset_name: "Subset" +task: "egoschema_subset_generation" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.egoschema_doc_to_visual +doc_to_text: !function utils.egoschema_doc_to_text +doc_to_target: !function utils.egoschema_doc_to_answer +process_results: !function utils.egoschema_process_results_generation +metric_list: + - metric: submission + aggregation: !function utils.egoschema_aggregate_gen + higher_is_better: true + - metric: score + aggregation: !function utils.egoschema_aggregate_score + higher_is_better: true +include: _default_template_yaml diff --git a/lmms_eval/tasks/egoschema/utils.py b/lmms_eval/tasks/egoschema/utils.py new file mode 100755 index 000000000..872c452e6 --- /dev/null +++ b/lmms_eval/tasks/egoschema/utils.py @@ -0,0 +1,156 @@ +from decord import VideoReader, cpu +import numpy as np +import os +import sys +import datetime +import lmms_eval.tasks._task_utils.file_utils as file_utils +import json +import logging +import yaml +from pathlib import Path + +with open(Path(__file__).parent / "_default_template_yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + # remove function definition since yaml load cannot handle it + if "!function" not in line: + safe_data.append(line) + + config = yaml.safe_load("".join(safe_data)) + +# A bit ugly here +# But the idea is that we will unzip all the zip files +# To HF HOME cache dir +# And load it here +HF_HOME = os.environ["HF_HOME"] +cache_dir = config["dataset_kwargs"]["cache_dir"] +cache_dir = os.path.join(HF_HOME, cache_dir) +cache_dir = os.path.join(cache_dir, "videos") + +eval_logger = logging.getLogger("lmms-eval") + + +# Pass in video path here +# Can only work correctly with video llm +def egoschema_doc_to_visual(doc): + video_path = doc["video_idx"] + ".mp4" + video_path = os.path.join(cache_dir, video_path) + if os.path.exists(video_path): + video_path = video_path + elif os.path.exists(video_path.replace("mp4", "MP4")): + video_path = video_path.replace("mp4", "MP4") + else: + sys.exit(f"video path:{video_path} does not exist, please check") + return [video_path] + + +# This is the place where you format your question +def egoschema_doc_to_text(doc, model_specific_prompt_kwargs=None): + if model_specific_prompt_kwargs is None: + model_specific_prompt_kwargs = {} + pre_prompt = "" + post_prompt = "" + if "pre_prompt" in model_specific_prompt_kwargs: + pre_prompt = model_specific_prompt_kwargs["pre_prompt"] + if "post_prompt" in model_specific_prompt_kwargs: + post_prompt = model_specific_prompt_kwargs["post_prompt"] + + question = doc["question"] + if "option" in doc: + for op in doc["option"]: + question += "\n" + op + post_prompt = "\nAnswer with the option's letter from the given choices directly." + + return f"{pre_prompt}{question}{post_prompt}" + + +def egoschema_doc_to_answer(doc): + return doc["answer"] + + +# If it is mc, keep the option for exact match +def egoschema_doc_to_answer_mc(doc): + # return doc["answer"].split(".")[0].strip() + return doc["answer"] # pseudo answer + + +# If it is mc ppl, keep the option str for perplexity base matching +def egoschema_doc_to_answer_mc_ppl(doc): + # return doc["answer"].split(".")[1].strip() + return doc["answer"] # pseudo answer + + +# Process result for mc_ppl +def egoschema_process_results(doc, result): + # Initialize minimum value and index + min_value = float("inf") + min_index = -1 + + # Iterate through the results to find the index of the lowest value + for i, (value, _) in enumerate(result): + if value < min_value: + min_value = value + min_index = i + + # Return the result with the index of the lowest value + return {"submission": {doc["video_idx"]: min_index}, "score": {"pred": min_index, "ground_truth": doc["answer"]}} + + +# Process result for generation +def egoschema_process_results_generation(doc, result): + pred = result[0] # string prediction "A", "B", "C", "D", or "E" + + # Map the prediction to an index + pred_to_index = {"A": 0, "B": 1, "C": 2, "D": 3, "E": 4} + index = pred_to_index.get(pred, -1) # Default to -1 if the prediction is not found + + return {"submission": {doc["video_idx"]: index}, "score": {"pred": index, "ground_truth": doc["answer"]}} + + +def egoschema_aggregate_submissions(results, args, task): + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + submission_file_name = f"egoschema-{task}-{now_date_time}.json" + path = file_utils.generate_submission_file(submission_file_name, args) + + # results is a list of 5031 dict, + # need to convert results into a single dict with 5031 key-value pairs + combined_submission = {} + + for submission_dict in results: + combined_submission.update(submission_dict) + + with open(path, "w") as f: + json.dump(combined_submission, f, indent=4) + + eval_logger.info(f"Submission file saved to {path}") + + +# Factory into different aggregate +def egoschema_aggregate_gen(results, args): + egoschema_aggregate_submissions(results, args, "GENERATION") + + +def egoschema_aggregate_mc(results, args): + egoschema_aggregate_submissions(results, args, "MC") + + +def egoschema_aggregate_mc_ppl(results, args): + egoschema_aggregate_submissions(results, args, "MC_PPL") + + +def egoschema_aggregate_score(results, args): + yes_count = 0 + + # results is a list of dict + for answer_dict in results: + if str(answer_dict["ground_truth"]) == str(answer_dict["pred"]): + yes_count = yes_count + 1 + + accuracy = yes_count / len(results) + + return accuracy + + +def egoschema_doc_to_choice(doc): + return [op.split(".")[1].strip() for op in doc["option"]] diff --git a/lmms_eval/tasks/flickr30k/utils.py b/lmms_eval/tasks/flickr30k/utils.py index f5d5c144b..8fa1069ab 100755 --- a/lmms_eval/tasks/flickr30k/utils.py +++ b/lmms_eval/tasks/flickr30k/utils.py @@ -41,7 +41,7 @@ def flickr_process_result(doc, result): def flickr_aggregation_result(results, metric, args): - scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")]#, (Spice(), "SPICE")] + scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")] # , (Spice(), "SPICE")] scorers_dict = {s[1]: s for s in scorers} stored_results = [] diff --git a/lmms_eval/tasks/livebench/livebench.yaml b/lmms_eval/tasks/livebench/livebench.yaml index 3cf6087c3..620c38637 100644 --- a/lmms_eval/tasks/livebench/livebench.yaml +++ b/lmms_eval/tasks/livebench/livebench.yaml @@ -24,6 +24,6 @@ model_specific_prompt_kwargs: pre_prompt: "" post_prompt: "" metadata: - version: 0.0 + version: "2024-05" api_type : openai gpt_eval_model_name: "gpt-4-turbo" diff --git a/lmms_eval/tasks/livebench/utils.py b/lmms_eval/tasks/livebench/utils.py index 11a026b14..ecc39539e 100644 --- a/lmms_eval/tasks/livebench/utils.py +++ b/lmms_eval/tasks/livebench/utils.py @@ -144,8 +144,10 @@ def livebench_doc_to_text(doc, model_specific_prompt_kwargs=None): post_prompt = model_specific_prompt_kwargs.get("post_prompt", "") return f"{pre_prompt}{doc['question']}{post_prompt}" + SUBTASKS = ("basic understanding", "contextual analysis", "deeper implications", "broader implications", "further insights") + def livebench_process_results(doc, results): base64_images = [image_to_base64(image) for image in livebench_doc_to_visual(doc)] subtask = doc["subtask"] diff --git a/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml b/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml index 3852a2644..d04dabf42 100755 --- a/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml +++ b/lmms_eval/tasks/mix_evals/mix_evals_video2text_mc.yaml @@ -21,7 +21,6 @@ filter_list: group_select: 0 ignore_case: true ignore_punctuation: true - regex_pattern: "(\\([A-Z]\\))" model_specific_prompt_kwargs: default: diff --git a/lmms_eval/tasks/mix_evals/utils.py b/lmms_eval/tasks/mix_evals/utils.py index 7b08cab6d..88be96560 100755 --- a/lmms_eval/tasks/mix_evals/utils.py +++ b/lmms_eval/tasks/mix_evals/utils.py @@ -239,62 +239,28 @@ def mix_evals_video2text_aggregate_gen(results, args): class MultiChoiceRegexFilter(ExtendedRegexFilter): def __init__(self, *args, **kwargs): - """ - regex_pattern: The basic regex pattern to use. If fails to match, we will use the customized match procedure - - step 1 : We parse the choices between ([A-Z])s then try to find these choices in the response. - - step 2 : We parse the choice with regex :[\s]*([A-?]), where ? varies by number of choices. - group_select: Selects the (group_select)th match from the findall result. - ignore_case: Ignores the case during step 1 matching - ignore_punctuation: Remove the punctuation during step 1 matching - regexes_to_ignore: Remove these regexes during step 1 matching - """ super().__init__(*args, **kwargs) def apply(self, resps, docs): - # here, we assume we have a list, in which each element is - # a list of model responses for some particular input/target pair. - # so we process each of these (same input/target response sets) - # independently (and keep them a list.) - filtered_resps = [] for r, doc in zip(resps, docs): - fallback_regexes = [] - choice_to_alpha = {} - next_alpha = "A" - - without_paren_fallback_regexes = [] - without_paren_to_target = {} - - # Regex to extract multiple choice options from the question - multiple_choices_regex = re.compile(r"\b([A-Z])\.\s+([^\n]*)") - matches = multiple_choices_regex.findall(doc["question"]) - - # Build regex patterns and mappings for each choice - for m in matches: - choice_text = m[1].strip() - fallback_regexes.append(f"{re.escape(choice_text)}") - choice_to_alpha[choice_text] = next_alpha - - next_alpha = chr(ord(next_alpha) + 1) - - # Compile regex to match any of the extracted choices - fallback_regex = re.compile("|".join(fallback_regexes)) + # Regex to directly extract the option letter from the model response + option_letter_regex = re.compile(r"\b([A-Z])\.\s+([^\n]*)") # Process each response filtered = [] for resp in r: - # Remove any punctuation and extra spaces - cleaned_resp = re.sub(r"[^\w\s]", "", resp).strip() - # Try to match cleaned response with the choice text - match = fallback_regex.search(cleaned_resp) - if match and match.group() in choice_to_alpha: - # Map the matched choice text back to its corresponding letter - filtered.append(choice_to_alpha[match.group()]) + # Try to match the option letter at the start of the response + match = option_letter_regex.match(resp) + if match: + # If a match is found, append the matched letter + filtered.append(match.group(1)) else: - # If no match, return the cleaned response - filtered.append(cleaned_resp) + # If no match, return the original response + filtered.append(resp) + # Assuming we need the first response that matches or the original response filtered_resps.append(filtered[0]) return filtered_resps diff --git a/lmms_eval/tasks/mmbench/_default_template_mmbench_cn_yaml b/lmms_eval/tasks/mmbench/_default_template_mmbench_cn_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mmbench/_default_template_mmbench_en_yaml b/lmms_eval/tasks/mmbench/_default_template_mmbench_en_yaml old mode 100644 new mode 100755 diff --git a/lmms_eval/tasks/mme/mme.yaml b/lmms_eval/tasks/mme/mme.yaml index f7a5d229e..3d665314e 100755 --- a/lmms_eval/tasks/mme/mme.yaml +++ b/lmms_eval/tasks/mme/mme.yaml @@ -27,6 +27,9 @@ model_specific_prompt_kwargs: default: pre_prompt: "" post_prompt: "\nAnswer the question using a single word or phrase." + gpt4v: + pre_prompt: "" + post_prompt: "\nAnswer the question with Yes or No." qwen_vl: pre_prompt: "" post_prompt: " Answer:" diff --git a/lmms_eval/tasks/nocaps/utils.py b/lmms_eval/tasks/nocaps/utils.py index f645b1cc7..9b1d4df65 100755 --- a/lmms_eval/tasks/nocaps/utils.py +++ b/lmms_eval/tasks/nocaps/utils.py @@ -42,7 +42,7 @@ def nocaps_process_result(doc, result): def nocaps_aggregation_result(results, metric, args=None): - scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")]#, (Spice(), "SPICE")] + scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")] # , (Spice(), "SPICE")] scorers_dict = {s[1]: s for s in scorers} stored_results = [] diff --git a/lmms_eval/tasks/ocrbench/utils.py b/lmms_eval/tasks/ocrbench/utils.py index c8c8c650e..fe1c1fcbd 100644 --- a/lmms_eval/tasks/ocrbench/utils.py +++ b/lmms_eval/tasks/ocrbench/utils.py @@ -100,4 +100,4 @@ def ocrbench_aggregate_accuracy(results, args): print(f"Final Score(Total 1000): {Final_score}", file=f) logger.info(f"OCR Bench results saved to {file_name}") # return {"Final Score":Final_score,"Text Recognition":recognition_score,'Scene Text-centric VQA':OCRBench_score['Scene Text-centric VQA'],'Doc-oriented VQA':OCRBench_score['Doc-oriented VQA'],'Key Information Extraction':OCRBench_score['Key Information Extraction'],'Handwritten Mathematical Expression Recognition':OCRBench_score['Handwritten Mathematical Expression Recognition']} - return Final_score + return Final_score / 1000 # return the final score as accuracy diff --git a/lmms_eval/tasks/refcoco+/utils.py b/lmms_eval/tasks/refcoco+/utils.py index 4feb71cb8..f1d436063 100755 --- a/lmms_eval/tasks/refcoco+/utils.py +++ b/lmms_eval/tasks/refcoco+/utils.py @@ -49,7 +49,7 @@ def refcoco_process_result(doc, result): def refcoco_aggregation_result(results, metric): - scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")]#, (Spice(), "SPICE")] + scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")] # , (Spice(), "SPICE")] scorers_dict = {s[1]: s for s in scorers} stored_results = [] diff --git a/lmms_eval/tasks/refcoco/utils.py b/lmms_eval/tasks/refcoco/utils.py index 4feb71cb8..f1d436063 100755 --- a/lmms_eval/tasks/refcoco/utils.py +++ b/lmms_eval/tasks/refcoco/utils.py @@ -49,7 +49,7 @@ def refcoco_process_result(doc, result): def refcoco_aggregation_result(results, metric): - scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")]#, (Spice(), "SPICE")] + scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")] # , (Spice(), "SPICE")] scorers_dict = {s[1]: s for s in scorers} stored_results = [] diff --git a/lmms_eval/tasks/refcocog/utils.py b/lmms_eval/tasks/refcocog/utils.py index 4feb71cb8..f1d436063 100755 --- a/lmms_eval/tasks/refcocog/utils.py +++ b/lmms_eval/tasks/refcocog/utils.py @@ -49,7 +49,7 @@ def refcoco_process_result(doc, result): def refcoco_aggregation_result(results, metric): - scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")]#, (Spice(), "SPICE")] + scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")] # , (Spice(), "SPICE")] scorers_dict = {s[1]: s for s in scorers} stored_results = [] diff --git a/lmms_eval/tasks/synthdog/donut_evaluator.py b/lmms_eval/tasks/synthdog/donut_evaluator.py index e0e52e122..b24c42580 100644 --- a/lmms_eval/tasks/synthdog/donut_evaluator.py +++ b/lmms_eval/tasks/synthdog/donut_evaluator.py @@ -5,12 +5,16 @@ from typing import Any, Dict, List, Tuple, Union import torch -import zss from datasets import load_dataset from nltk import edit_distance from torch.utils.data import Dataset from transformers.modeling_utils import PreTrainedModel -from zss import Node + +try: + import zss + from zss import Node +except ImportError: + print("Please install zss library. You can install it by running 'pip install zss'") class JSONParseEvaluator: diff --git a/lmms_eval/tasks/textcaps/utils.py b/lmms_eval/tasks/textcaps/utils.py index c63feae56..12dc277f8 100755 --- a/lmms_eval/tasks/textcaps/utils.py +++ b/lmms_eval/tasks/textcaps/utils.py @@ -38,7 +38,7 @@ def textcaps_process_result(doc, result): def textcaps_aggregation_result(results, metric, args=None): - scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")]#, (Spice(), "SPICE")] + scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr")] # , (Spice(), "SPICE")] scorers_dict = {s[1]: s for s in scorers} stored_results = [] diff --git a/lmms_eval/tasks/video_detail_description/utils.py b/lmms_eval/tasks/video_detail_description/utils.py index 1c5b0c70c..9fb8c4b27 100755 --- a/lmms_eval/tasks/video_detail_description/utils.py +++ b/lmms_eval/tasks/video_detail_description/utils.py @@ -163,6 +163,10 @@ def get_eval_generic(question, answer, pred, max_tokens: int, retries: int = 5): except Exception as e: eval_logger.error(f"Unexpected error on attempt {attempt + 1}: {e}") + if "Sorry! We've encountered an issue with repetitive patterns in your prompt. Please try again with a different prompt." in json.loads(response.content)["error"]["message"]: + eval_logger.error(f"Repetitive patterns in prompt. Drop this data.") + return "", "" + # Handle other unexpected errors if attempt < retries - 1: time.sleep(NUM_SECONDS_TO_SLEEP) diff --git a/lmms_eval/tasks/videochatgpt/_default_template_yaml b/lmms_eval/tasks/videochatgpt/_default_template_yaml new file mode 100644 index 000000000..816297ccb --- /dev/null +++ b/lmms_eval/tasks/videochatgpt/_default_template_yaml @@ -0,0 +1,13 @@ +dataset_path: lmms-lab/VideoChatGPT +dataset_kwargs: + token: True + video: True + cache_dir: videochatgpt +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "" + +metadata: + version: 0.0 + gpt_eval_model_name: gpt-3.5-turbo-0613 \ No newline at end of file diff --git a/lmms_eval/tasks/videochatgpt/utils.py b/lmms_eval/tasks/videochatgpt/utils.py new file mode 100755 index 000000000..b763b630a --- /dev/null +++ b/lmms_eval/tasks/videochatgpt/utils.py @@ -0,0 +1,551 @@ +from decord import VideoReader, cpu +import numpy as np +import os +import sys +import datetime +import lmms_eval.tasks._task_utils.file_utils as file_utils +import json +import logging +import yaml +from pathlib import Path + +import requests +import openai +from openai import OpenAI +import time +import ast + +eval_logger = logging.getLogger("lmms-eval") + +with open(Path(__file__).parent / "_default_template_yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + # remove function definition since yaml load cannot handle it + if "!function" not in line: + safe_data.append(line) + + config = yaml.safe_load("".join(safe_data)) + +NUM_SECONDS_TO_SLEEP = 5 + +GPT_EVAL_MODEL_NAME = config["metadata"]["gpt_eval_model_name"] + +API_TYPE = os.getenv("API_TYPE", "openai") + +if API_TYPE == "openai": + API_URL = os.getenv("OPENAI_API_URL", "https://api.openai.com/v1/chat/completions") + API_KEY = os.getenv("OPENAI_API_KEY", "YOUR_API_KEY") + headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json", + } + +# Unzip all the zip files to HF HOME cache dir +HF_HOME = os.environ["HF_HOME"] +cache_dir = config["dataset_kwargs"]["cache_dir"] +cache_dir = os.path.join(HF_HOME, cache_dir) +cache_dir = os.path.join(cache_dir, "Test_Videos") + + +# Pass in video path here +# Can only work correctly with video llm +def videochatgpt_doc_to_visual(doc): + video_path = doc["video_name"] + ".mp4" + video_path = os.path.join(cache_dir, video_path) + if os.path.exists(video_path): + video_path = video_path + elif os.path.exists(video_path.replace("mp4", "MP4")): + video_path = video_path.replace("mp4", "MP4") + elif os.path.exists(video_path.replace("mp4", "mkv")): + video_path = video_path.replace("mp4", "mkv") + else: + sys.exit(f"video path:{video_path} does not exist, please check") + return [video_path] + + +# format the question +def videochatgpt_doc_to_text(doc, model_specific_prompt_kwargs=None): + if model_specific_prompt_kwargs is None: + model_specific_prompt_kwargs = {} + pre_prompt = "" + post_prompt = "" + if "pre_prompt" in model_specific_prompt_kwargs: + pre_prompt = model_specific_prompt_kwargs["pre_prompt"] + if "post_prompt" in model_specific_prompt_kwargs: + post_prompt = model_specific_prompt_kwargs["post_prompt"] + + question = doc["question"] + + return f"{pre_prompt}{question}{post_prompt}" + + +# format the question for consistency +def videochatgpt_doc_to_text_consistency(doc, model_specific_prompt_kwargs=None): + if model_specific_prompt_kwargs is None: + model_specific_prompt_kwargs = {} + pre_prompt = "" + post_prompt = "" + if "pre_prompt" in model_specific_prompt_kwargs: + pre_prompt = model_specific_prompt_kwargs["pre_prompt"] + if "post_prompt" in model_specific_prompt_kwargs: + post_prompt = model_specific_prompt_kwargs["post_prompt"] + + if "question_1" in doc: + question = doc["question_1"] + else: + question = doc["question_2"] + + return f"{pre_prompt}{question}{post_prompt}" + + +# format answer +def videochatgpt_doc_to_answer(doc): + return doc["answer"] + + +# Note: we process answer and gpt_eval seperately, in case gpt is not stable +# so we obtained a submission file for answer first +# and then feed the submission file to gpt for scoring + + +# Process result for evaluation in generic task +def videochatgpt_process_results_generic(doc, result): + pred = result[0] + + return {"submission": {"video_name": doc["video_name"], "Q": doc["question"], "A": doc["answer"], "pred": pred}} + + +# Process result for evaluation in temporal task +def videochatgpt_process_results_temporal(doc, result): + pred = result[0] + + return {"submission": {"video_name": doc["video_name"], "Q": doc["question"], "A": doc["answer"], "pred": pred}} + + +# Process result for generation in consistency task +def videochatgpt_process_results_consistency(doc, result): + pred = result[0] + + # if it is question_1, then assign prediction for the 1st question + # else assign prediction for the 2nd question + if doc["question_1"] != "None": + return {"submission": {"video_name": doc["video_name"], "Q1": doc["question_1"], "A": doc["answer"], "pred1": pred}} + else: + return {"submission": {"video_name": doc["video_name"], "Q2": doc["question_2"], "A": doc["answer"], "pred2": pred}} + + +def videochatgpt_aggregate_submissions(results, args, task): + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + submission_file_name = f"videochatgpt-{task}-{now_date_time}.json" + path = file_utils.generate_submission_file(submission_file_name, args) + + with open(path, "w") as f: + json.dump(results, f, indent=4) + + eval_logger.info(f"Submission file saved to {path}") + + return path + + +def videochatgpt_aggregate_submissions_consistency(results, args, task): + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + submission_file_name = f"videochatgpt-{task}-{now_date_time}.json" + path = file_utils.generate_submission_file(submission_file_name, args) + + combined_results = [] + + # Iterate over the results list in steps of 2 + for i in range(0, len(results), 2): + # Merge the current dict with the next one + first_dict = results[i] + second_dict = results[i + 1] if i + 1 < len(results) else {} + + # If 'video_name' is the same in both and is the key we use to match them + if first_dict.get("video_name") == second_dict.get("video_name"): + # Combine q2 and pred2 from the even dict into the odd dict + first_dict["Q2"] = second_dict.get("Q2") + first_dict["pred2"] = second_dict.get("pred2") + combined_results.append(first_dict) + + # Save the combined results to a file + with open(path, "w") as f: + json.dump(combined_results, f, indent=4) + + eval_logger.info(f"Submission file saved to {path}") + + return path + + +def get_eval_generic(question, answer, pred, task, max_tokens: int, retries: int = 5): + global headers + + if task == "correctness": + messages = [ + { + "role": "system", + "content": "You are an intelligent chatbot designed for evaluating the factual accuracy of generative outputs for video-based question-answer pairs. " + "Your task is to compare the predicted answer with the correct answer and determine if they are factually consistent. Here's how you can accomplish the task:" + "------" + "##INSTRUCTIONS: " + "- Focus on the factual consistency between the predicted answer and the correct answer. The predicted answer should not contain any misinterpretations or misinformation.\n" + "- The predicted answer must be factually accurate and align with the video content.\n" + "- Consider synonyms or paraphrases as valid matches.\n" + "- Evaluate the factual accuracy of the prediction compared to the answer.", + }, + { + "role": "user", + "content": "Please evaluate the following video-based question-answer pair:\n\n" + f"Question: {question}\n" + f"Correct Answer: {answer}\n" + f"Predicted Answer: {pred}\n\n" + "Provide your evaluation only as a factual accuracy score where the factual accuracy score is an integer value between 0 and 5, with 5 indicating the highest level of factual consistency. " + "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is the factual accuracy score in INTEGER, not STRING." + "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. " + "For example, your response should look like this: {''score': 4.8}.", + }, + ] + elif task == "detailed_orientation": + messages = [ + { + "role": "system", + "content": "You are an intelligent chatbot designed for evaluating the detail orientation of generative outputs for video-based question-answer pairs. " + "Your task is to compare the predicted answer with the correct answer and determine its level of detail, considering both completeness and specificity. Here's how you can accomplish the task:" + "------" + "##INSTRUCTIONS: " + "- Check if the predicted answer covers all major points from the video. The response should not leave out any key aspects.\n" + "- Evaluate whether the predicted answer includes specific details rather than just generic points. It should provide comprehensive information that is tied to specific elements of the video.\n" + "- Consider synonyms or paraphrases as valid matches.\n" + "- Provide a single evaluation score that reflects the level of detail orientation of the prediction, considering both completeness and specificity.", + }, + { + "role": "user", + "content": "Please evaluate the following video-based question-answer pair:\n\n" + f"Question: {question}\n" + f"Correct Answer: {answer}\n" + f"Predicted Answer: {pred}\n\n" + "Provide your evaluation only as a detail orientation score where the detail orientation score is an integer value between 0 and 5, with 5 indicating the highest level of detail orientation. " + "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is the detail orientation score in INTEGER, not STRING." + "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. " + "For example, your response should look like this: {''score': 4.8}.", + }, + ] + elif task == "context": + messages = [ + { + "role": "system", + "content": "You are an intelligent chatbot designed for evaluating the contextual understanding of generative outputs for video-based question-answer pairs. " + "Your task is to compare the predicted answer with the correct answer and determine if the generated response aligns with the overall context of the video content. Here's how you can accomplish the task:" + "------" + "##INSTRUCTIONS: " + "- Evaluate whether the predicted answer aligns with the overall context of the video content. It should not provide information that is out of context or misaligned.\n" + "- The predicted answer must capture the main themes and sentiments of the video.\n" + "- Consider synonyms or paraphrases as valid matches.\n" + "- Provide your evaluation of the contextual understanding of the prediction compared to the answer.", + }, + { + "role": "user", + "content": "Please evaluate the following video-based question-answer pair:\n\n" + f"Question: {question}\n" + f"Correct Answer: {answer}\n" + f"Predicted Answer: {pred}\n\n" + "Provide your evaluation only as a contextual understanding score where the contextual understanding score is an integer value between 0 and 5, with 5 indicating the highest level of contextual understanding. " + "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is contextual understanding score in INTEGER, not STRING." + "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. " + "For example, your response should look like this: {''score': 4.8}.", + }, + ] + elif task == "temporal": + messages = [ + { + "role": "system", + "content": "You are an intelligent chatbot designed for evaluating the temporal understanding of generative outputs for video-based question-answer pairs. " + "Your task is to compare the predicted answer with the correct answer and determine if they correctly reflect the temporal sequence of events in the video content. Here's how you can accomplish the task:" + "------" + "##INSTRUCTIONS: " + "- Focus on the temporal consistency between the predicted answer and the correct answer. The predicted answer should correctly reflect the sequence of events or details as they are presented in the video content.\n" + "- Consider synonyms or paraphrases as valid matches, but only if the temporal order is maintained.\n" + "- Evaluate the temporal accuracy of the prediction compared to the answer.", + }, + { + "role": "user", + "content": "Please evaluate the following video-based question-answer pair:\n\n" + f"Question: {question}\n" + f"Correct Answer: {answer}\n" + f"Predicted Answer: {pred}\n\n" + "Provide your evaluation only as a temporal accuracy score where the temporal accuracy score is an integer value between 0 and 5, with 5 indicating the highest level of temporal consistency. " + "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is the temporal accuracy score in INTEGER, not STRING." + "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. " + "For example, your response should look like this: {''score': 4.8}.", + }, + ] + print(messages) + payload = { + "model": GPT_EVAL_MODEL_NAME, + "messages": messages, + "temperature": 0, + "max_tokens": max_tokens, + } + + for attempt in range(retries): + try: + response = requests.post(API_URL, headers=headers, json=payload, timeout=60) + response.raise_for_status() # Raises HTTPError for bad responses + try: + response_data = response.json() # Attempt to parse JSON + except requests.exceptions.JSONDecodeError: + eval_logger.error(f"JSON decode error on attempt {attempt + 1}. Response text: {response.text}") + continue # Skip to next retry + content = response_data["choices"][0]["message"]["content"].strip() + if content != "": + return content, response_data["model"] + # Handle HTTP errors separately + except requests.exceptions.HTTPError as e: + eval_logger.error(f"HTTP error on attempt {attempt + 1}: {e}") + # Handle other requests-related errors + except requests.exceptions.RequestException as e: + eval_logger.error(f"Request exception on attempt {attempt + 1}: {e}") + except Exception as e: + eval_logger.error(f"Unexpected error on attempt {attempt + 1}: {e}") + + # Handle other unexpected errors + if attempt < retries - 1: + time.sleep(NUM_SECONDS_TO_SLEEP) + else: # If this was the last attempt, log and return empty + eval_logger.error(f"All {retries} attempts failed. Last error message: {e}") + return "", "" + + return "", "" + + +def get_eval_consistency(question1, question2, answer, pred1, pred2, max_tokens: int, retries: int = 5): + global headers + + messages = [ + { + "role": "system", + "content": "You are an intelligent chatbot designed for evaluating the consistency of generative outputs for similar video-based question-answer pairs. " + "You will be given two very similar questions, a common answer common to both the questions and predicted answers for the two questions ." + "Your task is to compare the predicted answers for two very similar question, with a common correct answer and determine if they are consistent. Here's how you can accomplish the task:" + "------" + "##INSTRUCTIONS: " + "- Focus on the consistency between the two predicted answers and the correct answer. Both predicted answers should correspond to the correct answer and to each other, and should not contain any contradictions or significant differences in the conveyed information.\n" + "- Both predicted answers must be consistent with each other and the correct answer, in terms of the information they provide about the video content.\n" + "- Consider synonyms or paraphrases as valid matches, but only if they maintain the consistency in the conveyed information.\n" + "- Evaluate the consistency of the two predicted answers compared to the correct answer.", + }, + { + "role": "user", + "content": "Please evaluate the following video-based question-answer pair:\n\n" + f"Question 1: {question1}\n" + f"Question 2: {question2}\n" + f"Correct Answer: {answer}\n" + f"Predicted Answer to Question 1: {pred1}\n" + f"Predicted Answer to Question 2: {pred2}\n\n" + "Provide your evaluation only as a consistency score where the consistency score is an integer value between 0 and 5, with 5 indicating the highest level of consistency. " + "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is the consistency score in INTEGER, not STRING." + "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. " + "For example, your response should look like this: {''score': 4.8}.", + }, + ] + print(messages) + payload = { + "model": GPT_EVAL_MODEL_NAME, + "messages": messages, + "temperature": 0, + "max_tokens": max_tokens, + } + + for attempt in range(retries): + try: + response = requests.post(API_URL, headers=headers, json=payload, timeout=60) + response.raise_for_status() # Raises HTTPError for bad responses + try: + response_data = response.json() # Attempt to parse JSON + except requests.exceptions.JSONDecodeError: + eval_logger.error(f"JSON decode error on attempt {attempt + 1}. Response text: {response.text}") + continue # Skip to next retry + content = response_data["choices"][0]["message"]["content"].strip() + if content != "": + return content, response_data["model"] + # Handle HTTP errors separately + except requests.exceptions.HTTPError as e: + eval_logger.error(f"HTTP error on attempt {attempt + 1}: {e}") + # Handle other requests-related errors + except requests.exceptions.RequestException as e: + eval_logger.error(f"Request exception on attempt {attempt + 1}: {e}") + except Exception as e: + eval_logger.error(f"Unexpected error on attempt {attempt + 1}: {e}") + + # Handle other unexpected errors + if attempt < retries - 1: + time.sleep(NUM_SECONDS_TO_SLEEP) + else: # If this was the last attempt, log and return empty + eval_logger.error(f"All {retries} attempts failed. Last error message: {e}") + return "", "" + + return "", "" + + +def parse_score(review): + try: + # Convert the string representation of a dictionary to an actual dictionary + review_dict = ast.literal_eval(review) + score = review_dict.get("score", 0) + return float(score) + except SyntaxError as e: + eval_logger.error(f"Syntax error parsing the review string: {e}. Review content: {review}") + return 0 + except ValueError as e: + eval_logger.error(f"Value error parsing the review string: {e}. Review content: {review}") + return 0 + except Exception as e: + eval_logger.error(f"Unexpected error parsing the review string: {e}. Review content: {review}") + return 0 + + +def videochatgpt_print_scores(eval_file_path, args): + # Load the predictions from the result file + with open(eval_file_path, "r") as file: + evaluated_list = json.load(file) + + score_file_name = "scores.json" + path = file_utils.generate_submission_file(score_file_name, args) + + # Compute average score + total_score = 0 + + # Iterate over the results to sum scores + for result_dict in evaluated_list: + total_score += result_dict["score"] + + # Calculate accuracy and average score + average_score = total_score / len(evaluated_list) if evaluated_list else 0 + + # Print the results + print(f"Average Score: {average_score}") + + # Write the processed data to the scores file + with open(path, "w") as f: + json.dump({"average_score": average_score}, f, indent=4) + + eval_logger.info(f"Score file saved to {path}") + + +def videochatgpt_gpt_eval(result_file_path, args, task): + """ + Process the result file containing predictions, score them using GPT, + and save the results with added scores and correctness fields to a new file. + + Args: + result_file_path: path to the JSON file with results to be evaluated + """ + + eval_file_name = "gpt_eval_result.json" + eval_file_path = file_utils.generate_submission_file(eval_file_name, args) + + # Load the predictions from the result file + with open(result_file_path, "r") as file: + result_list = json.load(file) + + evaluated_results = [] + + # Load the predictions from the result file + with open(result_file_path, "r") as file: + result_list = json.load(file) + + # Process each result to generate scores + # If task is consistency (2 questions with 2 answers) + if task == "consistency": + for data_dict in result_list: + try: + question1 = data_dict.get("Q1", "") + question2 = data_dict.get("Q2", "") + answer = data_dict.get("A", "") + pred1 = data_dict.get("pred1", "") + pred2 = data_dict.get("pred2", "") + + # Assume get_eval returns a review and the model name, and parse_score parses this review + review, model_name = get_eval_consistency(question1, question2, answer, pred1, pred2, 64) + score = parse_score(review) + except Exception as e: + eval_logger.error(f"Error for Video Name: {data_dict.get('video_name', 'Unknown')}: {e}") + review = "Failed to Get a Proper Review." + model_name = "Failed Request" + score = 0 + + # Update the dictionary with the new entries + updated_dict = { + "video_name": data_dict["video_name"], + "score": score, + "Q1": question1, + "Q2": question2, + "A": answer, + "pred1": pred1, + "pred2": pred2, + } + evaluated_results.append(updated_dict) + # If task is correctness, context, detail, temporal (1 question with 1 answer) + else: + # Process each result to generate scores + for data_dict in result_list: + try: + question = data_dict.get("Q", "") + answer = data_dict.get("A", "") + pred = data_dict.get("pred", "") + + # Assume get_eval returns a review and the model name, and parse_score parses this review + review, model_name = get_eval_generic(question, answer, pred, task, 64) + score = parse_score(review) + except Exception as e: + eval_logger.error(f"Error for Video Name: {data_dict.get('video_name', 'Unknown')}: {e}") + review = "Failed to Get a Proper Review." + model_name = "Failed Request" + score = 0 + + # Update the dictionary with the new entries + updated_dict = { + "video_name": data_dict["video_name"], + "score": score, + "Q": question, + "A": answer, + "pred": pred, + } + evaluated_results.append(updated_dict) + + # Save the evaluated results to a new JSON file + with open(eval_file_path, "w") as f: + json.dump(evaluated_results, f, indent=4) + + return eval_file_path + + +# Factory into different aggregate +def videochatgpt_aggregate_correctness(results, args): + result_file_path = videochatgpt_aggregate_submissions(results, args, "correctness") + eval_file_path = videochatgpt_gpt_eval(result_file_path, args, "correctness") + videochatgpt_print_scores(eval_file_path, args) + + +def videochatgpt_aggregate_detailed_orientation(results, args): + result_file_path = videochatgpt_aggregate_submissions(results, args, "detailed_orientation") + eval_file_path = videochatgpt_gpt_eval(result_file_path, args, "detailed_orientation") + videochatgpt_print_scores(eval_file_path, args) + + +def videochatgpt_aggregate_context(results, args): + result_file_path = videochatgpt_aggregate_submissions(results, args, "context") + eval_file_path = videochatgpt_gpt_eval(result_file_path, args, "context") + videochatgpt_print_scores(eval_file_path, args) + + +def videochatgpt_aggregate_temporal(results, args): + result_file_path = videochatgpt_aggregate_submissions(results, args, "temporal") + eval_file_path = videochatgpt_gpt_eval(result_file_path, args, "temporal") + videochatgpt_print_scores(eval_file_path, args) + + +def videochatgpt_aggregate_consistency(results, args): + result_file_path = videochatgpt_aggregate_submissions_consistency(results, args, "consistency") + eval_file_path = videochatgpt_gpt_eval(result_file_path, args, "consistency") + videochatgpt_print_scores(eval_file_path, args) diff --git a/lmms_eval/tasks/videochatgpt/videochatgpt_consistency.yaml b/lmms_eval/tasks/videochatgpt/videochatgpt_consistency.yaml new file mode 100755 index 000000000..84e6a8c0f --- /dev/null +++ b/lmms_eval/tasks/videochatgpt/videochatgpt_consistency.yaml @@ -0,0 +1,24 @@ +dataset_name: "Consistency" +task: "videochatgpt_consistency" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.videochatgpt_doc_to_visual +doc_to_text: !function utils.videochatgpt_doc_to_text_consistency +doc_to_target: !function utils.videochatgpt_doc_to_answer +process_results: !function utils.videochatgpt_process_results_consistency +metric_list: + - metric: submission + aggregation: !function utils.videochatgpt_aggregate_consistency + higher_is_better: true +include: _default_template_yaml + +generation_kwargs: + until: + - "ASSISTANT:" + image_aspect_ratio: original + max_new_tokens: 1024 + temperature: 0 + top_p: 0 + num_beams: 1 + do_sample: false + \ No newline at end of file diff --git a/lmms_eval/tasks/videochatgpt/videochatgpt_context.yaml b/lmms_eval/tasks/videochatgpt/videochatgpt_context.yaml new file mode 100755 index 000000000..01d8a2594 --- /dev/null +++ b/lmms_eval/tasks/videochatgpt/videochatgpt_context.yaml @@ -0,0 +1,13 @@ +dataset_name: "Generic" +task: "videochatgpt_context" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.videochatgpt_doc_to_visual +doc_to_text: !function utils.videochatgpt_doc_to_text +doc_to_target: !function utils.videochatgpt_doc_to_answer +process_results: !function utils.videochatgpt_process_results_generic +metric_list: + - metric: submission + aggregation: !function utils.videochatgpt_aggregate_context + higher_is_better: true +include: _default_template_yaml diff --git a/lmms_eval/tasks/videochatgpt/videochatgpt_correctness.yaml b/lmms_eval/tasks/videochatgpt/videochatgpt_correctness.yaml new file mode 100755 index 000000000..11fedc27c --- /dev/null +++ b/lmms_eval/tasks/videochatgpt/videochatgpt_correctness.yaml @@ -0,0 +1,14 @@ +dataset_name: "Generic" +task: "videochatgpt_correctness" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.videochatgpt_doc_to_visual +doc_to_text: !function utils.videochatgpt_doc_to_text +doc_to_target: !function utils.videochatgpt_doc_to_answer +process_results: !function utils.videochatgpt_process_results_generic +metric_list: + - metric: submission + aggregation: !function utils.videochatgpt_aggregate_correctness + higher_is_better: true +include: _default_template_yaml + diff --git a/lmms_eval/tasks/videochatgpt/videochatgpt_detailed_orientation.yaml b/lmms_eval/tasks/videochatgpt/videochatgpt_detailed_orientation.yaml new file mode 100755 index 000000000..b93c0ecda --- /dev/null +++ b/lmms_eval/tasks/videochatgpt/videochatgpt_detailed_orientation.yaml @@ -0,0 +1,13 @@ +dataset_name: "Generic" +task: "videochatgpt_detailed_orientation" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.videochatgpt_doc_to_visual +doc_to_text: !function utils.videochatgpt_doc_to_text +doc_to_target: !function utils.videochatgpt_doc_to_answer +process_results: !function utils.videochatgpt_process_results_generic +metric_list: + - metric: submission + aggregation: !function utils.videochatgpt_aggregate_detailed_orientation + higher_is_better: true +include: _default_template_yaml diff --git a/lmms_eval/tasks/videochatgpt/videochatgpt_temporal.yaml b/lmms_eval/tasks/videochatgpt/videochatgpt_temporal.yaml new file mode 100755 index 000000000..1bf336cea --- /dev/null +++ b/lmms_eval/tasks/videochatgpt/videochatgpt_temporal.yaml @@ -0,0 +1,23 @@ +dataset_name: "Temporal" +task: "videochatgpt_temporal" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.videochatgpt_doc_to_visual +doc_to_text: !function utils.videochatgpt_doc_to_text +doc_to_target: !function utils.videochatgpt_doc_to_answer +process_results: !function utils.videochatgpt_process_results_temporal +metric_list: + - metric: submission + aggregation: !function utils.videochatgpt_aggregate_temporal + higher_is_better: true +include: _default_template_yaml + +generation_kwargs: + until: + - "ASSISTANT:" + image_aspect_ratio: original + max_new_tokens: 1024 + temperature: 0 + top_p: 0 + num_beams: 1 + do_sample: false diff --git a/pyproject.toml b/pyproject.toml index b66d5e9f0..398b35ff2 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,9 +36,11 @@ dependencies = [ "sqlitedict", "torch>=2.1.0", # to enable sdpa mode for running 34B model on one 80GB GPU "openai>=1.0.0", + "google-generativeai", "pycocoevalcap", "tqdm-multiprocess", "transformers>=4.37.2", + "transformers-stream-generator", "zstandard", "pillow", "pyyaml", @@ -50,12 +52,12 @@ dependencies = [ "hf_transfer", "tenacity", "wandb>=0.16.0", - "transformers-stream-generator", "tiktoken", "pre-commit", "pydantic", "packaging", "decord", + "zss", ] [tool.setuptools.packages.find] diff --git a/tools/make_activitynetqa.ipynb b/tools/make_activitynetqa.ipynb new file mode 100755 index 000000000..efbef00e2 --- /dev/null +++ b/tools/make_activitynetqa.ipynb @@ -0,0 +1,120 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# This notebook will guide you to make correct format of Huggingface dataset, in proper parquet format and visualizable in Huggingface dataset hub.\n", + "# We will take the example of the dataset \"Otter-AI/MMVet\" and convert it to the proper format." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from datasets import load_dataset\n", + "\n", + "data_path = \"Otter-AI/MMVet\"\n", + "df = load_dataset(data_path, split=\"test\").to_pandas()\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from datasets import Dataset, Features, Value, Image\n", + "import pandas as pd\n", + "\n", + "# Define the features for the dataset\n", + "features = Features(\n", + " {\n", + " \"question_id\": Value(dtype=\"string\"),\n", + " \"image\": Image(),\n", + " \"question\": Value(dtype=\"string\"),\n", + " \"answer\": Value(dtype=\"string\"),\n", + " \"image_source\": Value(dtype=\"string\"),\n", + " \"capability\": Value(dtype=\"string\"),\n", + " # Add other fields as necessary\n", + " }\n", + ")\n", + "\n", + "df_items = {\n", + " \"question_id\": [],\n", + " \"image\": [],\n", + " \"question\": [],\n", + " \"answer\": [],\n", + " \"image_source\": [],\n", + " \"capability\": [],\n", + "}\n", + "\n", + "for idx, row in df.iterrows():\n", + " df_items[\"question_id\"].append(str(row[\"id\"]))\n", + " image = {\"bytes\": row[\"images\"][0][\"bytes\"], \"path\": \"\"}\n", + " df_items[\"image\"].append(image)\n", + " df_items[\"question\"].append(str(row[\"instruction\"]))\n", + " df_items[\"answer\"].append(str(row[\"answer\"]))\n", + " df_items[\"image_source\"].append(str(row[\"image_source\"]))\n", + " df_items[\"capability\"].append(\",\".join(list(row[\"capability\"])))\n", + " # Add other fields as necessary\n", + "\n", + "df_items = pd.DataFrame(df_items)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_items.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dataset = Dataset.from_pandas(df_items, features=features)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "hub_dataset_path = \"lmms-lab/MMVet\"\n", + "dataset.push_to_hub(repo_id=hub_dataset_path, split=\"test\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "lmms-eval", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From b55fa9ae1014eeff606cb8092293473be46c2cd7 Mon Sep 17 00:00:00 2001 From: Pu Fanyi Date: Fri, 24 May 2024 17:34:01 +0800 Subject: [PATCH 068/181] Gemini & Claude & NExT-QA (#95) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li * VQAv2 eval (#4) * vqav2 * Add vqav2_process_results function and update vqav2_doc_to_text function * Implement vqav2_process_results function to return exact match score * Refactor fewshot_docs() to use config.fewshot_config * Refactor Task class to handle fewshot_docs when training and validation docs are not available * Add answer processing logic in vqav2_process_results function * Refactor vqav2_process_results function and add submission aggregation * Add vqav2_aggreate_submissions function to utils.py * textvqa * Refactor answer processing in textvqa_process_results() function * textvqa eval * Update dataset path and modify textvqa_doc_to_text function * Capitalize the question in textvqa_doc_to_text function * Update textvqa.yaml and utils.py * Fix formatting issues in lmms_eval/api/task.py, lmms_eval/tasks/gqa/utils.py, lmms_eval/tasks/textvqa/utils.py, and lmms_eval/tasks/vqav2/utils.py --------- Co-authored-by: Li Bo * [Big Changes] add LLaVA-1.6, MMVet, LLaVA-W, POPE, and many other changes on logs, model args. (#7) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * black lint * Remove unused code and scripts * Update lmms_eval tasks and utils * Update LMMS-Eval dependencies and configurations * Squashed commit of the following: commit 209f3904f33210bec0b4b146e96fcbd67a4e1541 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Wed Jan 17 20:27:13 2024 +0800 Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li commit f9e48cec5493010a363b446b81a335ef1484e42f Author: Zhang Peiyuan Date: Wed Jan 17 20:26:58 2024 +0800 Update utils.py (#6) * Fix logging issue and remove unnecessary whitespace * Add openai and pycocoevalcap dependencies * Fix device mapping issue in Llava constructor * Add support for truncating context in generation * Update Llava model and evaluation configuration * Update YAML configuration files * Update YAML configuration files * add otterhd and gemini models * Add support for custom image aspect ratio in Llava model * Add dataset_kwargs and max_gen_toks to YAML files * Fix log_samples suffix typo and use hash for output name * Refactor LMMS evaluation code and update LLAVA model properties * matched response for mistral-llava * Refactor logging in llava_aggregation function * Print evaluation statistics instead of logging them * Fix logging information in llava_aggregation function * Add new models and dataset_kwargs for COCO tasks * Update truncate_context parameter in Llava class constructor * Update dataset_kwargs in YAML files * Remove issue type tags from issue and pull request templates * add mmvet and try to modify llava arch * black lint * Update lmms_eval tasks and utils * Update LMMS-Eval dependencies and configurations * Squashed commit of the following: commit 209f3904f33210bec0b4b146e96fcbd67a4e1541 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Wed Jan 17 20:27:13 2024 +0800 Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li commit f9e48cec5493010a363b446b81a335ef1484e42f Author: Zhang Peiyuan Date: Wed Jan 17 20:26:58 2024 +0800 Update utils.py (#6) * Fix logging issue and remove unnecessary whitespace * Add openai and pycocoevalcap dependencies * Fix device mapping issue in Llava constructor * Add support for truncating context in generation * Update Llava model and evaluation configuration * Update YAML configuration files * Update YAML configuration files * add otterhd and gemini models * Add support for custom image aspect ratio in Llava model * Add dataset_kwargs and max_gen_toks to YAML files * Fix log_samples suffix typo and use hash for output name * Refactor LMMS evaluation code and update LLAVA model properties * matched response for mistral-llava * Refactor logging in llava_aggregation function * Print evaluation statistics instead of logging them * Fix logging information in llava_aggregation function * Add new models and dataset_kwargs for COCO tasks * Update truncate_context parameter in Llava class constructor * Update dataset_kwargs in YAML files * Remove issue type tags from issue and pull request templates * Refactor pope utils functions * Update transformers dependency to version 4.36.2 * Revise llava-in-the-wild prompt for align * Add default values for gen_kwargs in Llava class * Fix formatting issues and import pdb for debugging * Remove pdb.set_trace() and update default value for max_new_tokens * Add llava loglikelihood * Fix formatting and indentation issues in lmms_eval/api/metrics.py and lmms_eval/models/llava.py * Update function to handle edge cases This commit updates the function to handle edge cases, improving the overall reliability and robustness of the code. * Update black version in pre-commit config * Remove duplicate lines in gqa * Another way to solve memory issue * Handle exception in model generation * Refactor pope_aggregate_results to use "score" key instead of "pope_accuracy" * Update pope metrics aggregation functions * Add model_to_prompt in pope.yaml * Update pope.yaml configuration * Refactor code to simplify construct_requests call --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Add datetime to output name in cli_evaluate function Add get_datetime_str function to utils.py * Refactor pope_aggregate_f1_score function * Fix datetime format in get_datetime_str function * Update JSON dump indentation in cli_evaluate function * Add datetime to output name in cli_evaluate function (#10) * Revert "Add datetime to output name in cli_evaluate function" This reverts commit ef26f78c46b50d8769a4fb6990b909162c2881c3. * Add datetime to output name in cli_evaluate function * [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint * [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * add mmmu (#15) * add mmme * black * add mmmu (#15) * add mmme * black * [Memory issue] Solve memory issue for building context (#14) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * Remove unused function llava_aggregation * Refractor llava-bench aggregation code * Add logs and scripts to .gitignore, and set image_aspect_ratio to original in scienceqa.yaml * Update generation parameters in scienceqa.yaml * Solve memory issue for building context * Solved gather result error * Update lmms_eval scienceqa_img config * Fixed nocaps store results * Revise seedbench prompt * Squashed commit of the following: commit 290126e6a269db4cca9b3544bd017d6c17012793 Author: Zhang Peiyuan Date: Wed Jan 24 14:07:36 2024 +0800 add mmmu (#15) * add mmme * black commit 8b0227cd7b2602d096d773a01b2199d1f4110f22 Author: Li Bo Date: Wed Jan 24 10:00:33 2024 +0800 [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions commit fec494dbe5971e8fa5a886b191a4781be3ce7a6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 23 19:17:40 2024 +0800 [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint commit 4c3c2c63a681f29c537c2467957de1a90568748d Author: Li Bo Date: Tue Jan 23 19:17:12 2024 +0800 [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function --------- Co-authored-by: Bo Li * [Memory issue] Solve memory issue for building context (#14) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * Remove unused function llava_aggregation * Refractor llava-bench aggregation code * Add logs and scripts to .gitignore, and set image_aspect_ratio to original in scienceqa.yaml * Update generation parameters in scienceqa.yaml * Solve memory issue for building context * Solved gather result error * Update lmms_eval scienceqa_img config * Fixed nocaps store results * Revise seedbench prompt * Squashed commit of the following: commit c3cc24a89415aeccad31ccbb10642af677cd6fe5 Author: Zhang Peiyuan Date: Wed Jan 24 14:07:36 2024 +0800 add mmmu (#15) * add mmme * black commit 0dbc5d16c4f45ebea8def5f0bc1a36fcd93f9a05 Author: Li Bo Date: Wed Jan 24 10:00:33 2024 +0800 [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions commit fec494dbe5971e8fa5a886b191a4781be3ce7a6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 23 19:17:40 2024 +0800 [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint commit 4c3c2c63a681f29c537c2467957de1a90568748d Author: Li Bo Date: Tue Jan 23 19:17:12 2024 +0800 [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function --------- Co-authored-by: Bo Li * Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts * [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps * [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps * add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * [Datasets] Changes for Flickr30K and NoCaps, also merged Peiyuan's Model Specific Prompt. (#20) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit a2cc9303dc72e4d53983bb56e54a32e977c3e270 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit 35e87e7c7a480d005abf607c2527a35457d92311 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 89755323596b85208ed33aa88c296604a39af6eb Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0b0d30dfb247c5f0b7b68398b9e9fcde74cf7fa2 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit e273f9cbd91540df86bdbc652bff88a847bd0d2d Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit e84126aaaf8a07bd371a0571a914ccbcd3697f20 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 110deab53dc1a2fd349b1872cd261b69074c5fa8 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 0fa3e0c40075997ea80ed976bdee9615f17d3ece Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit 2aaca579120def99860f90054233f3358950fa66 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Add download configuration for dataset * Update GQA_RAW_IMAGE_DATASET path in utils.py * add datasets * Update gpt_eval_model_name in mathvista.yaml * Merge commit '817eb057bcb61226b33d3ac3c8def01c36c90f96' * Update pyproject.toml with dependencies and URLs * Squashed commit of the following: commit f253968ad703f682a29317bdd51ec6c1fd7c5465 Author: Zhang Peiyuan Date: Sat Jan 27 13:56:37 2024 +0800 Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Refactor image processing and submission file path * Refactor directory creation logic in cli_evaluate_single function * Update dataset path and test split in vqav2.yaml * Remove "total" column from cap_details_columns DataFrame * Add retry logic for dataset download * Add 'tenacity' to dependencies in pyproject.toml * Refactor code in ContextSampler class * Update Black version and configuration, and improve code readability in ContextSampler * Update Black version and line length --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: Fanyi Pu * [Datasets] Changes for Flickr30K and NoCaps, also merged Peiyuan's Model Specific Prompt. (#20) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit 0df825c9e72a06e6acb4c0bd43c2083ffe8b74c0 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit b9d9f9896993033b92346e9f47420c55b866c715 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 4256bef410e4c8d8761e0cd0d79ac5e57b97651b Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0c8a3919885b8fe2880bb2892f7a619d060012d1 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit d2bc7c92ac61179b8c4031e11bc31970355252f6 Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit c78fa29cd0d161641ee05db57bd39314b998c8c7 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 397f0906968fd8ba04b883469b96217737c43e09 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 52a7ea6c7599adeec2ac2787f500e215ce47cf79 Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit f706b2aaf9b288c582611191a1841b58feaeb741 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Add download configuration for dataset * Update GQA_RAW_IMAGE_DATASET path in utils.py * add datasets * Update gpt_eval_model_name in mathvista.yaml * Merge commit '0d620f98b49f8204d02633f209eedd5d8b7a1f7c' * Update pyproject.toml with dependencies and URLs * Squashed commit of the following: commit 8b600f55b6cf5627504c407871539db59f6085a3 Author: Zhang Peiyuan Date: Sat Jan 27 13:56:37 2024 +0800 Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Refactor image processing and submission file path * Refactor directory creation logic in cli_evaluate_single function * Update dataset path and test split in vqav2.yaml * Remove "total" column from cap_details_columns DataFrame * Add retry logic for dataset download * Add 'tenacity' to dependencies in pyproject.toml * Refactor code in ContextSampler class * Update Black version and configuration, and improve code readability in ContextSampler * Update Black version and line length --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: Fanyi Pu * vqav2 (#25) * Update tqdm progress bar position * Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' * Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 767f7e2cae60cf67ec5878234d84321395a3ed15 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * remove useless output file * Update dataset path in vqav2.yaml * Squashed commit of the following: commit eeb2b9827502f044ef67d8440f53124baf219ba3 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:56:45 2024 +0800 Black lint commit 1ce9f0b37e4bc5e6ff5fbfcd23fd339eb14974ae Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:47 2024 +0800 Solve doc_iterator_for_counting crashing issue commit e12b3bb41ed4f51540cfac84e5e96d15777540c4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:13 2024 +0800 Exclude train in refcoco/+/g config commit 42c56f82bc4ccae12e19e76d09d7e525ca9ef2f4 Merge: 6a1ae69 697a438 Author: Bo Li Date: Thu Jan 25 17:17:13 2024 +0000 Merge branch 'dev/bli_add_datasets' of https://github.com/EvolvingLMMs-Lab/lmms-eval into dev/bli_add_datasets commit aed08303fe87808986d206540a0c0ee6d8764988 Author: Bo Li Date: Thu Jan 25 17:17:06 2024 +0000 Fix file path and raise error if config file does not exist commit a105386613c443d9e740c89725cbd1281bbdfef6 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 00:47:24 2024 +0800 Fix tasks issue for nocaps, refcoco/+/g commit 21c8119e377760f44c769bed2528d863a8f4333b Author: Bo Li Date: Thu Jan 25 10:09:43 2024 +0000 Remove unused files and update task configuration commit 0ccb2629c2aacdb297b7cf0c9c2bcfa386bb7582 Author: Bo Li Date: Thu Jan 25 09:43:56 2024 +0000 Add submission file for coco, flickr30k, nocaps, and textcaps tasks commit 5365e13e93c702a1e0e259ee6a08d6a427d72470 Author: Bo Li Date: Thu Jan 25 09:32:54 2024 +0000 Refactor get_task_dict function to handle nested groups commit 6773348c807bcfa1b09ceffc90c75e15cad908f7 Author: Bo Li Date: Thu Jan 25 09:13:46 2024 +0000 Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability commit 31140f9c87dea89ca94c94bc850e3a8d43e5f8b4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 17:07:20 2024 +0800 Fix cli itself can not run with config file commit df1bad47f6ed13f94848d2bee29b28e00c2384b2 Author: Bo Li Date: Thu Jan 25 09:09:04 2024 +0000 Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 06383aa4a5ff59db52fc8d584f3086efd88b7e74 Author: Bo Li Date: Thu Jan 25 09:02:57 2024 +0000 Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit 7a71fd6022ee5985100dda38b94956595cec77a5 Merge: 22c3adf 1d3fdd4 Author: Bo Li Date: Thu Jan 25 08:43:15 2024 +0000 Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' into dev/bli_add_datasets commit 6870cba13cb54976480c1d5e8d97602c246f881b Author: Bo Li Date: Thu Jan 25 08:38:52 2024 +0000 Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit b40d522b6bf483ebdfbf5facd4573de0cf8a93f6 Author: Bo Li Date: Thu Jan 25 08:38:11 2024 +0000 Add coco_val and coco_test tasks to coco.yaml commit 5bf643f73d06f1e540897b753450352bb92fd9ec Author: Bo Li Date: Thu Jan 25 04:58:28 2024 +0000 Update dataset_path in flickr30k.yaml commit 95f110f0eef5196205bc501367e3642c57cc7a17 Author: Bo Li Date: Thu Jan 25 02:12:25 2024 +0000 Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' commit c844ae49b18c1334711832208b0359c9439fe1c0 Author: Bo Li Date: Thu Jan 25 02:10:18 2024 +0000 Add submission folder and update file paths for storing prediction results commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit f0446227f0dd93651e9d6c06254bbf5212ede2dd Merge: c6370bf 51f2eaa Author: Li Bo Date: Wed Jan 24 22:10:07 2024 +0800 Merge branch 'main' into dev/bli_add_datasets commit 1e1f6cfccba758dc606fa4217102518fab73c936 Author: Bo Li Date: Wed Jan 24 14:08:06 2024 +0000 Update dataset paths and improve user prompts commit 966933754b9e5179995b3ab41d746603e13e75c6 Author: Bo Li Date: Wed Jan 24 11:52:33 2024 +0000 Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' commit 767f7e2cae60cf67ec5878234d84321395a3ed15 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Fix bug in login functionality * create vqav2_val * Update vqav2_test.yaml * Update vqav2_test.yaml * Update vqav2_val.yaml --------- Co-authored-by: Li Bo * vqav2 (#25) * Update tqdm progress bar position * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 95ef3ea519cbd772924f9a6afa5394979eb00432 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * remove useless output file * Update dataset path in vqav2.yaml * Squashed commit of the following: commit 75bb7043ea5a533ab6351fc0f5ab055e86106423 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:56:45 2024 +0800 Black lint commit 6635a8aa34cfbd3c7a4afb6fcd214a7283ce01cb Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:47 2024 +0800 Solve doc_iterator_for_counting crashing issue commit 080f42b88ea8acacd527b8d67b84ba1d7d135b03 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:13 2024 +0800 Exclude train in refcoco/+/g config commit 4da84069c08c95e49e8ab0e64a1e103ff7ac8730 Merge: 6a1ae69 697a438 Author: Bo Li Date: Thu Jan 25 17:17:13 2024 +0000 Merge branch 'dev/bli_add_datasets' of https://github.com/EvolvingLMMs-Lab/lmms-eval into dev/bli_add_datasets commit 6a1ae69923d79ae32a001edac38206b605274ec3 Author: Bo Li Date: Thu Jan 25 17:17:06 2024 +0000 Fix file path and raise error if config file does not exist commit 697a4387827ceeec3e393237dd1baa217c714c88 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 00:47:24 2024 +0800 Fix tasks issue for nocaps, refcoco/+/g commit 47e40437126d39a5f062c9a33b4de426c1a29804 Author: Bo Li Date: Thu Jan 25 10:09:43 2024 +0000 Remove unused files and update task configuration commit 9976eb8e9ed03c8613725fdbd822ef5d8cf70e47 Author: Bo Li Date: Thu Jan 25 09:43:56 2024 +0000 Add submission file for coco, flickr30k, nocaps, and textcaps tasks commit 95f97a69faa6129676e89eee14960fcfe2076b7c Author: Bo Li Date: Thu Jan 25 09:32:54 2024 +0000 Refactor get_task_dict function to handle nested groups commit 3b79ee842b2488714baf92ab34528ef77989d392 Author: Bo Li Date: Thu Jan 25 09:13:46 2024 +0000 Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability commit f5c353f2ce93a2d96add4312b695b57432f68cbb Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 17:07:20 2024 +0800 Fix cli itself can not run with config file commit 9a68fec37be74cfe8d4a73390bc83edee147ae24 Author: Bo Li Date: Thu Jan 25 09:09:04 2024 +0000 Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 93f847c5851fd246716367935d6b807b17d53949 Author: Bo Li Date: Thu Jan 25 09:02:57 2024 +0000 Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit fa4ad4404e26d8924f55208746dbb9143b464011 Merge: 22c3adf 1d3fdd4 Author: Bo Li Date: Thu Jan 25 08:43:15 2024 +0000 Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' into dev/bli_add_datasets commit 22c3adfd0645acc23b6d7c06b487f4ffd47666c4 Author: Bo Li Date: Thu Jan 25 08:38:52 2024 +0000 Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit 4c712336b6f7438e717a865910bb241e413a4688 Author: Bo Li Date: Thu Jan 25 08:38:11 2024 +0000 Add coco_val and coco_test tasks to coco.yaml commit b5547126c855927fd4dc8384211e4aceee40870f Author: Bo Li Date: Thu Jan 25 04:58:28 2024 +0000 Update dataset_path in flickr30k.yaml commit f786f61e2559f082072f21aa9030e2080ddaf809 Author: Bo Li Date: Thu Jan 25 02:12:25 2024 +0000 Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' commit 796a011000e0df90f66f8e80cb34dc2318ae9ac8 Author: Bo Li Date: Thu Jan 25 02:10:18 2024 +0000 Add submission folder and update file paths for storing prediction results commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 118744c63eb2d9724571d85fbbd85fcc9ad05b59 Merge: c6370bf 51f2eaa Author: Li Bo Date: Wed Jan 24 22:10:07 2024 +0800 Merge branch 'main' into dev/bli_add_datasets commit c6370bff65903681f00cf3d07111d8e15a57b619 Author: Bo Li Date: Wed Jan 24 14:08:06 2024 +0000 Update dataset paths and improve user prompts commit 810daf458fa94cb3ec2b4a6cc5ecb1e656a24002 Author: Bo Li Date: Wed Jan 24 11:52:33 2024 +0000 Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' commit 95ef3ea519cbd772924f9a6afa5394979eb00432 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Fix bug in login functionality * create vqav2_val * Update vqav2_test.yaml * Update vqav2_test.yaml * Update vqav2_val.yaml --------- Co-authored-by: Li Bo * vizwiz dataset (#24) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit a2cc9303dc72e4d53983bb56e54a32e977c3e270 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit 35e87e7c7a480d005abf607c2527a35457d92311 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 89755323596b85208ed33aa88c296604a39af6eb Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0b0d30dfb247c5f0b7b68398b9e9fcde74cf7fa2 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit e273f9cbd91540df86bdbc652bff88a847bd0d2d Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit e84126aaaf8a07bd371a0571a914ccbcd3697f20 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 110deab53dc1a2fd349b1872cd261b69074c5fa8 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 0fa3e0c40075997ea80ed976bdee9615f17d3ece Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit 2aaca579120def99860f90054233f3358950fa66 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Update lmms_eval/evaluator.py and lmms_eval/tasks/vizwizvqa/utils.py * vizwiz-val * Update utils.py * Update vizwizvqa.yaml --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * vizwiz dataset (#24) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit 0df825c9e72a06e6acb4c0bd43c2083ffe8b74c0 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit b9d9f9896993033b92346e9f47420c55b866c715 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 4256bef410e4c8d8761e0cd0d79ac5e57b97651b Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0c8a3919885b8fe2880bb2892f7a619d060012d1 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit d2bc7c92ac61179b8c4031e11bc31970355252f6 Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit c78fa29cd0d161641ee05db57bd39314b998c8c7 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 397f0906968fd8ba04b883469b96217737c43e09 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 52a7ea6c7599adeec2ac2787f500e215ce47cf79 Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit f706b2aaf9b288c582611191a1841b58feaeb741 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Update lmms_eval/evaluator.py and lmms_eval/tasks/vizwizvqa/utils.py * vizwiz-val * Update utils.py * Update vizwizvqa.yaml --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Datasets] check vizwiz, vqav2 validation set and refcoco's naming conventions. (#26) * Update submission file naming and directory structure * Update task names in refcoco+ and refcocog * Merge commit '0265096d5dfda7ece8f1b95f4e4632417cfe775e' * [Datasets] check vizwiz, vqav2 validation set and refcoco's naming conventions. (#26) * Update submission file naming and directory structure * Update task names in refcoco+ and refcocog * Merge commit 'eac8adc657e2925cdca383e9c8e098e62ced4093' * Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Add/mmmu test (#30) * mmmu_test * black * Add/mmmu test (#30) * mmmu_test * black * [Fix] InfoVQA, WandB logging, CLI problems. (#31) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Refactor CLI evaluate function and improve error logging --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Fix] InfoVQA, WandB logging, CLI problems. (#31) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Refactor CLI evaluate function and improve error logging --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit 4b604e75cfde49df52e4abd90be4876ed9a1b08f Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit 799a6bcb9033656115755c5169f8c342eb927d54 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit d0c8c61d9a23686d31c7e014f0c15d802e04ee61 Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit f4fd4fd29b45436a96fe65395f0922612f598052 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * adapt qwen to sqa, gqa, ai2d, docvqa (#36) * adapt qwen to sqa, gqa, ai2d, docvqa * black * adapt qwen to sqa, gqa, ai2d, docvqa (#36) * adapt qwen to sqa, gqa, ai2d, docvqa * black * [Fix, Feat] Solve llava wild issue when task num can't divide, add fuyu ppl (#37) * Add fuyu ppl, fix llava-bench gather issue * Add gpt4V * Black lint * [Fix, Feat] Solve llava wild issue when task num can't divide, add fuyu ppl (#37) * Add fuyu ppl, fix llava-bench gather issue * Add gpt4V * Black lint * [Logging] Wandb Logging Support (#38) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit 4b604e75cfde49df52e4abd90be4876ed9a1b08f Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit 799a6bcb9033656115755c5169f8c342eb927d54 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * Refactor directory structure for RefCOCO+ and RefCOCOg datasets * Fix error logging in get_eval and parse_score functions * Update .gitignore and mme.yaml * Squashed commit of the following: commit 3d44977c9254d1ee5254b2ca24c8cc54984e84b0 Author: jzhang38 Date: Fri Feb 2 13:43:28 2024 +0800 black commit a38ffeb692fbeb9deebe20f65b0f3e041823e695 Author: jzhang38 Date: Fri Feb 2 13:42:03 2024 +0800 adapt qwen to sqa, gqa, ai2d, docvqa commit e24607fd5725aabb7f6db5fa457b5e6a5123c199 Author: Li Bo Date: Thu Feb 1 16:20:27 2024 +0800 [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit 4b604e75cfde49df52e4abd90be4876ed9a1b08f Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit 799a6bcb9033656115755c5169f8c342eb927d54 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- … * [Logging] Wandb Logging Support (#38) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit d0c8c61d9a23686d31c7e014f0c15d802e04ee61 Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit f4fd4fd29b45436a96fe65395f0922612f598052 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * Refactor directory structure for RefCOCO+ and RefCOCOg datasets * Fix error logging in get_eval and parse_score functions * Update .gitignore and mme.yaml * Squashed commit of the following: commit 380494bb2417fae1bcc1535ad8b67df7af667619 Author: jzhang38 Date: Fri Feb 2 13:43:28 2024 +0800 black commit e46b937aeeed45f5dd574b852459bfb416d165fd Author: jzhang38 Date: Fri Feb 2 13:42:03 2024 +0800 adapt qwen to sqa, gqa, ai2d, docvqa commit 2da8f918c37495b3447b9c24e74234ad0bba8cbf Author: Li Bo Date: Thu Feb 1 16:20:27 2024 +0800 [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit d0c8c61d9a23686d31c7e014f0c15d802e04ee61 Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit f4fd4fd29b45436a96fe65395f0922612f598052 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- … * [Fix] fix bugs (#41) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit 4b604e75cfde49df52e4abd90be4876ed9a1b08f Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit 799a6bcb9033656115755c5169f8c342eb927d54 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * Refactor directory structure for RefCOCO+ and RefCOCOg datasets * Fix error logging in get_eval and parse_score functions * Update .gitignore and mme.yaml * Squashed commit of the following: commit 3d44977c9254d1ee5254b2ca24c8cc54984e84b0 Author: jzhang38 Date: Fri Feb 2 13:43:28 2024 +0800 black commit a38ffeb692fbeb9deebe20f65b0f3e041823e695 Author: jzhang38 Date: Fri Feb 2 13:42:03 2024 +0800 adapt qwen to sqa, gqa, ai2d, docvqa commit e24607fd5725aabb7f6db5fa457b5e6a5123c199 Author: Li Bo Date: Thu Feb 1 16:20:27 2024 +0800 [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit 4b604e75cfde49df52e4abd90be4876ed9a1b08f Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit 799a6bcb9033656115755c5169f8c342eb927d54 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co… * [Fix] fix bugs (#41) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit d0c8c61d9a23686d31c7e014f0c15d802e04ee61 Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit f4fd4fd29b45436a96fe65395f0922612f598052 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * Refactor directory structure for RefCOCO+ and RefCOCOg datasets * Fix error logging in get_eval and parse_score functions * Update .gitignore and mme.yaml * Squashed commit of the following: commit 380494bb2417fae1bcc1535ad8b67df7af667619 Author: jzhang38 Date: Fri Feb 2 13:43:28 2024 +0800 black commit e46b937aeeed45f5dd574b852459bfb416d165fd Author: jzhang38 Date: Fri Feb 2 13:42:03 2024 +0800 adapt qwen to sqa, gqa, ai2d, docvqa commit 2da8f918c37495b3447b9c24e74234ad0bba8cbf Author: Li Bo Date: Thu Feb 1 16:20:27 2024 +0800 [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit d0c8c61d9a23686d31c7e014f0c15d802e04ee61 Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit f4fd4fd29b45436a96fe65395f0922612f598052 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co… * Add multiple choice output type support (#40) * Add multiple choice output type support (#40) * Fix wandb_args["name"] assignment in WandbLogger.init_run() method * Fix wandb_args["name"] assignment in WandbLogger.init_run() method * Joshua/vizwizvqa refactor (#42) * refactor vizwizvqa task * Merge commit '0cf06439d3c85aee8783034b226f1badd3a08608' * Fix exact_match accuracy calculation in vizwiz_vqa_process_results * Update vizwiz_vqa tasks --------- Co-authored-by: Fanyi Pu * Joshua/vizwizvqa refactor (#42) * refactor vizwizvqa task * Merge commit '41d044cd287adcbcf095afb1a0ef5a96c88c3d9d' * Fix exact_match accuracy calculation in vizwiz_vqa_process_results * Update vizwiz_vqa tasks --------- Co-authored-by: Fanyi Pu * [Feat] Add qwen loglikelihood (#43) * Add qwen loglikelihood * Revise the pyproject dependency. Move tiktoken out from optional-dependencies * Add ferret-bench * Add seedbench 2, test on llava * [Feat] Add qwen loglikelihood (#43) * Add qwen loglikelihood * Revise the pyproject dependency. Move tiktoken out from optional-dependencies * Add ferret-bench * Add seedbench 2, test on llava * add cmmmu (#44) Co-authored-by: ygjin11 <1633504509@qq.com> * add cmmmu (#44) Co-authored-by: ygjin11 <1633504509@qq.com> * add stvqa and multidocvqa (#46) * add stvqa and multidocvqa (#46) * Fix seedbench choices bugs (#45) * Fix seedbench choices bugs (#45) * [Model] Add models (#47) * Refactor logging and model initialization * Fix wandb_logger.online() method call * Add error handling during evaluation * Add wait time and error handling in get_chat_response function * Update wait_time in get_chat_response function * Refactor code for improved readability and maintainability * Refactor doc_to_visual function to handle multiple images in ICON-QA tasks * Refactor logging_utils.py and utils.py This commit refactors the `logging_utils.py` and `utils.py` files. It removes unused imports, adjusts code formatting, and updates the `get_chat_response` function to increase the `wait_time` parameter from 5 to 10. * Refactor code for wandb logging and generation in OtterHD class * Refactor prepare_report_by_task method in logging_utils.py * Update generation parameters in OtterHD model * Update generation parameters in OtterHD model * Squashed commit of the following: commit 5a44010c0e4dc836a244775750b4da57c55d4d3a Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Feb 13 18:50:37 2024 +0800 Fix seedbench choices bugs (#45) commit cf10a451a301e7655d8e23ad94d349db3cdd02a2 Author: XinrunDu <154438029+XinrunDu@users.noreply.github.com> Date: Tue Feb 13 18:50:23 2024 +0800 add stvqa and multidocvqa (#46) commit caaad1dd8d698a4a613cd7615a824a4ec0a53e1a Author: XinrunDu <154438029+XinrunDu@users.noreply.github.com> Date: Sun Feb 11 00:54:39 2024 +0800 add cmmmu (#44) Co-authored-by: ygjin11 <1633504509@qq.com> commit cfa11b689034ac694d05752c565fd23791e53507 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Feb 11 00:54:23 2024 +0800 [Feat] Add qwen loglikelihood (#43) * Add qwen loglikelihood * Revise the pyproject dependency. Move tiktoken out from optional-dependencies * Add ferret-bench * Add seedbench 2, test on llava commit 4d42aa88d6c9054c2b037732d506826215fc59c2 Author: JvThunder <44111143+JvThunder@users.noreply.github.com> Date: Wed Feb 7 00:08:22 2024 +0800 Joshua/vizwizvqa refactor (#42) * refactor vizwizvqa task * Merge commit '0cf06439d3c85aee8783034b226f1badd3a08608' * Fix exact_match accuracy calculation in vizwiz_vqa_process_results * Update vizwiz_vqa tasks --------- Co-authored-by: Fanyi Pu * [Model] Add models (#47) * Refactor logging and model initialization * Fix wandb_logger.online() method call * Add error handling during evaluation * Add wait time and error handling in get_chat_response function * Update wait_time in get_chat_response function * Refactor code for improved readability and maintainability * Refactor doc_to_visual function to handle multiple images in ICON-QA tasks * Refactor logging_utils.py and utils.py This commit refactors the `logging_utils.py` and `utils.py` files. It removes unused imports, adjusts code formatting, and updates the `get_chat_response` function to increase the `wait_time` parameter from 5 to 10. * Refactor code for wandb logging and generation in OtterHD class * Refactor prepare_report_by_task method in logging_utils.py * Update generation parameters in OtterHD model * Update generation parameters in OtterHD model * Squashed commit of the following: commit 4011e6cc087714a1a0ca848ec604d307c0761751 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Feb 13 18:50:37 2024 +0800 Fix seedbench choices bugs (#45) commit 16a6c1fef0d023b37e438710393c5162f3891c2c Author: XinrunDu <154438029+XinrunDu@users.noreply.github.com> Date: Tue Feb 13 18:50:23 2024 +0800 add stvqa and multidocvqa (#46) commit 515a7c46754dc55e963d174bdee91907773c5866 Author: XinrunDu <154438029+XinrunDu@users.noreply.github.com> Date: Sun Feb 11 00:54:39 2024 +0800 add cmmmu (#44) Co-authored-by: ygjin11 <1633504509@qq.com> commit b3a013c02934dcf328df18cb792d5907f298de54 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Feb 11 00:54:23 2024 +0800 [Feat] Add qwen loglikelihood (#43) * Add qwen loglikelihood * Revise the pyproject dependency. Move tiktoken out from optional-dependencies * Add ferret-bench * Add seedbench 2, test on llava commit 1b4a4776e16bf480cf94ddead55ede5004949541 Author: JvThunder <44111143+JvThunder@users.noreply.github.com> Date: Wed Feb 7 00:08:22 2024 +0800 Joshua/vizwizvqa refactor (#42) * refactor vizwizvqa task * Merge commit '41d044cd287adcbcf095afb1a0ef5a96c88c3d9d' * Fix exact_match accuracy calculation in vizwiz_vqa_process_results * Update vizwiz_vqa tasks --------- Co-authored-by: Fanyi Pu * [Fix] rearrange location of init eval_logger * [Fix] rearrange location of init eval_logger * [Support] Add prepare script deepspeed for llava (#51) * Add prepare script deepspeed for llava * Comment on using ds to prepare your model * [Support] Add prepare script deepspeed for llava (#51) * Add prepare script deepspeed for llava * Comment on using ds to prepare your model * [Feat] GPT4V added interleaved image and text support (#52) * Revise GPT4V to allow interleaved image and text * Use the first char as the answer for seedbench * Save gpt eval's answer * [Feat] GPT4V added interleaved image and text support (#52) * Revise GPT4V to allow interleaved image and text * Use the first char as the answer for seedbench * Save gpt eval's answer * Update README.md * Update README.md * Update README.md * Update README.md * [Loggings] update logging logic (#54) * [Fix] rearrange location of init eval_logger * Ignore DeprecationWarnings in lmms_eval/__main__.py and lmms_eval/models/fuyu.py * Update lmms_eval/__main__.py and lmms_eval/utils.py * update * Update llava.py with LLaVA model imports and error handling * Add and test new datasets * update * Update wandb version and require report-editing:v0 * Add support for logging samples to Weights and Biases This commit adds a new command-line argument `--wandb_log_samples` to enable logging all model outputs and documents for per-sample measurement and post-hoc analysis to Weights and Biases. The `cli_evaluate` function has been modified to handle this new argument and log the samples if the argument is set to True. The `wandb_logger` object has also been updated to include a new method `log_eval_samples` for logging the samples. This enhancement improves the functionality of the LMMS evaluation tool. * update * [Loggings] update logging logic (#54) * [Fix] rearrange location of init eval_logger * Ignore DeprecationWarnings in lmms_eval/__main__.py and lmms_eval/models/fuyu.py * Update lmms_eval/__main__.py and lmms_eval/utils.py * update * Update llava.py with LLaVA model imports and error handling * Add and test new datasets * update * Update wandb version and require report-editing:v0 * Add support for logging samples to Weights and Biases This commit adds a new command-line argument `--wandb_log_samples` to enable logging all model outputs and documents for per-sample measurement and post-hoc analysis to Weights and Biases. The `cli_evaluate` function has been modified to handle this new argument and log the samples if the argument is set to True. The `wandb_logger` object has also been updated to include a new method `log_eval_samples` for logging the samples. This enhancement improves the functionality of the LMMS evaluation tool. * update * Dataset Refractor (#50) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names --------- Co-authored-by: JvThunder Co-authored-by: kcz358 * Dataset Refractor (#50) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names --------- Co-authored-by: JvThunder Co-authored-by: kcz358 * [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 * Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 * Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 * Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 * [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [Repr] Provide reproduce environment and descriptions for llava-1.5 (#62) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Add timeout to API requests * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix error logging in get_chat_response function * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Squashed commit of the following: commit faf9cf65cf5b1e036ee3a74428e8bb1490e8b2eb Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit e3729eb925b718a44b6eb225ef9b41c7fd2408e0 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit 50b697a7ae93b0547484e1cd753722c1d2513349 Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 17425b5dce41cf67b96c5875139b57d6c7a423df Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 1bc17d54e79e79d11419ba89e7d8e55bc8cfa21b Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit a20bbc30ab576d3e2a587c70af1b7c06575bcd8b Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit e2b657694b888ef59b9f896415e7c4c82497e7bf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 6447d521842b9f83f5119cdcd7714c8f6053ca73 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit 8ac333a2e9ebbe6318d536b6589f767f71fbc092 Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 9e542ce049f68f49a237be165e3ad9cde7408ac0 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit f90ccf7b94b130e118b4eca321f68b81e7ab5850 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit f651a77707a4c723ebffb07f2a87743bf42ecea7 Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit a683559c704806b7abde5e4c8355f556f3e65866 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit 8e246e2466f3dd14a5e34f720269d7991a6dcf6b Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit 67f00dc4652d09c662e5202ff7e5fbf7bebcdaf6 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 53b7a845fe8412a652905101ec036c84e77a20c2 Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit 920b4112c4508e9a8afe824678958f2e78189e4e Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Fix small bugs in list_with_num * Revise list_with_num model args * Dev/readme rm rolling (#60) * remove log_likelyhood_rolling * Update time efficiency benchmark in README.md * add task guide --------- Co-authored-by: jzhang38 Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove unnecessary code and update dependencies * Fix logging utils bug on wandb grouping * Add reproduce envs * Squashed commit of the following: commit 74fff73053b88a90d0f4229a9c748256080fea08 Merge: 2475639 f89a736 Author: kcz358 Date: Sun Mar 3 22:12:12 2024 +0800 Merge branch 'main' into kc/final_fix commit 0c640a636e3882859a17e30a5c3504850a3d02d6 Author: kcz358 Date: Sun Mar 3 22:11:04 2024 +0800 Add reproduce envs commit 7f2b2c38277fcb033c48414d827e96a64e1cac8d Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 21:19:15 2024 +0800 [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit bebff9fad2a60bc0ac52ddc430e5d9e4e0ef6c24 Merge: 83358a4 5e1c9c7 Author: kcz358 Date: Sun Mar 3 07:25:48 2024 +0000 Merge branch 'main' into kc/final_fix commit 5042bb0c2ed4f830dda6bcd14231b1f8763aa95f Author: kcz358 Date: Sun Mar 3 07:23:19 2024 +0000 Fix logging utils bug on wandb grouping commit c82042b46e4c922efd5cb3fa441220333d521f6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 13:01:11 2024 +0800 [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit d78a3d7a53f5285a7eac39ce8f04e9854fdb3e73 Author: kcz358 Date: Sat Mar 2 05:58:08 2024 +0000 Revise list_with_num model args commit 8eefaec8489d48613de9395eb8e8150224985e01 Author: kcz358 Date: Sat Mar 2 05:09:15 2024 +0000 Fix small bugs in list_with_num commit faf9cf65cf5b1e036ee3a74428e8bb1490e8b2eb Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit e3729eb925b718a44b6eb225ef9b41c7fd2408e0 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit 50b697a7ae93b0547484e1cd753722c1d2513349 Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 17425b5dce41cf67b96c5875139b57d6c7a423df Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 1bc17d54e79e79d11419ba89e7d8e55bc8cfa21b Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit a20bbc30ab576d3e2a587c70af1b7c06575bcd8b Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit e2b657694b888ef59b9f896415e7c4c82497e7bf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 6447d521842b9f83f5119cdcd7714c8f6053ca73 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit 8ac333a2e9ebbe6318d536b6589f767f71fbc092 Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 9e542ce049f68f49a237be165e3ad9cde7408ac0 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit f90ccf7b94b130e118b4eca321f68b81e7ab5850 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit f651a77707a4c723ebffb07f2a87743bf42ecea7 Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit a683559c704806b7abde5e4c8355f556f3e65866 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit 8e246e2466f3dd14a5e34f720269d7991a6dcf6b Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit 67f00dc4652d09c662e5202ff7e5fbf7bebcdaf6 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 53b7a845fe8412a652905101ec036c84e77a20c2 Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit 920b4112c4508e9a8afe824678958f2e78189e4e Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update commands.md * Add repr_scripts for reference * Add timeout for gpt4V * Remove unnecessary dependencies * Add reproduce into readme * Revise seedbench process_result * Fix exclude dc hardcode postprocess logic error * Fix metric repeat issue * Update dataset runtime and add environment info * Revise val submission file saving path * Put the correct query into the gpt extraction * Update sleep time in utils.py * update --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [Repr] Provide reproduce environment and descriptions for llava-1.5 (#62) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Add timeout to API requests * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix error logging in get_chat_response function * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Squashed commit of the following: commit 2fbeafc882c80242a10381abc67629d5d8b7071a Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit f188052450bed2f3a30ab6f9a6f7eb844a64cb33 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit baef5905505892593fe783beb18a2de20991d6af Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 11b46f3b701b79b361dd5175a263e4d89bd07fb5 Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 0982de2e7a2310429e51ec7828886fd49953f716 Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit f840ed80f4ae467fff62b61844854a3a9e8ec8a5 Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit 80db78f600d07011188983637c94da84b9475fbf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 676229de870b8d465cef08867cd272a4b696e630 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit d293b96fb3537fea85f10f216d762abf35e05e8d Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 01bbd010590d6b7f105525580209191a1d6d5232 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit 66595ebc073ff9431f2400006196c0645be58ea4 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit 08c2ebad1532fd6c34ac04efb94a268db9862d4f Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit aefbd3c6856584135e2dcbe13381db0e0780f063 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit b9aebc3ff3b122d6d4a81bd2f28e86b2c390c505 Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit c9daa91f2576de69af73c80e263afb085ecd8288 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit b1c4c88b9b36e02e9ed738ff9217d98a5ef2117b Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit b35bc4a6c8fd6b4b2a68bb3054878807b8b92281 Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Fix small bugs in list_with_num * Revise list_with_num model args * Dev/readme rm rolling (#60) * remove log_likelyhood_rolling * Update time efficiency benchmark in README.md * add task guide --------- Co-authored-by: jzhang38 Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove unnecessary code and update dependencies * Fix logging utils bug on wandb grouping * Add reproduce envs * Squashed commit of the following: commit 556b12620379d79c9ed5ddba0856063b498f917c Merge: 2475639 f89a736 Author: kcz358 Date: Sun Mar 3 22:12:12 2024 +0800 Merge branch 'main' into kc/final_fix commit 9509a782c9e9824273cefb1dc9671c92b887697d Author: kcz358 Date: Sun Mar 3 22:11:04 2024 +0800 Add reproduce envs commit 0bff98b798c71a361639385c985eccc54c46dfb6 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 21:19:15 2024 +0800 [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit 7c4501a32bbb415ba7e62e93194b37ba9a435cf5 Merge: 83358a4 5e1c9c7 Author: kcz358 Date: Sun Mar 3 07:25:48 2024 +0000 Merge branch 'main' into kc/final_fix commit 5c419f9fa23616a63a0bd584f18e509bb7704b50 Author: kcz358 Date: Sun Mar 3 07:23:19 2024 +0000 Fix logging utils bug on wandb grouping commit 0010d0ac308051e977981b83a51d0654488501d9 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 13:01:11 2024 +0800 [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit b2ca65d1f12d84ae7a37ecc81f760901389a1af0 Author: kcz358 Date: Sat Mar 2 05:58:08 2024 +0000 Revise list_with_num model args commit a262ea1720b2c02839d21dad2a7618bc80725f18 Author: kcz358 Date: Sat Mar 2 05:09:15 2024 +0000 Fix small bugs in list_with_num commit 2fbeafc882c80242a10381abc67629d5d8b7071a Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit f188052450bed2f3a30ab6f9a6f7eb844a64cb33 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit baef5905505892593fe783beb18a2de20991d6af Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 11b46f3b701b79b361dd5175a263e4d89bd07fb5 Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 0982de2e7a2310429e51ec7828886fd49953f716 Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit f840ed80f4ae467fff62b61844854a3a9e8ec8a5 Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit 80db78f600d07011188983637c94da84b9475fbf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 676229de870b8d465cef08867cd272a4b696e630 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit d293b96fb3537fea85f10f216d762abf35e05e8d Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 01bbd010590d6b7f105525580209191a1d6d5232 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit 66595ebc073ff9431f2400006196c0645be58ea4 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit 08c2ebad1532fd6c34ac04efb94a268db9862d4f Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit aefbd3c6856584135e2dcbe13381db0e0780f063 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit b9aebc3ff3b122d6d4a81bd2f28e86b2c390c505 Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit c9daa91f2576de69af73c80e263afb085ecd8288 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit b1c4c88b9b36e02e9ed738ff9217d98a5ef2117b Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit b35bc4a6c8fd6b4b2a68bb3054878807b8b92281 Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update commands.md * Add repr_scripts for reference * Add timeout for gpt4V * Remove unnecessary dependencies * Add reproduce into readme * Revise seedbench process_result * Fix exclude dc hardcode postprocess logic error * Fix metric repeat issue * Update dataset runtime and add environment info * Revise val submission file saving path * Put the correct query into the gpt extraction * Update sleep time in utils.py * update --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [README] near public (#63) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Add timeout to API requests * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix error logging in get_chat_response function * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Squashed commit of the following: commit faf9cf65cf5b1e036ee3a74428e8bb1490e8b2eb Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit e3729eb925b718a44b6eb225ef9b41c7fd2408e0 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit 50b697a7ae93b0547484e1cd753722c1d2513349 Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 17425b5dce41cf67b96c5875139b57d6c7a423df Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 1bc17d54e79e79d11419ba89e7d8e55bc8cfa21b Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit a20bbc30ab576d3e2a587c70af1b7c06575bcd8b Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit e2b657694b888ef59b9f896415e7c4c82497e7bf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 6447d521842b9f83f5119cdcd7714c8f6053ca73 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit 8ac333a2e9ebbe6318d536b6589f767f71fbc092 Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 9e542ce049f68f49a237be165e3ad9cde7408ac0 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit f90ccf7b94b130e118b4eca321f68b81e7ab5850 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit f651a77707a4c723ebffb07f2a87743bf42ecea7 Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit a683559c704806b7abde5e4c8355f556f3e65866 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit 8e246e2466f3dd14a5e34f720269d7991a6dcf6b Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit 67f00dc4652d09c662e5202ff7e5fbf7bebcdaf6 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 53b7a845fe8412a652905101ec036c84e77a20c2 Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit 920b4112c4508e9a8afe824678958f2e78189e4e Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Fix small bugs in list_with_num * Revise list_with_num model args * Dev/readme rm rolling (#60) * remove log_likelyhood_rolling * Update time efficiency benchmark in README.md * add task guide --------- Co-authored-by: jzhang38 Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove unnecessary code and update dependencies * Fix logging utils bug on wandb grouping * Add reproduce envs * Squashed commit of the following: commit 74fff73053b88a90d0f4229a9c748256080fea08 Merge: 2475639 f89a736 Author: kcz358 Date: Sun Mar 3 22:12:12 2024 +0800 Merge branch 'main' into kc/final_fix commit 0c640a636e3882859a17e30a5c3504850a3d02d6 Author: kcz358 Date: Sun Mar 3 22:11:04 2024 +0800 Add reproduce envs commit 7f2b2c38277fcb033c48414d827e96a64e1cac8d Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 21:19:15 2024 +0800 [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit bebff9fad2a60bc0ac52ddc430e5d9e4e0ef6c24 Merge: 83358a4 5e1c9c7 Author: kcz358 Date: Sun Mar 3 07:25:48 2024 +0000 Merge branch 'main' into kc/final_fix commit 5042bb0c2ed4f830dda6bcd14231b1f8763aa95f Author: kcz358 Date: Sun Mar 3 07:23:19 2024 +0000 Fix logging utils bug on wandb grouping commit c82042b46e4c922efd5cb3fa441220333d521f6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 13:01:11 2024 +0800 [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit d78a3d7a53f5285a7eac39ce8f04e9854fdb3e73 Author: kcz358 Date: Sat Mar 2 05:58:08 2024 +0000 Revise list_with_num model args commit 8eefaec8489d48613de9395eb8e8150224985e01 Author: kcz358 Date: Sat Mar 2 05:09:15 2024 +0000 Fix small bugs in list_with_num commit faf9cf65cf5b1e036ee3a74428e8bb1490e8b2eb Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit e3729eb925b718a44b6eb225ef9b41c7fd2408e0 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit 50b697a7ae93b0547484e1cd753722c1d2513349 Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 17425b5dce41cf67b96c5875139b57d6c7a423df Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 1bc17d54e79e79d11419ba89e7d8e55bc8cfa21b Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit a20bbc30ab576d3e2a587c70af1b7c06575bcd8b Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit e2b657694b888ef59b9f896415e7c4c82497e7bf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 6447d521842b9f83f5119cdcd7714c8f6053ca73 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit 8ac333a2e9ebbe6318d536b6589f767f71fbc092 Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 9e542ce049f68f49a237be165e3ad9cde7408ac0 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit f90ccf7b94b130e118b4eca321f68b81e7ab5850 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit f651a77707a4c723ebffb07f2a87743bf42ecea7 Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit a683559c704806b7abde5e4c8355f556f3e65866 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit 8e246e2466f3dd14a5e34f720269d7991a6dcf6b Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit 67f00dc4652d09c662e5202ff7e5fbf7bebcdaf6 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 53b7a845fe8412a652905101ec036c84e77a20c2 Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit 920b4112c4508e9a8afe824678958f2e78189e4e Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update commands.md * Add repr_scripts for reference * Add timeout for gpt4V * Remove unnecessary dependencies * Add reproduce into readme * Revise seedbench process_result * Fix exclude dc hardcode postprocess logic error * Fix metric repeat issue * Update dataset runtime and add environment info * Revise val submission file saving path * Put the correct query into the gpt extraction * Update sleep time in utils.py * update --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: jzhang38 Co-authored-by: kcz358 * [README] near public (#63) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Add timeout to API requests * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix error logging in get_chat_response function * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Squashed commit of the following: commit 2fbeafc882c80242a10381abc67629d5d8b7071a Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit f188052450bed2f3a30ab6f9a6f7eb844a64cb33 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit baef5905505892593fe783beb18a2de20991d6af Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 11b46f3b701b79b361dd5175a263e4d89bd07fb5 Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 0982de2e7a2310429e51ec7828886fd49953f716 Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit f840ed80f4ae467fff62b61844854a3a9e8ec8a5 Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit 80db78f600d07011188983637c94da84b9475fbf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 676229de870b8d465cef08867cd272a4b696e630 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit d293b96fb3537fea85f10f216d762abf35e05e8d Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 01bbd010590d6b7f105525580209191a1d6d5232 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit 66595ebc073ff9431f2400006196c0645be58ea4 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit 08c2ebad1532fd6c34ac04efb94a268db9862d4f Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit aefbd3c6856584135e2dcbe13381db0e0780f063 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit b9aebc3ff3b122d6d4a81bd2f28e86b2c390c505 Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit c9daa91f2576de69af73c80e263afb085ecd8288 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit b1c4c88b9b36e02e9ed738ff9217d98a5ef2117b Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit b35bc4a6c8fd6b4b2a68bb3054878807b8b92281 Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Fix small bugs in list_with_num * Revise list_with_num model args * Dev/readme rm rolling (#60) * remove log_likelyhood_rolling * Update time efficiency benchmark in README.md * add task guide --------- Co-authored-by: jzhang38 Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove unnecessary code and update dependencies * Fix logging utils bug on wandb grouping * Add reproduce envs * Squashed commit of the following: commit 556b12620379d79c9ed5ddba0856063b498f917c Merge: 2475639 f89a736 Author: kcz358 Date: Sun Mar 3 22:12:12 2024 +0800 Merge branch 'main' into kc/final_fix commit 9509a782c9e9824273cefb1dc9671c92b887697d Author: kcz358 Date: Sun Mar 3 22:11:04 2024 +0800 Add reproduce envs commit 0bff98b798c71a361639385c985eccc54c46dfb6 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 21:19:15 2024 +0800 [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit 7c4501a32bbb415ba7e62e93194b37ba9a435cf5 Merge: 83358a4 5e1c9c7 Author: kcz358 Date: Sun Mar 3 07:25:48 2024 +0000 Merge branch 'main' into kc/final_fix commit 5c419f9fa23616a63a0bd584f18e509bb7704b50 Author: kcz358 Date: Sun Mar 3 07:23:19 2024 +0000 Fix logging utils bug on wandb grouping commit 0010d0ac308051e977981b83a51d0654488501d9 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 13:01:11 2024 +0800 [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit b2ca65d1f12d84ae7a37ecc81f760901389a1af0 Author: kcz358 Date: Sat Mar 2 05:58:08 2024 +0000 Revise list_with_num model args commit a262ea1720b2c02839d21dad2a7618bc80725f18 Author: kcz358 Date: Sat Mar 2 05:09:15 2024 +0000 Fix small bugs in list_with_num commit 2fbeafc882c80242a10381abc67629d5d8b7071a Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit f188052450bed2f3a30ab6f9a6f7eb844a64cb33 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit baef5905505892593fe783beb18a2de20991d6af Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 11b46f3b701b79b361dd5175a263e4d89bd07fb5 Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 0982de2e7a2310429e51ec7828886fd49953f716 Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit f840ed80f4ae467fff62b61844854a3a9e8ec8a5 Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit 80db78f600d07011188983637c94da84b9475fbf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 676229de870b8d465cef08867cd272a4b696e630 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit d293b96fb3537fea85f10f216d762abf35e05e8d Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 01bbd010590d6b7f105525580209191a1d6d5232 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit 66595ebc073ff9431f2400006196c0645be58ea4 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit 08c2ebad1532fd6c34ac04efb94a268db9862d4f Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit aefbd3c6856584135e2dcbe13381db0e0780f063 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit b9aebc3ff3b122d6d4a81bd2f28e86b2c390c505 Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit c9daa91f2576de69af73c80e263afb085ecd8288 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit b1c4c88b9b36e02e9ed738ff9217d98a5ef2117b Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit b35bc4a6c8fd6b4b2a68bb3054878807b8b92281 Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update commands.md * Add repr_scripts for reference * Add timeout for gpt4V * Remove unnecessary dependencies * Add reproduce into readme * Revise seedbench process_result * Fix exclude dc hardcode postprocess logic error * Fix metric repeat issue * Update dataset runtime and add environment info * Revise val submission file saving path * Put the correct query into the gpt extraction * Update sleep time in utils.py * update --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: jzhang38 Co-authored-by: kcz358 * Update README.md * Update README.md * Fix bug in login functionality * Fix bug in login functionality * Refactor device assignment and remove unnecessary line * Refactor device assignment and remove unnecessary line * Refactor code and remove unnecessary lines * Refactor code and remove unnecessary lines * Refactor output path generation in cli_evaluate_single function * Refactor output path generation in cli_evaluate_single function * Update gpt_eval_model_name in llava-in-the-wild.yaml * Update gpt_eval_model_name in llava-in-the-wild.yaml * Update gpt_eval_model_name in llava-in-the-wild.yaml * Update gpt_eval_model_name in llava-in-the-wild.yaml * Fix loglikelihood error for llava 1.6 (#66) * [ReFactor] make internal_dev as the current main branch. (#67) * Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li * VQAv2 eval (#4) * vqav2 * Add vqav2_process_results function and update vqav2_doc_to_text function * Implement vqav2_process_results function to return exact match score * Refactor fewshot_docs() to use config.fewshot_config * Refactor Task class to handle fewshot_docs when training and validation docs are not available * Add answer processing logic in vqav2_process_results function * Refactor vqav2_process_results function and add submission aggregation * Add vqav2_aggreate_submissions function to utils.py * textvqa * Refactor answer processing in textvqa_process_results() function * textvqa eval * Update dataset path and modify textvqa_doc_to_text function * Capitalize the question in textvqa_doc_to_text function * Update textvqa.yaml and utils.py * Fix formatting issues in lmms_eval/api/task.py, lmms_eval/tasks/gqa/utils.py, lmms_eval/tasks/textvqa/utils.py, and lmms_eval/tasks/vqav2/utils.py --------- Co-authored-by: Li Bo * [Big Changes] add LLaVA-1.6, MMVet, LLaVA-W, POPE, and many other changes on logs, model args. (#7) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * black lint * Remove unused code and scripts * Update lmms_eval tasks and utils * Update LMMS-Eval dependencies and configurations * Squashed commit of the following: commit 209f3904f33210bec0b4b146e96fcbd67a4e1541 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Wed Jan 17 20:27:13 2024 +0800 Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li commit f9e48cec5493010a363b446b81a335ef1484e42f Author: Zhang Peiyuan Date: Wed Jan 17 20:26:58 2024 +0800 Update utils.py (#6) * Fix logging issue and remove unnecessary whitespace * Add openai and pycocoevalcap dependencies * Fix device mapping issue in Llava constructor * Add support for truncating context in generation * Update Llava model and evaluation configuration * Update YAML configuration files * Update YAML configuration files * add otterhd and gemini models * Add support for custom image aspect ratio in Llava model * Add dataset_kwargs and max_gen_toks to YAML files * Fix log_samples suffix typo and use hash for output name * Refactor LMMS evaluation code and update LLAVA model properties * matched response for mistral-llava * Refactor logging in llava_aggregation function * Print evaluation statistics instead of logging them * Fix logging information in llava_aggregation function * Add new models and dataset_kwargs for COCO tasks * Update truncate_context parameter in Llava class constructor * Update dataset_kwargs in YAML files * Remove issue type tags from issue and pull request templates * add mmvet and try to modify llava arch * black lint * Update lmms_eval tasks and utils * Update LMMS-Eval dependencies and configurations * Squashed commit of the following: commit 209f3904f33210bec0b4b146e96fcbd67a4e1541 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Wed Jan 17 20:27:13 2024 +0800 Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li commit f9e48cec5493010a363b446b81a335ef1484e42f Author: Zhang Peiyuan Date: Wed Jan 17 20:26:58 2024 +0800 Update utils.py (#6) * Fix logging issue and remove unnecessary whitespace * Add openai and pycocoevalcap dependencies * Fix device mapping issue in Llava constructor * Add support for truncating context in generation * Update Llava model and evaluation configuration * Update YAML configuration files * Update YAML configuration files * add otterhd and gemini models * Add support for custom image aspect ratio in Llava model * Add dataset_kwargs and max_gen_toks to YAML files * Fix log_samples suffix typo and use hash for output name * Refactor LMMS evaluation code and update LLAVA model properties * matched response for mistral-llava * Refactor logging in llava_aggregation function * Print evaluation statistics instead of logging them * Fix logging information in llava_aggregation function * Add new models and dataset_kwargs for COCO tasks * Update truncate_context parameter in Llava class constructor * Update dataset_kwargs in YAML files * Remove issue type tags from issue and pull request templates * Refactor pope utils functions * Update transformers dependency to version 4.36.2 * Revise llava-in-the-wild prompt for align * Add default values for gen_kwargs in Llava class * Fix formatting issues and import pdb for debugging * Remove pdb.set_trace() and update default value for max_new_tokens * Add llava loglikelihood * Fix formatting and indentation issues in lmms_eval/api/metrics.py and lmms_eval/models/llava.py * Update function to handle edge cases This commit updates the function to handle edge cases, improving the overall reliability and robustness of the code. * Update black version in pre-commit config * Remove duplicate lines in gqa * Another way to solve memory issue * Handle exception in model generation * Refactor pope_aggregate_results to use "score" key instead of "pope_accuracy" * Update pope metrics aggregation functions * Add model_to_prompt in pope.yaml * Update pope.yaml configuration * Refactor code to simplify construct_requests call --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Add datetime to output name in cli_evaluate function Add get_datetime_str function to utils.py * Refactor pope_aggregate_f1_score function * Fix datetime format in get_datetime_str function * Update JSON dump indentation in cli_evaluate function * Add datetime to output name in cli_evaluate function (#10) * Revert "Add datetime to output name in cli_evaluate function" This reverts commit ef26f78c46b50d8769a4fb6990b909162c2881c3. * Add datetime to output name in cli_evaluate function * [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint * [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * add mmmu (#15) * add mmme * black * add mmmu (#15) * add mmme * black * [Memory issue] Solve memory issue for building context (#14) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * Remove unused function llava_aggregation * Refractor llava-bench aggregation code * Add logs and scripts to .gitignore, and set image_aspect_ratio to original in scienceqa.yaml * Update generation parameters in scienceqa.yaml * Solve memory issue for building context * Solved gather result error * Update lmms_eval scienceqa_img config * Fixed nocaps store results * Revise seedbench prompt * Squashed commit of the following: commit c3cc24a89415aeccad31ccbb10642af677cd6fe5 Author: Zhang Peiyuan Date: Wed Jan 24 14:07:36 2024 +0800 add mmmu (#15) * add mmme * black commit 0dbc5d16c4f45ebea8def5f0bc1a36fcd93f9a05 Author: Li Bo Date: Wed Jan 24 10:00:33 2024 +0800 [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions commit fec494dbe5971e8fa5a886b191a4781be3ce7a6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 23 19:17:40 2024 +0800 [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint commit 4c3c2c63a681f29c537c2467957de1a90568748d Author: Li Bo Date: Tue Jan 23 19:17:12 2024 +0800 [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function --------- Co-authored-by: Bo Li * [Memory issue] Solve memory issue for building context (#14) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * Remove unused function llava_aggregation * Refractor llava-bench aggregation code * Add logs and scripts to .gitignore, and set image_aspect_ratio to original in scienceqa.yaml * Update generation parameters in scienceqa.yaml * Solve memory issue for building context * Solved gather result error * Update lmms_eval scienceqa_img config * Fixed nocaps store results * Revise seedbench prompt * Squashed commit of the following: commit 290126e6a269db4cca9b3544bd017d6c17012793 Author: Zhang Peiyuan Date: Wed Jan 24 14:07:36 2024 +0800 add mmmu (#15) * add mmme * black commit 8b0227cd7b2602d096d773a01b2199d1f4110f22 Author: Li Bo Date: Wed Jan 24 10:00:33 2024 +0800 [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions commit fec494dbe5971e8fa5a886b191a4781be3ce7a6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 23 19:17:40 2024 +0800 [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint commit 4c3c2c63a681f29c537c2467957de1a90568748d Author: Li Bo Date: Tue Jan 23 19:17:12 2024 +0800 [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function --------- Co-authored-by: Bo Li * Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts * [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps * [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps * add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * [Datasets] Changes for Flickr30K and NoCaps, also merged Peiyuan's Model Specific Prompt. (#20) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit 0df825c9e72a06e6acb4c0bd43c2083ffe8b74c0 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit b9d9f9896993033b92346e9f47420c55b866c715 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 4256bef410e4c8d8761e0cd0d79ac5e57b97651b Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0c8a3919885b8fe2880bb2892f7a619d060012d1 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit d2bc7c92ac61179b8c4031e11bc31970355252f6 Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit c78fa29cd0d161641ee05db57bd39314b998c8c7 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 397f0906968fd8ba04b883469b96217737c43e09 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 52a7ea6c7599adeec2ac2787f500e215ce47cf79 Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit f706b2aaf9b288c582611191a1841b58feaeb741 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Add download configuration for dataset * Update GQA_RAW_IMAGE_DATASET path in utils.py * add datasets * Update gpt_eval_model_name in mathvista.yaml * Merge commit '0d620f98b49f8204d02633f209eedd5d8b7a1f7c' * Update pyproject.toml with dependencies and URLs * Squashed commit of the following: commit 8b600f55b6cf5627504c407871539db59f6085a3 Author: Zhang Peiyuan Date: Sat Jan 27 13:56:37 2024 +0800 Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Refactor image processing and submission file path * Refactor directory creation logic in cli_evaluate_single function * Update dataset path and test split in vqav2.yaml * Remove "total" column from cap_details_columns DataFrame * Add retry logic for dataset download * Add 'tenacity' to dependencies in pyproject.toml * Refactor code in ContextSampler class * Update Black version and configuration, and improve code readability in ContextSampler * Update Black version and line length --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: Fanyi Pu * [Datasets] Changes for Flickr30K and NoCaps, also merged Peiyuan's Model Specific Prompt. (#20) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit a2cc9303dc72e4d53983bb56e54a32e977c3e270 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit 35e87e7c7a480d005abf607c2527a35457d92311 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 89755323596b85208ed33aa88c296604a39af6eb Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0b0d30dfb247c5f0b7b68398b9e9fcde74cf7fa2 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit e273f9cbd91540df86bdbc652bff88a847bd0d2d Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit e84126aaaf8a07bd371a0571a914ccbcd3697f20 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 110deab53dc1a2fd349b1872cd261b69074c5fa8 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 0fa3e0c40075997ea80ed976bdee9615f17d3ece Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit 2aaca579120def99860f90054233f3358950fa66 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Add download configuration for dataset * Update GQA_RAW_IMAGE_DATASET path in utils.py * add datasets * Update gpt_eval_model_name in mathvista.yaml * Merge commit '817eb057bcb61226b33d3ac3c8def01c36c90f96' * Update pyproject.toml with dependencies and URLs * Squashed commit of the following: commit f253968ad703f682a29317bdd51ec6c1fd7c5465 Author: Zhang Peiyuan Date: Sat Jan 27 13:56:37 2024 +0800 Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Refactor image processing and submission file path * Refactor directory creation logic in cli_evaluate_single function * Update dataset path and test split in vqav2.yaml * Remove "total" column from cap_details_columns DataFrame * Add retry logic for dataset download * Add 'tenacity' to dependencies in pyproject.toml * Refactor code in ContextSampler class * Update Black version and configuration, and improve code readability in ContextSampler * Update Black version and line length --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: Fanyi Pu * vqav2 (#25) * Update tqdm progress bar position * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 95ef3ea519cbd772924f9a6afa5394979eb00432 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * remove useless output file * Update dataset path in vqav2.yaml * Squashed commit of the following: commit 75bb7043ea5a533ab6351fc0f5ab055e86106423 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:56:45 2024 +0800 Black lint commit 6635a8aa34cfbd3c7a4afb6fcd214a7283ce01cb Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:47 2024 +0800 Solve doc_iterator_for_counting crashing issue commit 080f42b88ea8acacd527b8d67b84ba1d7d135b03 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:13 2024 +0800 Exclude train in refcoco/+/g config commit 4da84069c08c95e49e8ab0e64a1e103ff7ac8730 Merge: 6a1ae69 697a438 Author: Bo Li Date: Thu Jan 25 17:17:13 2024 +0000 Merge branch 'dev/bli_add_datasets' of https://github.com/EvolvingLMMs-Lab/lmms-eval into dev/bli_add_datasets commit 6a1ae69923d79ae32a001edac38206b605274ec3 Author: Bo Li Date: Thu Jan 25 17:17:06 2024 +0000 Fix file path and raise error if config file does not exist commit 697a4387827ceeec3e393237dd1baa217c714c88 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 00:47:24 2024 +0800 Fix tasks issue for nocaps, refcoco/+/g commit 47e40437126d39a5f062c9a33b4de426c1a29804 Author: Bo Li Date: Thu Jan 25 10:09:43 2024 +0000 Remove unused files and update task configuration commit 9976eb8e9ed03c8613725fdbd822ef5d8cf70e47 Author: Bo Li Date: Thu Jan 25 09:43:56 2024 +0000 Add submission file for coco, flickr30k, nocaps, and textcaps tasks commit 95f97a69faa6129676e89eee14960fcfe2076b7c Author: Bo Li Date: Thu Jan 25 09:32:54 2024 +0000 Refactor get_task_dict function to handle nested groups commit 3b79ee842b2488714baf92ab34528ef77989d392 Author: Bo Li Date: Thu Jan 25 09:13:46 2024 +0000 Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability commit f5c353f2ce93a2d96add4312b695b57432f68cbb Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 17:07:20 2024 +0800 Fix cli itself can not run with config file commit 9a68fec37be74cfe8d4a73390bc83edee147ae24 Author: Bo Li Date: Thu Jan 25 09:09:04 2024 +0000 Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 93f847c5851fd246716367935d6b807b17d53949 Author: Bo Li Date: Thu Jan 25 09:02:57 2024 +0000 Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit fa4ad4404e26d8924f55208746dbb9143b464011 Merge: 22c3adf 1d3fdd4 Author: Bo Li Date: Thu Jan 25 08:43:15 2024 +0000 Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' into dev/bli_add_datasets commit 22c3adfd0645acc23b6d7c06b487f4ffd47666c4 Author: Bo Li Date: Thu Jan 25 08:38:52 2024 +0000 Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit 4c712336b6f7438e717a865910bb241e413a4688 Author: Bo Li Date: Thu Jan 25 08:38:11 2024 +0000 Add coco_val and coco_test tasks to coco.yaml commit b5547126c855927fd4dc8384211e4aceee40870f Author: Bo Li Date: Thu Jan 25 04:58:28 2024 +0000 Update dataset_path in flickr30k.yaml commit f786f61e2559f082072f21aa9030e2080ddaf809 Author: Bo Li Date: Thu Jan 25 02:12:25 2024 +0000 Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' commit 796a011000e0df90f66f8e80cb34dc2318ae9ac8 Author: Bo Li Date: Thu Jan 25 02:10:18 2024 +0000 Add submission folder and update file paths for storing prediction results commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 118744c63eb2d9724571d85fbbd85fcc9ad05b59 Merge: c6370bf 51f2eaa Author: Li Bo Date: Wed Jan 24 22:10:07 2024 +0800 Merge branch 'main' into dev/bli_add_datasets commit c6370bff65903681f00cf3d07111d8e15a57b619 Author: Bo Li Date: Wed Jan 24 14:08:06 2024 +0000 Update dataset paths and improve user prompts commit 810daf458fa94cb3ec2b4a6cc5ecb1e656a24002 Author: Bo Li Date: Wed Jan 24 11:52:33 2024 +0000 Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' commit 95ef3ea519cbd772924f9a6afa5394979eb00432 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Fix bug in login functionality * create vqav2_val * Update vqav2_test.yaml * Update vqav2_test.yaml * Update vqav2_val.yaml --------- Co-authored-by: Li Bo * vqav2 (#25) * Update tqdm progress bar position * Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' * Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 767f7e2cae60cf67ec5878234d84321395a3ed15 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * remove useless output file * Update dataset path in vqav2.yaml * Squashed commit of the following: commit eeb2b9827502f044ef67d8440f53124baf219ba3 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:56:45 2024 +0800 Black lint commit 1ce9f0b37e4bc5e6ff5fbfcd23fd339eb14974ae Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:47 2024 +0800 Solve doc_iterator_for_counting crashing issue commit e12b3bb41ed4f51540cfac84e5e96d15777540c4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:13 2024 +0800 Exclude train in refcoco/+/g config commit 42c56f82bc4ccae12e19e76d09d7e525ca9ef2f4 Merge: 6a1ae69 697a438 Author: Bo Li Date: Thu Jan 25 17:17:13 2024 +0000 Merge branch 'dev/bli_add_datasets' of https://github.com/EvolvingLMMs-Lab/lmms-eval into dev/bli_add_datasets commit aed08303fe87808986d206540a0c0ee6d8764988 Author: Bo Li Date: Thu Jan 25 17:17:06 2024 +0000 Fix file path and raise error if config file does not exist commit a105386613c443d9e740c89725cbd1281bbdfef6 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 00:47:24 2024 +0800 Fix tasks issue for nocaps, refcoco/+/g commit 21c8119e377760f44c769bed2528d863a8f4333b Author: Bo Li Date: Thu Jan 25 10:09:43 2024 +0000 Remove unused files and update task configuration commit 0ccb2629c2aacdb297b7cf0c9c2bcfa386bb7582 Author: Bo Li Date: Thu Jan 25 09:43:56 2024 +0000 Add submission file for coco, flickr30k, nocaps, and textcaps tasks commit 5365e13e93c702a1e0e259ee6a08d6a427d72470 Author: Bo Li Date: Thu Jan 25 09:32:54 2024 +0000 Refactor get_task_dict function to handle nested groups commit 6773348c807bcfa1b09ceffc90c75e15cad908f7 Author: Bo Li Date: Thu Jan 25 09:13:46 2024 +0000 Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability commit 31140f9c87dea89ca94c94bc850e3a8d43e5f8b4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 17:07:20 2024 +0800 Fix cli itself can not run with config file commit df1bad47f6ed13f94848d2bee29b28e00c2384b2 Author: Bo Li Date: Thu Jan 25 09:09:04 2024 +0000 Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 06383aa4a5ff59db52fc8d584f3086efd88b7e74 Author: Bo Li Date: Thu Jan 25 09:02:57 2024 +0000 Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit 7a71fd6022ee5985100dda38b94956595cec77a5 Merge: 22c3adf 1d3fdd4 Author: Bo Li Date: Thu Jan 25 08:43:15 2024 +0000 Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' into dev/bli_add_datasets commit 6870cba13cb54976480c1d5e8d97602c246f881b Author: Bo Li Date: Thu Jan 25 08:38:52 2024 +0000 Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit b40d522b6bf483ebdfbf5facd4573de0cf8a93f6 Author: Bo Li Date: Thu Jan 25 08:38:11 2024 +0000 Add coco_val and coco_test tasks to coco.yaml commit 5bf643f73d06f1e540897b753450352bb92fd9ec Author: Bo Li Date: Thu Jan 25 04:58:28 2024 +0000 Update dataset_path in flickr30k.yaml commit 95f110f0eef5196205bc501367e3642c57cc7a17 Author: Bo Li Date: Thu Jan 25 02:12:25 2024 +0000 Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' commit c844ae49b18c1334711832208b0359c9439fe1c0 Author: Bo Li Date: Thu Jan 25 02:10:18 2024 +0000 Add submission folder and update file paths for storing prediction results commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit f0446227f0dd93651e9d6c06254bbf5212ede2dd Merge: c6370bf 51f2eaa Author: Li Bo Date: Wed Jan 24 22:10:07 2024 +0800 Merge branch 'main' into dev/bli_add_datasets commit 1e1f6cfccba758dc606fa4217102518fab73c936 Author: Bo Li Date: Wed Jan 24 14:08:06 2024 +0000 Update dataset paths and improve user prompts commit 966933754b9e5179995b3ab41d746603e13e75c6 Author: Bo Li Date: Wed Jan 24 11:52:33 2024 +0000 Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' commit 767f7e2cae60cf67ec5878234d84321395a3ed15 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Fix bug in login functionality * create vqav2_val * Update vqav2_test.yaml * Update vqav2_test.yaml * Update vqav2_val.yaml --------- Co-authored-by: Li Bo * vizwiz dataset (#24) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts i… * Update LLaVA-Bench name in README.md * Make sure that gen_kwargs are added to gpt4v * Merge pull request #13 from EvolvingLMMs-Lab/pufanyi/mmbench_fix [Tasks] Fix MMBench * Merge pull request #9 from EvolvingLMMs-Lab/pufanyi/pip_dev update version to 0.1.1 * Make sure that gen_kwargs are added to gpt4v (#68) * Merge commits from lmms-eval/main * Add worldqa task and llava_vid * Adjust snapshot download, we handle the unzip file and the loaded path for the user * Add sft_eval * Generate until strip all response for process results * Squashed commit of the following: commit 75445d4426f491f6369a1138fd3352cb7c9e74fd Author: kcz358 Date: Tue Mar 19 07:49:08 2024 +0000 Add worldqa task and llava_vid * Fix llava repr issue * Fix llava repr error (#70) * Refactor logging and sanitization in WandbLogger * updates * [Feat] Enable world qa evaluation (#71) * Add evaluation metric for worldqa mc and mc_ppl * Fix a small bug in qwen model * put images at the very from MMMU * debug batchsize >1 for llava * Fix image aspect ratio setting in Llava model * Fix setting image aspect ratio in Llava model * change image list * Fix LLaVA import error and update attention implementation * Update dependencies in pyproject.toml and add attn_implementation parameter in Llava class constructor * Squashed commit of the following: commit b1bd1b1644a16f49d1322a2483137254f1711c66 Author: Bo Li Date: Sat Mar 30 17:39:44 2024 +0000 Update dependencies in pyproject.toml and add attn_implementation parameter in Llava class constructor commit 5c0a7ab7d0cee5cab460bfdf674cbd793a1043ca Author: Bo Li Date: Sat Mar 30 16:14:48 2024 +0000 Fix LLaVA import error and update attention implementation * Fix endless warning in fuyu and instructblip * update * updates * remove debug traits * 🐞 fix(): set reasonble patience time * Fix token decoding error in Llava class * Add overwrite config to avoid longer than context length * Delete redundant args * Fix default parameters value error * merge * Remove builder script requirement in video eval * Add videochatgpt support * Add LLaMA-Vid support * Add video-llava support * merge llava_vid from kc/vid_eval to kr_ego * [WIP] adding mmbench dev evaluation (#75) * WIP * Update GPT evaluation model name and sys prompt * 🛠️ Scale accuracy to percentage The accuracy value is now multiplied by 100 in the aggregation function to represent it as a percentage. Regarding the evaluation process, `math` module importation and refactoring reduce progress log verbosity by logging every 100 evaluations instead of 10. It prevents potential logging overflow. Handling of NaN values is added to ensure 'default_value' is set in case of missing data, avoiding errors in split, category, and l2-category assignments. Finally, reporting of categorical and l2-categorical accuracies is streamlined through a new `calculate_hit_rates` function, improving code readability and maintenance. Issue refs: #1427, #1533 * Update GPT evaluation model name and API configuration * Refactor MMBench_Evaluator class to handle missing columns * Add print statements for detailed results in MMBench-CN(CC), MMBench-CN(Dev), and MMBench-EN(Dev) evaluations * Refactor MMBench-CN and MMBench-EN evaluation functions * 🔄 Refactor result processing and logging logic - Simplified the result processing functions across different utility modules (`cc_utils.py`, `cn_utils.py`, `en_utils.py`) to unify the handling of multiple-choice options. Now, all options ("A" to "E") are dynamically added to the result data, and default to "nan" if not provided in the document. - Removed redundant keys directly from the process results dict creation to avoid clutter and align with the new dynamic addition of options. - In `mmbench_evals.py`, removed the unnecessary check for all splits being 'dev' and streamlined the evaluation loop by eliminating the progress bar (tqdm) for a cleaner log output. - Commented-out code and verbose logging during evaluation, which may have interfered with performance, has been removed for a more efficient and less intrusive logging experience. This cleanup reduces redundancy in the codebase and improves evaluation performance. Refs #2045 --------- Co-authored-by: Bo Li * change frame num to 32 * change submission format * change builder file * complete the huggingface dataset building and downloading * add make_hf script * Remove redundant json files * remove redundant py files * remove redundant txt files * remove redundant file that makes hugginface dataset * remove redundant print * remove redundant tasks * add videochatgpt task * add activitynetqa * enable direct scoring for egoschema subset * add videochatgpt gpt-eval * "add some builder script files for activitynetqa as an example" * Update LMMS-Eval and LLaVA models * Update LMMS-Eval and LLaVA models * LiveBench (#89) * try screen_shot * try screenshot * update * screen shoter * update * update * add sampling * update * Add image formatting and generation retry logic * lint * update * Refactor data_capturer.py and qa_generator.py * update * update * update * Refactor RollingBenchData class to include subtask attribute * chore: Refactor data_capturer.py and qa_generator.py * rolling_bench=>live_bench * Update function to handle edge cases * update * update * update * Refactor code and handle exceptions in LiveBench class * update * Refactor load_driver function and update prompt.md * Add JSON import and update text content in qa_generator.py * Update example output file and handle dataset loading error * lint * update example * Update dataset initialization in example.ipynb * Update lmms_eval/live_bench/example.ipynb * clear outputs * self collect image * fix a bug * fix * lint * prompt * add score * update score * Refactor score calculation in GPT4VScoreGetter * Update website capture settings and fix image size in example.ipynb * Refactor LiveBenchData class and add ClaudeScoreGetter * Update ClaudeScoreGetter to include system prompt * update * update * checker for gpt4v * Add checker attribute to LiveBenchData class * Refactor code and update prompt text * update api * clear output * live * bigger max_new_tokens * gemini * fix size * fix --------- Co-authored-by: Bo Li * Update LMMS-Eval and LLaVA models * Update LMMS-Eval and LLaVA models * add cvrr benchmark object count dimension * Fix file path and add unzip functionality * Delete unused files and update model prompt for GPT4V * Update LMMS evaluation tasks and models * Refactor MultiChoiceRegexFilter class to directly extract option letter from model response * Delete unused files and scripts for ActivityNetQA dataset generation * Update NUM_SECONDS_TO_SLEEP value and log response in case of failure * add newest activitynetqa dataset * add newest egoschema dataset * add newest videochatgpt dataset * add newest cvrr dataset * reformat the files * gemini pall * Add encode_video method to GeminiAPI * Add video conversion functionality * restore nextqa * nextqa * Refactor code to improve performance and readability * fix claude * display bug in google gemini * merge bug * nextqa * fix * Imported LLaVA-Video models and updated dependencies * lint * Remove unused import statement in llava_vid.py --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: Bo Li Co-authored-by: Zhang Peiyuan Co-authored-by: JvThunder <44111143+JvThunder@users.noreply.github.com> Co-authored-by: XinrunDu <154438029+XinrunDu@users.noreply.github.com> Co-authored-by: ygjin11 <1633504509@qq.com> Co-authored-by: JvThunder Co-authored-by: kcz358 Co-authored-by: Bo Li Co-authored-by: CarryWho --- lmms_eval/models/claude.py | 17 ++ lmms_eval/models/gemini_api.py | 44 +++- lmms_eval/models/llava_vid.py | 10 +- lmms_eval/tasks/_task_utils/video_loader.py | 24 ++ lmms_eval/tasks/nextqa/_default_template_yaml | 9 + lmms_eval/tasks/nextqa/nextqa.yaml | 4 + lmms_eval/tasks/nextqa/nextqa_test.yaml | 12 + lmms_eval/tasks/nextqa/nextqa_val.yaml | 12 + lmms_eval/tasks/nextqa/stopwords.csv | 157 +++++++++++++ lmms_eval/tasks/nextqa/utils.py | 221 ++++++++++++++++++ 10 files changed, 495 insertions(+), 15 deletions(-) create mode 100644 lmms_eval/tasks/_task_utils/video_loader.py create mode 100644 lmms_eval/tasks/nextqa/_default_template_yaml create mode 100755 lmms_eval/tasks/nextqa/nextqa.yaml create mode 100644 lmms_eval/tasks/nextqa/nextqa_test.yaml create mode 100644 lmms_eval/tasks/nextqa/nextqa_val.yaml create mode 100644 lmms_eval/tasks/nextqa/stopwords.csv create mode 100644 lmms_eval/tasks/nextqa/utils.py diff --git a/lmms_eval/models/claude.py b/lmms_eval/models/claude.py index bc30120bc..a726f851f 100644 --- a/lmms_eval/models/claude.py +++ b/lmms_eval/models/claude.py @@ -13,6 +13,8 @@ from lmms_eval.api.registry import register_model from lmms_eval import utils +from accelerate import Accelerator, DistributedType + from PIL import Image NUM_SECONDS_TO_SLEEP = 5 @@ -41,6 +43,21 @@ def __init__( self.image_token = image_token self.system_prompt = system_prompt + accelerator = Accelerator() + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + else: + self.accelerator = accelerator + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + + self.device = self.accelerator.device + def encode_image(self, image): output_buffer = BytesIO() image.save(output_buffer, format="PNG") diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index 31a782e4a..abbc4dd32 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -9,6 +9,8 @@ from lmms_eval.api.registry import register_model from lmms_eval.api.model import lmms from lmms_eval.api.instance import Instance +from accelerate import Accelerator, DistributedType + eval_logger = logging.getLogger("lmms-eval") @@ -29,6 +31,7 @@ class GeminiAPI(lmms): def __init__( self, model_version: str = "gemini-1.5-flash-latest", + modality: str = "image", timeout: int = 120, **kwargs, ) -> None: @@ -37,6 +40,23 @@ def __init__( self.timeout = timeout self.model = genai.GenerativeModel(model_version) + accelerator = Accelerator() + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + else: + self.accelerator = accelerator + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + + self.device = self.accelerator.device + + self.modality = modality + def flatten(self, input): new_list = [] for i in input: @@ -56,17 +76,17 @@ def get_image_size(self, image): return img_size - def get_image_size(self, image): - # Create a BytesIO object to store the image bytes - img_byte_array = io.BytesIO() - - # Save the image to the BytesIO object - image.save(img_byte_array, format="PNG") - - # Get the size of the BytesIO object - img_size = img_byte_array.tell() + def encode_video(self, video_path): + return genai.upload_file(path=video_path) - return img_size + def convert_video(self, images): + for idx, img in enumerate(images): + if self.modality == "video" and isinstance(img, str): + try: + images[idx] = self.encode_video(img) + except Exception as e: + eval_logger.error(f"Error converting video: {str(e)}") + return images def generate_until(self, requests) -> List[str]: res = [] @@ -85,12 +105,14 @@ def generate_until(self, requests) -> List[str]: visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] visuals = self.flatten(visuals) + visuals = self.convert_video(visuals) message = [contexts] + visuals for attempt in range(5): try: - content = self.model.generate_content(message, generation_config=config).text + content = self.model.generate_content(message, generation_config=config) + content = content.text except Exception as e: eval_logger.info(f"Attempt {attempt + 1} failed with error: {str(e)}") diff --git a/lmms_eval/models/llava_vid.py b/lmms_eval/models/llava_vid.py index 195949b1c..0fc43b7be 100755 --- a/lmms_eval/models/llava_vid.py +++ b/lmms_eval/models/llava_vid.py @@ -19,16 +19,18 @@ eval_logger = logging.getLogger("lmms-eval") try: + from llavavid.model.language_model.llava_llama import LlavaConfig + from llavavid.model.language_model.llava_qwen import LlavaQwenConfig from llavavid.model.builder import load_pretrained_model from llavavid.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria from llavavid.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN, IGNORE_INDEX from llavavid.conversation import conv_templates, SeparatorStyle -except ImportError: - eval_logger.debug("LLaVA-Video is not installed. Please install LLaVA-Video to use this model.") -from llavavid.model.language_model.llava_llama import LlavaConfig + AutoConfig.register("llava_llama", LlavaConfig) + AutoConfig.register("llava_qwen", LlavaQwenConfig) -AutoConfig.register("llava_llama", LlavaConfig) +except ImportError: + eval_logger.debug("LLaVA-Video is not installed. Please install LLaVA-Video to use this model.") @register_model("llavavid") diff --git a/lmms_eval/tasks/_task_utils/video_loader.py b/lmms_eval/tasks/_task_utils/video_loader.py new file mode 100644 index 000000000..abaaff604 --- /dev/null +++ b/lmms_eval/tasks/_task_utils/video_loader.py @@ -0,0 +1,24 @@ +import os + + +def get_cache_dir(config, sub_dir="videos"): + HF_HOME = os.environ["HF_HOME"] + cache_dir = config["dataset_kwargs"]["cache_dir"] + cache_dir = os.path.join(HF_HOME, cache_dir) + cache_dir = os.path.join(cache_dir, sub_dir) + return cache_dir + + +def _get_video_file(prefix: str, video_name: str, suffix: str): + if not video_name.endswith(suffix): + video_name = f"{video_name}.{suffix}" + video_path = os.path.join(prefix, video_name) + return video_path + + +def get_video(prefix: str, video_name: str, suffix: str = "mp4"): + tried = [os.path.abspath(_get_video_file(prefix, video_name, suffix)), os.path.abspath(_get_video_file(prefix, video_name, suffix.upper())), os.path.abspath(_get_video_file(prefix, video_name, suffix.lower()))] + for video_path in tried: + if os.path.exists(video_path): + return video_path + raise FileNotFoundError(f"Tried both {tried} but none of them exist, please check") diff --git a/lmms_eval/tasks/nextqa/_default_template_yaml b/lmms_eval/tasks/nextqa/_default_template_yaml new file mode 100644 index 000000000..3bf1d94a4 --- /dev/null +++ b/lmms_eval/tasks/nextqa/_default_template_yaml @@ -0,0 +1,9 @@ +dataset_path: lmms-lab/NExTQA +dataset_kwargs: + token: True + video: True + cache_dir: nextqa +model_specific_prompt_kwargs: + default: + pre_prompt: "" + post_prompt: "\nAnswer a question using a short phrase or sentence." diff --git a/lmms_eval/tasks/nextqa/nextqa.yaml b/lmms_eval/tasks/nextqa/nextqa.yaml new file mode 100755 index 000000000..26a690b17 --- /dev/null +++ b/lmms_eval/tasks/nextqa/nextqa.yaml @@ -0,0 +1,4 @@ +group: nextqa +task: +- nextqa_test +- nextqa_val diff --git a/lmms_eval/tasks/nextqa/nextqa_test.yaml b/lmms_eval/tasks/nextqa/nextqa_test.yaml new file mode 100644 index 000000000..6003f84b1 --- /dev/null +++ b/lmms_eval/tasks/nextqa/nextqa_test.yaml @@ -0,0 +1,12 @@ +task: "nextqa_test" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.nextqa_doc_to_visual +doc_to_text: !function utils.nextqa_doc_to_text +doc_to_target: !function utils.nextqa_doc_to_target +process_results: !function utils.nextqa_process_results +metric_list: + - metric: WUPS + aggregation: !function utils.nextqa_aggregate_results + higher_is_better: true +include: _default_template_yaml diff --git a/lmms_eval/tasks/nextqa/nextqa_val.yaml b/lmms_eval/tasks/nextqa/nextqa_val.yaml new file mode 100644 index 000000000..70f9b1cc9 --- /dev/null +++ b/lmms_eval/tasks/nextqa/nextqa_val.yaml @@ -0,0 +1,12 @@ +task: "nextqa_val" +test_split: validation +output_type: generate_until +doc_to_visual: !function utils.nextqa_doc_to_visual +doc_to_text: !function utils.nextqa_doc_to_text +doc_to_target: !function utils.nextqa_doc_to_target +process_results: !function utils.nextqa_process_results +metric_list: + - metric: WUPS + aggregation: !function utils.nextqa_aggregate_results + higher_is_better: true +include: _default_template_yaml diff --git a/lmms_eval/tasks/nextqa/stopwords.csv b/lmms_eval/tasks/nextqa/stopwords.csv new file mode 100644 index 000000000..049fba065 --- /dev/null +++ b/lmms_eval/tasks/nextqa/stopwords.csv @@ -0,0 +1,157 @@ +stopwords +i +me +my +myself +we +our +ours +ourselves +you +you're +you've +you'll +you'd +your +yours +yourself +yourselves +he +him +his +himself +she +she's +her +hers +herself +it +it's +its +itself +they +them +their +theirs +themselves +what +which +who +whom +this +that +that'll +these +those +am +is +are +was +were +be +been +being +have +has +had +having +do +does +did +doing +a +an +the +and +but +if +or +because +as +until +while +to +from +of +at +for +with +about +into +through +during +again +further +then +here +there +when +where +why +how +all +any +each +most +other +some +such +only +own +so +than +too +very +s +t +can +will +just +don +don't +should +should've +now +d +ll +m +o +re +ve +y +ain +aren +aren't +couldn +couldn't +didn +didn't +doesn +doesn't +hadn +hadn't +hasn +hasn't +haven +haven't +isn +isn't +ma +mightn +mightn't +mustn +mustn't +needn +needn't +shan +shan't +shouldn +shouldn't +wasn +wasn't +weren +weren't +won +won't +wouldn +wouldn't diff --git a/lmms_eval/tasks/nextqa/utils.py b/lmms_eval/tasks/nextqa/utils.py new file mode 100644 index 000000000..812aee2eb --- /dev/null +++ b/lmms_eval/tasks/nextqa/utils.py @@ -0,0 +1,221 @@ +import os +import yaml +import logging +import pandas as pd + +from pathlib import Path + +eval_logger = logging.getLogger("lmms-eval") + +try: + from pywsd.utils import lemmatize_sentence +except ImportError: + eval_logger.warning("pywsd not installed. Please install pywsd to use this module.") + eval_logger.warning("You can install it by running 'pip install pywsd'") + +from lmms_eval.tasks._task_utils.video_loader import get_cache_dir, get_video +from nltk.tokenize import word_tokenize +from nltk.corpus import wordnet +import numpy as np + + +with open(Path(__file__).parent / "_default_template_yaml", "r") as f: + raw_data = f.readlines() + safe_data = [] + for i, line in enumerate(raw_data): + # remove function definition since yaml load cannot handle it + if "!function" not in line: + safe_data.append(line) + + config = yaml.safe_load("".join(safe_data)) + +stopwords = set(pd.read_csv(Path(__file__).parent / "stopwords.csv").squeeze()) + +cache_dir = get_cache_dir(config, "NExTVideo") + + +def nextqa_doc_to_visual(doc): + return [get_video(cache_dir, doc["video"])] + + +def nextqa_doc_to_text(doc, model_specific_prompt_kwargs=None): + question = doc["question"].strip() + if "pre_prompt" in model_specific_prompt_kwargs and model_specific_prompt_kwargs["pre_prompt"] != "": + question = f"{model_specific_prompt_kwargs['pre_prompt']}{question}" + if "post_prompt" in model_specific_prompt_kwargs and model_specific_prompt_kwargs["post_prompt"] != "": + question = f"{question}{model_specific_prompt_kwargs['post_prompt']}" + return question + + +def nextqa_doc_to_target(doc): + return doc["answer"] + + +def remove_stop(sentence): + sentence.replace("", "") # video-llava + words = lemmatize_sentence(sentence) + words = [w for w in words if not w in stopwords] + return " ".join(words) + + +####################### WUPS ################################ +# The following code copied from # +# https://github.com/doc-doc/NExT-OE/blob/main/metrics.py # +############################################################# + +# ==================================================== +# @Time : 13/9/20 4:19 PM +# @Author : Xiao Junbin +# @Email : junbin@comp.nus.edu.sg +# @File : metrics.py +# ==================================================== + + +def wup(word1, word2, alpha): + """ + calculate the wup similarity + :param word1: + :param word2: + :param alpha: + :return: + """ + # print(word1, word2) + if word1 == word2: + return 1.0 + + w1 = wordnet.synsets(word1) + w1_len = len(w1) + if w1_len == 0: + return 0.0 + w2 = wordnet.synsets(word2) + w2_len = len(w2) + if w2_len == 0: + return 0.0 + + # match the first + word_sim = w1[0].wup_similarity(w2[0]) + if word_sim is None: + word_sim = 0.0 + + if word_sim < alpha: + word_sim = 0.1 * word_sim + return word_sim + + +def wups(words1, words2, alpha): + """ + + :param pred: + :param truth: + :param alpha: + :return: + """ + sim = 1.0 + flag = False + for w1 in words1: + max_sim = 0 + for w2 in words2: + word_sim = wup(w1, w2, alpha) + if word_sim > max_sim: + max_sim = word_sim + if max_sim == 0: + continue + sim *= max_sim + flag = True + if not flag: + sim = 0.0 + return sim + + +def get_wups(pred, truth, alpha): + """ + calculate the wups score + :param pred: + :param truth: + :return: + """ + pred = word_tokenize(pred) + truth = word_tokenize(truth) + item1 = wups(pred, truth, alpha) + item2 = wups(truth, pred, alpha) + value = min(item1, item2) + return value + + +################ END WUPS ################################ + + +def nextqa_process_results(doc, results): + pred = results[0] + answer = doc["answer"] + pred_ans = remove_stop(pred) + gt_ans = remove_stop(answer) + qtype = doc["type"] + if qtype == "TP": + qtype = "TN" + if qtype == "DC" or qtype == "DB": + cur_0 = 1 if pred_ans == gt_ans else 0 + cur_9 = cur_0 + else: + cur_0 = get_wups(pred_ans, gt_ans, 0) + cur_9 = get_wups(pred_ans, gt_ans, 0.9) + return {"WUPS": {"0": cur_0, "0.9": cur_9, "qtype": qtype}} + + +def nextqa_aggregate_results(results): + qtypes = ["CW", "CH", "TN", "TC", "DB", "DC", "DL", "DO"] + num = {"CW": 0, "CH": 0, "TN": 0, "TC": 0, "DB": 0, "DC": 0, "DL": 0, "DO": 0} + over_num = {"C": 0, "T": 0, "D": 0} + wups0 = {"CW": 0, "CH": 0, "TN": 0, "TC": 0, "DB": 0, "DC": 0, "DL": 0, "DO": 0} + wups9 = {"CW": 0, "CH": 0, "TN": 0, "TC": 0, "DB": 0, "DC": 0, "DL": 0, "DO": 0} + ref_num = 0 + for result in results: + qtype = result["qtype"] + num[qtype] += 1 + over_num[qtype[0]] += 1 + ref_num += 1 + cur_0 = result["0"] + cur_9 = result["0.9"] + wups0[qtype] += cur_0 + wups9[qtype] += cur_9 + + wups0_all = wups9_all = 0 + wups0_e = wups0_t = wups0_c = 0 + for qtype in qtypes: + wups0_all += wups0[qtype] + wups9_all += wups9[qtype] + if qtype[0] == "C": + wups0_e += wups0[qtype] + if qtype[0] == "T": + wups0_t += wups0[qtype] + if qtype[0] == "D": + wups0_c += wups0[qtype] + + if num[qtype] != 0: + wups0[qtype] = wups0[qtype] / num[qtype] + wups9[qtype] = wups9[qtype] / num[qtype] + else: + wups0[qtype] = 0 + wups9[qtype] = 0 + + num_e = over_num["C"] + num_t = over_num["T"] + num_c = over_num["D"] + + wups0_e /= num_e + wups0_t /= num_t + wups0_c /= num_c + + wups0_all /= ref_num + wups9_all /= ref_num + + for k in qtypes: + wups0[k] = wups0[k] * 100 + wups9[k] = wups9[k] * 100 + + wups0_e *= 100 + wups0_t *= 100 + wups0_c *= 100 + wups0_all *= 100 + + return wups0_all From 254feeb8bb20ac56bb333fdf3ff12c30921a0cd7 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Sat, 25 May 2024 06:40:17 +0000 Subject: [PATCH 069/181] Update GeminiAPI class to support continual mode and cache API responses --- lmms_eval/models/gemini_api.py | 38 +++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index abbc4dd32..0c9aa2229 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -2,6 +2,7 @@ import os import time import logging +import json from PIL import Image from typing import List, Tuple @@ -11,13 +12,12 @@ from lmms_eval.api.instance import Instance from accelerate import Accelerator, DistributedType - eval_logger = logging.getLogger("lmms-eval") try: import google.generativeai as genai - NUM_SECONDS_TO_SLEEP = 5 + NUM_SECONDS_TO_SLEEP = 30 GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") genai.configure(api_key=GOOGLE_API_KEY) @@ -33,15 +33,31 @@ def __init__( model_version: str = "gemini-1.5-flash-latest", modality: str = "image", timeout: int = 120, + continual_mode: bool = False, + response_persistent_folder: str = None, # We will cache the Gemini API response in this path and use it for future requests **kwargs, ) -> None: super().__init__() self.model_version = model_version self.timeout = timeout self.model = genai.GenerativeModel(model_version) + self.continual_mode = continual_mode + if self.continual_mode and response_persistent_folder is None: + raise ValueError("Continual mode requires a persistent path for the response. We will cache the Gemini API response in this path and use it for future requests. Please provide a valid path.") + self.response_persistent_folder = response_persistent_folder + self.response_persistent_file = os.path.join(self.response_persistent_folder, f"{self.model_version}_response.json") + + if os.path.exists(self.response_persistent_file): + with open(self.response_persistent_file, "r") as f: + self.response_cache = json.load(f) + self.cache_mode = "resume" + else: + self.response_cache = {} + self.cache_mode = "start" accelerator = Accelerator() if accelerator.num_processes > 1: + assert self.continual_mode is False, "Continual mode is not supported with distributed inference." assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." self.accelerator = accelerator if self.accelerator.is_local_main_process: @@ -77,7 +93,8 @@ def get_image_size(self, image): return img_size def encode_video(self, video_path): - return genai.upload_file(path=video_path) + uploaded_obj = genai.upload_file(path=video_path) + return uploaded_obj def convert_video(self, images): for idx, img in enumerate(images): @@ -109,6 +126,14 @@ def generate_until(self, requests) -> List[str]: message = [contexts] + visuals + if self.continual_mode is True and self.cache_mode == "resume": + if doc_id in self.response_cache: + doc_uuid = str(doc_id) + content = self.response_cache[doc_uuid] + res.append(content) + pbar.update(1) + continue + for attempt in range(5): try: content = self.model.generate_content(message, generation_config=config) @@ -123,6 +148,13 @@ def generate_until(self, requests) -> List[str]: content = "" res.append(content) pbar.update(1) + + if self.continual_mode is True: # Cache the response + doc_uuid = str(doc_id) + self.response_cache[doc_uuid] = content + with open(self.response_persistent_file, "w") as f: + json.dump(self.response_cache, f) + pbar.close() return res From 73b6d4e312e55b15aeed8f605008883587f9053b Mon Sep 17 00:00:00 2001 From: Bo Li Date: Sat, 25 May 2024 16:10:58 +0000 Subject: [PATCH 070/181] Add review field to evaluated results --- lmms_eval/tasks/video_detail_description/utils.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lmms_eval/tasks/video_detail_description/utils.py b/lmms_eval/tasks/video_detail_description/utils.py index 9fb8c4b27..f2a6878c5 100755 --- a/lmms_eval/tasks/video_detail_description/utils.py +++ b/lmms_eval/tasks/video_detail_description/utils.py @@ -215,10 +215,11 @@ def gpt_eval(results): # Update the dictionary with the new entries updated_dict = { "video_name": data_dict["video_name"], + "review": review, "score": score, - "Q": question, - "A": answer, - "pred": pred, + # "Q": question, + # "A": answer, + # "pred": pred, } evaluated_results.append(updated_dict) From f1f86e61dc0dbc563dcd34ceb50830975c40cb83 Mon Sep 17 00:00:00 2001 From: Fanyi Pu Date: Sun, 26 May 2024 12:52:43 +0800 Subject: [PATCH 071/181] Add delay before returning uploaded object in encode_video method --- lmms_eval/models/gemini_api.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index 0c9aa2229..455db085d 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -94,6 +94,7 @@ def get_image_size(self, image): def encode_video(self, video_path): uploaded_obj = genai.upload_file(path=video_path) + time.sleep(5) return uploaded_obj def convert_video(self, images): From bc4b541bc29cfc0ed1a478b25869dcec78c37070 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Sun, 26 May 2024 06:42:59 +0000 Subject: [PATCH 072/181] Set llava vid compatible to public --- lmms_eval/models/llava_vid.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lmms_eval/models/llava_vid.py b/lmms_eval/models/llava_vid.py index 0fc43b7be..1da10083f 100755 --- a/lmms_eval/models/llava_vid.py +++ b/lmms_eval/models/llava_vid.py @@ -20,18 +20,22 @@ try: from llavavid.model.language_model.llava_llama import LlavaConfig - from llavavid.model.language_model.llava_qwen import LlavaQwenConfig from llavavid.model.builder import load_pretrained_model from llavavid.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria from llavavid.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN, IGNORE_INDEX from llavavid.conversation import conv_templates, SeparatorStyle AutoConfig.register("llava_llama", LlavaConfig) - AutoConfig.register("llava_qwen", LlavaQwenConfig) except ImportError: eval_logger.debug("LLaVA-Video is not installed. Please install LLaVA-Video to use this model.") +try: + from llavavid.model.language_model.llava_qwen import LlavaQwenConfig + AutoConfig.register("llava_qwen", LlavaQwenConfig) +except: + eval_logger.debug("No llava vid qwen yet for llavavid") + @register_model("llavavid") class LlavaVid(lmms): From 174d8e165d53a63d82143f74556ca38a87ffb014 Mon Sep 17 00:00:00 2001 From: Li Bo Date: Sun, 26 May 2024 14:46:25 +0800 Subject: [PATCH 073/181] [Feat] add gemini api for video and continual mode to gemini api model, fix all top_p=0 to top_p=1. (#96) * Update GeminiAPI class to support continual mode and cache API responses * Add review field to evaluated results * Add delay before returning uploaded object in encode_video method * Update generation_kwargs in YAML files --------- Co-authored-by: Fanyi Pu --- docs/task_guide.md | 2 +- lmms_eval/models/gemini_api.py | 39 +++++++++++++++++-- lmms_eval/models/llava_sglang.py | 3 -- .../activitynetqa_generation.yaml | 2 +- .../tasks/coco_cap/coco2014_cap_test.yaml | 2 +- .../tasks/coco_cap/coco2014_cap_val.yaml | 2 +- .../tasks/coco_cap/coco2017_cap_test.yaml | 2 +- .../tasks/coco_cap/coco2017_cap_val.yaml | 2 +- lmms_eval/tasks/ferret/ferret.yaml | 2 +- lmms_eval/tasks/flickr30k/flickr30k_test.yaml | 2 +- lmms_eval/tasks/gqa/gqa.yaml | 2 +- .../hallusion_bench_image.yaml | 2 +- lmms_eval/tasks/internal_eval/d170_cn.yaml | 2 +- lmms_eval/tasks/internal_eval/d170_en.yaml | 2 +- lmms_eval/tasks/internal_eval/dc100_en.yaml | 2 +- lmms_eval/tasks/internal_eval/dc200_cn.yaml | 2 +- lmms_eval/tasks/livebench/livebench.yaml | 2 +- .../llava-bench-coco/llava-bench-coco.yaml | 2 +- .../llava-in-the-wild/llava-in-the-wild.yaml | 2 +- .../_default_template_wilder_yaml | 2 +- lmms_eval/tasks/mathvista/mathvista_test.yaml | 2 +- .../tasks/mathvista/mathvista_testmini.yaml | 2 +- .../mmbench/_default_template_mmbench_cn_yaml | 2 +- .../mmbench/_default_template_mmbench_en_yaml | 2 +- lmms_eval/tasks/mmbench/mmbench_cc.yaml | 2 +- lmms_eval/tasks/mme/mme.yaml | 2 +- lmms_eval/tasks/mmvet/mmvet.yaml | 2 +- lmms_eval/tasks/nocaps/nocaps_test.yaml | 2 +- lmms_eval/tasks/nocaps/nocaps_val.yaml | 2 +- lmms_eval/tasks/ocrbench/ocrbench.yaml | 2 +- .../olympiadbench/olympiadbench_test_cn.yaml | 2 +- .../olympiadbench/olympiadbench_test_en.yaml | 2 +- lmms_eval/tasks/pope/pope.yaml | 2 +- lmms_eval/tasks/realworldqa/realworldqa.yaml | 2 +- lmms_eval/tasks/synthdog/synthdog_en.yaml | 2 +- lmms_eval/tasks/synthdog/synthdog_zh.yaml | 2 +- lmms_eval/tasks/textcaps/textcaps_test.yaml | 2 +- lmms_eval/tasks/textcaps/textcaps_train.yaml | 2 +- lmms_eval/tasks/textcaps/textcaps_val.yaml | 2 +- .../tasks/video_detail_description/utils.py | 7 ++-- .../videochatgpt_consistency.yaml | 2 +- .../videochatgpt/videochatgpt_temporal.yaml | 2 +- 42 files changed, 79 insertions(+), 48 deletions(-) diff --git a/docs/task_guide.md b/docs/task_guide.md index 31fb443d6..1376bc22e 100755 --- a/docs/task_guide.md +++ b/docs/task_guide.md @@ -27,7 +27,7 @@ doc_to_target: "answer" generation_kwargs: max_new_tokens: 16 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false # The return value of process_results will be used by metrics diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index abbc4dd32..455db085d 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -2,6 +2,7 @@ import os import time import logging +import json from PIL import Image from typing import List, Tuple @@ -11,13 +12,12 @@ from lmms_eval.api.instance import Instance from accelerate import Accelerator, DistributedType - eval_logger = logging.getLogger("lmms-eval") try: import google.generativeai as genai - NUM_SECONDS_TO_SLEEP = 5 + NUM_SECONDS_TO_SLEEP = 30 GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") genai.configure(api_key=GOOGLE_API_KEY) @@ -33,15 +33,31 @@ def __init__( model_version: str = "gemini-1.5-flash-latest", modality: str = "image", timeout: int = 120, + continual_mode: bool = False, + response_persistent_folder: str = None, # We will cache the Gemini API response in this path and use it for future requests **kwargs, ) -> None: super().__init__() self.model_version = model_version self.timeout = timeout self.model = genai.GenerativeModel(model_version) + self.continual_mode = continual_mode + if self.continual_mode and response_persistent_folder is None: + raise ValueError("Continual mode requires a persistent path for the response. We will cache the Gemini API response in this path and use it for future requests. Please provide a valid path.") + self.response_persistent_folder = response_persistent_folder + self.response_persistent_file = os.path.join(self.response_persistent_folder, f"{self.model_version}_response.json") + + if os.path.exists(self.response_persistent_file): + with open(self.response_persistent_file, "r") as f: + self.response_cache = json.load(f) + self.cache_mode = "resume" + else: + self.response_cache = {} + self.cache_mode = "start" accelerator = Accelerator() if accelerator.num_processes > 1: + assert self.continual_mode is False, "Continual mode is not supported with distributed inference." assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." self.accelerator = accelerator if self.accelerator.is_local_main_process: @@ -77,7 +93,9 @@ def get_image_size(self, image): return img_size def encode_video(self, video_path): - return genai.upload_file(path=video_path) + uploaded_obj = genai.upload_file(path=video_path) + time.sleep(5) + return uploaded_obj def convert_video(self, images): for idx, img in enumerate(images): @@ -109,6 +127,14 @@ def generate_until(self, requests) -> List[str]: message = [contexts] + visuals + if self.continual_mode is True and self.cache_mode == "resume": + if doc_id in self.response_cache: + doc_uuid = str(doc_id) + content = self.response_cache[doc_uuid] + res.append(content) + pbar.update(1) + continue + for attempt in range(5): try: content = self.model.generate_content(message, generation_config=config) @@ -123,6 +149,13 @@ def generate_until(self, requests) -> List[str]: content = "" res.append(content) pbar.update(1) + + if self.continual_mode is True: # Cache the response + doc_uuid = str(doc_id) + self.response_cache[doc_uuid] = content + with open(self.response_persistent_file, "w") as f: + json.dump(self.response_cache, f) + pbar.close() return res diff --git a/lmms_eval/models/llava_sglang.py b/lmms_eval/models/llava_sglang.py index 10d5c98c3..af79d1550 100644 --- a/lmms_eval/models/llava_sglang.py +++ b/lmms_eval/models/llava_sglang.py @@ -108,9 +108,6 @@ def _collate(x): gen_kwargs["top_p"] = 1.0 if "num_beams" not in gen_kwargs: gen_kwargs["num_beams"] = 1 - if gen_kwargs["top_p"] == 0.0: - gen_kwargs["top_p"] = 1.0 - gen_kwargs["temperature"] = 0.0 assert gen_kwargs["num_beams"] == 1 def save_image_to_temp_file(image): diff --git a/lmms_eval/tasks/activitynetqa/activitynetqa_generation.yaml b/lmms_eval/tasks/activitynetqa/activitynetqa_generation.yaml index a9bb69d23..e6c167e5f 100755 --- a/lmms_eval/tasks/activitynetqa/activitynetqa_generation.yaml +++ b/lmms_eval/tasks/activitynetqa/activitynetqa_generation.yaml @@ -20,6 +20,6 @@ generation_kwargs: image_aspect_ratio: original max_new_tokens: 64 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false diff --git a/lmms_eval/tasks/coco_cap/coco2014_cap_test.yaml b/lmms_eval/tasks/coco_cap/coco2014_cap_test.yaml index e080450f7..01fc93c06 100755 --- a/lmms_eval/tasks/coco_cap/coco2014_cap_test.yaml +++ b/lmms_eval/tasks/coco_cap/coco2014_cap_test.yaml @@ -11,7 +11,7 @@ doc_to_target: "answer" generation_kwargs: max_new_tokens: 128 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.coco_test_process_result diff --git a/lmms_eval/tasks/coco_cap/coco2014_cap_val.yaml b/lmms_eval/tasks/coco_cap/coco2014_cap_val.yaml index 57b01a7d1..6c14f5f94 100755 --- a/lmms_eval/tasks/coco_cap/coco2014_cap_val.yaml +++ b/lmms_eval/tasks/coco_cap/coco2014_cap_val.yaml @@ -11,7 +11,7 @@ doc_to_target: "answer" generation_kwargs: max_new_tokens: 64 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.coco_process_result diff --git a/lmms_eval/tasks/coco_cap/coco2017_cap_test.yaml b/lmms_eval/tasks/coco_cap/coco2017_cap_test.yaml index ecd73759f..39124a6ac 100755 --- a/lmms_eval/tasks/coco_cap/coco2017_cap_test.yaml +++ b/lmms_eval/tasks/coco_cap/coco2017_cap_test.yaml @@ -11,7 +11,7 @@ doc_to_target: "answer" generation_kwargs: max_new_tokens: 128 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.coco_test_process_result diff --git a/lmms_eval/tasks/coco_cap/coco2017_cap_val.yaml b/lmms_eval/tasks/coco_cap/coco2017_cap_val.yaml index b0d9d4a4b..4ef084b78 100755 --- a/lmms_eval/tasks/coco_cap/coco2017_cap_val.yaml +++ b/lmms_eval/tasks/coco_cap/coco2017_cap_val.yaml @@ -11,7 +11,7 @@ doc_to_target: "answer" generation_kwargs: max_new_tokens: 64 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.coco_process_result diff --git a/lmms_eval/tasks/ferret/ferret.yaml b/lmms_eval/tasks/ferret/ferret.yaml index 517649e72..249b711bf 100755 --- a/lmms_eval/tasks/ferret/ferret.yaml +++ b/lmms_eval/tasks/ferret/ferret.yaml @@ -13,7 +13,7 @@ generation_kwargs: image_aspect_ratio: original max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.ferret_process_results diff --git a/lmms_eval/tasks/flickr30k/flickr30k_test.yaml b/lmms_eval/tasks/flickr30k/flickr30k_test.yaml index 737d9ff49..e38ae9e7c 100755 --- a/lmms_eval/tasks/flickr30k/flickr30k_test.yaml +++ b/lmms_eval/tasks/flickr30k/flickr30k_test.yaml @@ -10,7 +10,7 @@ doc_to_target: "answer" generation_kwargs: max_new_tokens: 64 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.flickr_process_result diff --git a/lmms_eval/tasks/gqa/gqa.yaml b/lmms_eval/tasks/gqa/gqa.yaml index 404e5a059..5d06c37bc 100755 --- a/lmms_eval/tasks/gqa/gqa.yaml +++ b/lmms_eval/tasks/gqa/gqa.yaml @@ -11,7 +11,7 @@ doc_to_target: "answer" generation_kwargs: max_new_tokens: 16 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false metric_list: diff --git a/lmms_eval/tasks/hallusion_bench/hallusion_bench_image.yaml b/lmms_eval/tasks/hallusion_bench/hallusion_bench_image.yaml index 39a5be4c3..d5a485bac 100755 --- a/lmms_eval/tasks/hallusion_bench/hallusion_bench_image.yaml +++ b/lmms_eval/tasks/hallusion_bench/hallusion_bench_image.yaml @@ -15,7 +15,7 @@ model_specific_prompt_kwargs: generation_kwargs: max_new_tokens: 128 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false metric_list: diff --git a/lmms_eval/tasks/internal_eval/d170_cn.yaml b/lmms_eval/tasks/internal_eval/d170_cn.yaml index ebb956e51..dc6e25b08 100755 --- a/lmms_eval/tasks/internal_eval/d170_cn.yaml +++ b/lmms_eval/tasks/internal_eval/d170_cn.yaml @@ -12,7 +12,7 @@ generation_kwargs: - "ASSISTANT:" max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function d170_cn_utils.process_results # apply gpt eval here diff --git a/lmms_eval/tasks/internal_eval/d170_en.yaml b/lmms_eval/tasks/internal_eval/d170_en.yaml index ffae9a6c8..7a4bada6e 100755 --- a/lmms_eval/tasks/internal_eval/d170_en.yaml +++ b/lmms_eval/tasks/internal_eval/d170_en.yaml @@ -12,7 +12,7 @@ generation_kwargs: - "ASSISTANT:" max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function d170_en_utils.process_results # apply gpt eval here diff --git a/lmms_eval/tasks/internal_eval/dc100_en.yaml b/lmms_eval/tasks/internal_eval/dc100_en.yaml index 729f323dd..bf0a4bc9b 100755 --- a/lmms_eval/tasks/internal_eval/dc100_en.yaml +++ b/lmms_eval/tasks/internal_eval/dc100_en.yaml @@ -12,7 +12,7 @@ generation_kwargs: - "ASSISTANT:" max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function dc100_en_utils.process_results # apply gpt eval here diff --git a/lmms_eval/tasks/internal_eval/dc200_cn.yaml b/lmms_eval/tasks/internal_eval/dc200_cn.yaml index 37a888c8d..28439e275 100755 --- a/lmms_eval/tasks/internal_eval/dc200_cn.yaml +++ b/lmms_eval/tasks/internal_eval/dc200_cn.yaml @@ -12,7 +12,7 @@ generation_kwargs: - "ASSISTANT:" max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function dc200_cn_utils.process_results # apply gpt eval here diff --git a/lmms_eval/tasks/livebench/livebench.yaml b/lmms_eval/tasks/livebench/livebench.yaml index 620c38637..74b317bb7 100644 --- a/lmms_eval/tasks/livebench/livebench.yaml +++ b/lmms_eval/tasks/livebench/livebench.yaml @@ -11,7 +11,7 @@ doc_to_target: "answer" generation_kwargs: max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.livebench_process_results diff --git a/lmms_eval/tasks/llava-bench-coco/llava-bench-coco.yaml b/lmms_eval/tasks/llava-bench-coco/llava-bench-coco.yaml index 0f7d33523..b104bcb79 100755 --- a/lmms_eval/tasks/llava-bench-coco/llava-bench-coco.yaml +++ b/lmms_eval/tasks/llava-bench-coco/llava-bench-coco.yaml @@ -13,7 +13,7 @@ generation_kwargs: image_aspect_ratio: original max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 process_results: !function utils.llava_process_results metric_list: diff --git a/lmms_eval/tasks/llava-in-the-wild/llava-in-the-wild.yaml b/lmms_eval/tasks/llava-in-the-wild/llava-in-the-wild.yaml index 5cad8d9db..02e846c37 100755 --- a/lmms_eval/tasks/llava-in-the-wild/llava-in-the-wild.yaml +++ b/lmms_eval/tasks/llava-in-the-wild/llava-in-the-wild.yaml @@ -13,7 +13,7 @@ generation_kwargs: image_aspect_ratio: original max_new_tokens: 32768 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.llava_process_results diff --git a/lmms_eval/tasks/llava_wilder/_default_template_wilder_yaml b/lmms_eval/tasks/llava_wilder/_default_template_wilder_yaml index 00409be0b..37b744f51 100644 --- a/lmms_eval/tasks/llava_wilder/_default_template_wilder_yaml +++ b/lmms_eval/tasks/llava_wilder/_default_template_wilder_yaml @@ -8,7 +8,7 @@ generation_kwargs: image_aspect_ratio: original max_new_tokens: 4096 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.llava_process_results diff --git a/lmms_eval/tasks/mathvista/mathvista_test.yaml b/lmms_eval/tasks/mathvista/mathvista_test.yaml index 171e06d22..31fc2a45d 100755 --- a/lmms_eval/tasks/mathvista/mathvista_test.yaml +++ b/lmms_eval/tasks/mathvista/mathvista_test.yaml @@ -12,7 +12,7 @@ generation_kwargs: - "ASSISTANT:" max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.mathvista_process_results diff --git a/lmms_eval/tasks/mathvista/mathvista_testmini.yaml b/lmms_eval/tasks/mathvista/mathvista_testmini.yaml index 5efd86cef..90fd568a9 100755 --- a/lmms_eval/tasks/mathvista/mathvista_testmini.yaml +++ b/lmms_eval/tasks/mathvista/mathvista_testmini.yaml @@ -12,7 +12,7 @@ generation_kwargs: - "ASSISTANT:" max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.mathvista_process_results diff --git a/lmms_eval/tasks/mmbench/_default_template_mmbench_cn_yaml b/lmms_eval/tasks/mmbench/_default_template_mmbench_cn_yaml index 81094620b..6a699725a 100755 --- a/lmms_eval/tasks/mmbench/_default_template_mmbench_cn_yaml +++ b/lmms_eval/tasks/mmbench/_default_template_mmbench_cn_yaml @@ -9,7 +9,7 @@ doc_to_text: !function cn_utils.mmbench_doc_to_text generation_kwargs: max_new_tokens: 256 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function cn_utils.mmbench_process_results diff --git a/lmms_eval/tasks/mmbench/_default_template_mmbench_en_yaml b/lmms_eval/tasks/mmbench/_default_template_mmbench_en_yaml index ab2b882c8..060bd5d1a 100755 --- a/lmms_eval/tasks/mmbench/_default_template_mmbench_en_yaml +++ b/lmms_eval/tasks/mmbench/_default_template_mmbench_en_yaml @@ -20,6 +20,6 @@ generation_kwargs: - "ASSISTANT:" max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false diff --git a/lmms_eval/tasks/mmbench/mmbench_cc.yaml b/lmms_eval/tasks/mmbench/mmbench_cc.yaml index 4a0d58950..9b7b3cb16 100755 --- a/lmms_eval/tasks/mmbench/mmbench_cc.yaml +++ b/lmms_eval/tasks/mmbench/mmbench_cc.yaml @@ -11,7 +11,7 @@ doc_to_target: "answer" generation_kwargs: max_new_tokens: 256 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function cc_utils.mmbench_cn_cc_process_results diff --git a/lmms_eval/tasks/mme/mme.yaml b/lmms_eval/tasks/mme/mme.yaml index 3d665314e..489745aac 100755 --- a/lmms_eval/tasks/mme/mme.yaml +++ b/lmms_eval/tasks/mme/mme.yaml @@ -10,7 +10,7 @@ doc_to_target: "answer" generation_kwargs: max_new_tokens: 16 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false # The return value of process_results will be used by metrics diff --git a/lmms_eval/tasks/mmvet/mmvet.yaml b/lmms_eval/tasks/mmvet/mmvet.yaml index f5b4962cb..30c1907aa 100755 --- a/lmms_eval/tasks/mmvet/mmvet.yaml +++ b/lmms_eval/tasks/mmvet/mmvet.yaml @@ -12,7 +12,7 @@ generation_kwargs: - "ASSISTANT:" max_new_tokens: 32768 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.mmvet_process_results # apply gpt eval here diff --git a/lmms_eval/tasks/nocaps/nocaps_test.yaml b/lmms_eval/tasks/nocaps/nocaps_test.yaml index 9f21ce2b1..d92ec327d 100755 --- a/lmms_eval/tasks/nocaps/nocaps_test.yaml +++ b/lmms_eval/tasks/nocaps/nocaps_test.yaml @@ -11,7 +11,7 @@ doc_to_target: "annotations_captions" generation_kwargs: max_new_tokens: 64 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.nocaps_test_process_result diff --git a/lmms_eval/tasks/nocaps/nocaps_val.yaml b/lmms_eval/tasks/nocaps/nocaps_val.yaml index 048066a69..125c6d77d 100755 --- a/lmms_eval/tasks/nocaps/nocaps_val.yaml +++ b/lmms_eval/tasks/nocaps/nocaps_val.yaml @@ -11,7 +11,7 @@ doc_to_target: "annotations_captions" generation_kwargs: max_new_tokens: 64 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.nocaps_process_result diff --git a/lmms_eval/tasks/ocrbench/ocrbench.yaml b/lmms_eval/tasks/ocrbench/ocrbench.yaml index 7957e7bfc..243c98d39 100644 --- a/lmms_eval/tasks/ocrbench/ocrbench.yaml +++ b/lmms_eval/tasks/ocrbench/ocrbench.yaml @@ -10,7 +10,7 @@ doc_to_target: "answer" generation_kwargs: max_new_tokens: 128 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.ocrbench_process_results diff --git a/lmms_eval/tasks/olympiadbench/olympiadbench_test_cn.yaml b/lmms_eval/tasks/olympiadbench/olympiadbench_test_cn.yaml index 574d0c194..95a135845 100644 --- a/lmms_eval/tasks/olympiadbench/olympiadbench_test_cn.yaml +++ b/lmms_eval/tasks/olympiadbench/olympiadbench_test_cn.yaml @@ -12,7 +12,7 @@ generation_kwargs: - "ASSISTANT:" max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function cn_utils.olympiadbench_process_results diff --git a/lmms_eval/tasks/olympiadbench/olympiadbench_test_en.yaml b/lmms_eval/tasks/olympiadbench/olympiadbench_test_en.yaml index 6d293fb7a..c87f7ab44 100644 --- a/lmms_eval/tasks/olympiadbench/olympiadbench_test_en.yaml +++ b/lmms_eval/tasks/olympiadbench/olympiadbench_test_en.yaml @@ -12,7 +12,7 @@ generation_kwargs: - "ASSISTANT:" max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function en_utils.olympiadbench_process_results diff --git a/lmms_eval/tasks/pope/pope.yaml b/lmms_eval/tasks/pope/pope.yaml index 703fe3d82..715cf7d13 100755 --- a/lmms_eval/tasks/pope/pope.yaml +++ b/lmms_eval/tasks/pope/pope.yaml @@ -10,7 +10,7 @@ doc_to_target: "answer" generation_kwargs: max_new_tokens: 128 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.pope_process_results diff --git a/lmms_eval/tasks/realworldqa/realworldqa.yaml b/lmms_eval/tasks/realworldqa/realworldqa.yaml index adb89be0e..4b4149672 100644 --- a/lmms_eval/tasks/realworldqa/realworldqa.yaml +++ b/lmms_eval/tasks/realworldqa/realworldqa.yaml @@ -11,7 +11,7 @@ doc_to_target: "answer" generation_kwargs: max_new_tokens: 16 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false diff --git a/lmms_eval/tasks/synthdog/synthdog_en.yaml b/lmms_eval/tasks/synthdog/synthdog_en.yaml index b08b9cb42..d64cad787 100644 --- a/lmms_eval/tasks/synthdog/synthdog_en.yaml +++ b/lmms_eval/tasks/synthdog/synthdog_en.yaml @@ -10,7 +10,7 @@ doc_to_target: !function utils.synthdog_doc_to_target generation_kwargs: max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.synthdog_process_results diff --git a/lmms_eval/tasks/synthdog/synthdog_zh.yaml b/lmms_eval/tasks/synthdog/synthdog_zh.yaml index 3ffbb3b0f..4a895ac2f 100644 --- a/lmms_eval/tasks/synthdog/synthdog_zh.yaml +++ b/lmms_eval/tasks/synthdog/synthdog_zh.yaml @@ -10,7 +10,7 @@ doc_to_target: !function utils.synthdog_doc_to_target generation_kwargs: max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.synthdog_process_results diff --git a/lmms_eval/tasks/textcaps/textcaps_test.yaml b/lmms_eval/tasks/textcaps/textcaps_test.yaml index 263692204..f5c2a915c 100755 --- a/lmms_eval/tasks/textcaps/textcaps_test.yaml +++ b/lmms_eval/tasks/textcaps/textcaps_test.yaml @@ -11,7 +11,7 @@ doc_to_target: "answer" generation_kwargs: max_new_tokens: 64 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.textcaps_test_process_result diff --git a/lmms_eval/tasks/textcaps/textcaps_train.yaml b/lmms_eval/tasks/textcaps/textcaps_train.yaml index 931aeb176..9422bb4b0 100755 --- a/lmms_eval/tasks/textcaps/textcaps_train.yaml +++ b/lmms_eval/tasks/textcaps/textcaps_train.yaml @@ -13,7 +13,7 @@ generation_kwargs: - "ASSISTANT:" max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.textcaps_process_result diff --git a/lmms_eval/tasks/textcaps/textcaps_val.yaml b/lmms_eval/tasks/textcaps/textcaps_val.yaml index 41baec8e2..426b17050 100755 --- a/lmms_eval/tasks/textcaps/textcaps_val.yaml +++ b/lmms_eval/tasks/textcaps/textcaps_val.yaml @@ -11,7 +11,7 @@ doc_to_target: "answer" generation_kwargs: max_new_tokens: 64 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false process_results: !function utils.textcaps_process_result diff --git a/lmms_eval/tasks/video_detail_description/utils.py b/lmms_eval/tasks/video_detail_description/utils.py index 9fb8c4b27..f2a6878c5 100755 --- a/lmms_eval/tasks/video_detail_description/utils.py +++ b/lmms_eval/tasks/video_detail_description/utils.py @@ -215,10 +215,11 @@ def gpt_eval(results): # Update the dictionary with the new entries updated_dict = { "video_name": data_dict["video_name"], + "review": review, "score": score, - "Q": question, - "A": answer, - "pred": pred, + # "Q": question, + # "A": answer, + # "pred": pred, } evaluated_results.append(updated_dict) diff --git a/lmms_eval/tasks/videochatgpt/videochatgpt_consistency.yaml b/lmms_eval/tasks/videochatgpt/videochatgpt_consistency.yaml index 84e6a8c0f..850561838 100755 --- a/lmms_eval/tasks/videochatgpt/videochatgpt_consistency.yaml +++ b/lmms_eval/tasks/videochatgpt/videochatgpt_consistency.yaml @@ -18,7 +18,7 @@ generation_kwargs: image_aspect_ratio: original max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false \ No newline at end of file diff --git a/lmms_eval/tasks/videochatgpt/videochatgpt_temporal.yaml b/lmms_eval/tasks/videochatgpt/videochatgpt_temporal.yaml index 1bf336cea..18754afdb 100755 --- a/lmms_eval/tasks/videochatgpt/videochatgpt_temporal.yaml +++ b/lmms_eval/tasks/videochatgpt/videochatgpt_temporal.yaml @@ -18,6 +18,6 @@ generation_kwargs: image_aspect_ratio: original max_new_tokens: 1024 temperature: 0 - top_p: 0 + top_p: 1.0 num_beams: 1 do_sample: false From a8b2c88a710e2a4857f65fa07a01f3fc0858d150 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Sun, 26 May 2024 07:00:08 +0000 Subject: [PATCH 074/181] Unified the error log in the task, set to debug --- lmms_eval/tasks/nextqa/utils.py | 4 ++-- lmms_eval/tasks/olympiadbench/olympiadbench_evals.py | 5 ++++- lmms_eval/tasks/synthdog/donut_evaluator.py | 6 +++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/lmms_eval/tasks/nextqa/utils.py b/lmms_eval/tasks/nextqa/utils.py index 812aee2eb..d8e059db7 100644 --- a/lmms_eval/tasks/nextqa/utils.py +++ b/lmms_eval/tasks/nextqa/utils.py @@ -10,8 +10,8 @@ try: from pywsd.utils import lemmatize_sentence except ImportError: - eval_logger.warning("pywsd not installed. Please install pywsd to use this module.") - eval_logger.warning("You can install it by running 'pip install pywsd'") + eval_logger.debug("pywsd not installed. Please install pywsd to use this module.") + eval_logger.debug("You can install it by running 'pip install pywsd'") from lmms_eval.tasks._task_utils.video_loader import get_cache_dir, get_video from nltk.tokenize import word_tokenize diff --git a/lmms_eval/tasks/olympiadbench/olympiadbench_evals.py b/lmms_eval/tasks/olympiadbench/olympiadbench_evals.py index 9296e5bd0..ffecfa4e3 100644 --- a/lmms_eval/tasks/olympiadbench/olympiadbench_evals.py +++ b/lmms_eval/tasks/olympiadbench/olympiadbench_evals.py @@ -1,11 +1,14 @@ import re import sympy as sp +import logging +eval_logger = logging.getLogger("lmms-eval") + try: from sympy import simplify, Eq, sympify, Pow from sympy.parsing.latex import parse_latex except ImportError as e: - print("Please install sympy package by running 'pip install sympy' if you want to use OlympiadBenchEvaluator.") + eval_logger.debug("Please install sympy package by running 'pip install sympy' if you want to use OlympiadBenchEvaluator.") import math # how to use diff --git a/lmms_eval/tasks/synthdog/donut_evaluator.py b/lmms_eval/tasks/synthdog/donut_evaluator.py index b24c42580..91f2bbaab 100644 --- a/lmms_eval/tasks/synthdog/donut_evaluator.py +++ b/lmms_eval/tasks/synthdog/donut_evaluator.py @@ -10,11 +10,15 @@ from torch.utils.data import Dataset from transformers.modeling_utils import PreTrainedModel + +import logging +eval_logger = logging.getLogger("lmms-eval") + try: import zss from zss import Node except ImportError: - print("Please install zss library. You can install it by running 'pip install zss'") + eval_logger.debug("Please install zss library. You can install it by running 'pip install zss'") class JSONParseEvaluator: From 312c1602daac538190f0417167d9ac99038dd017 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Sun, 26 May 2024 07:00:25 +0000 Subject: [PATCH 075/181] Make sure unzip only happens in main process --- lmms_eval/api/task.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index 35716b24c..b31e4b348 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -691,10 +691,14 @@ def download(self, dataset_kwargs=None) -> None: cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset") zip_files = glob(os.path.join(cache_path, "**/*.zip"), recursive=True) - if not os.path.exists(cache_dir) and len(zip_files) > 0: + + from accelerate import Accelerator + accelerator = Accelerator() + if not os.path.exists(cache_dir) and len(zip_files) > 0 and accelerator.is_main_process: for zip_file in zip_files: - print(f"Unzipping {zip_file} to {cache_dir}") + eval_logger.info(f"Unzipping {zip_file} to {cache_dir}") shutil.unpack_archive(zip_file, cache_dir) + accelerator.wait_for_everyone() if "builder_script" in dataset_kwargs: builder_script = dataset_kwargs["builder_script"] From 00da77e33233a0e5ae5d39c348c2771db91d2750 Mon Sep 17 00:00:00 2001 From: Hukairui <71913595+KairuiHu@users.noreply.github.com> Date: Sun, 26 May 2024 15:47:07 +0800 Subject: [PATCH 076/181] Complete the implementation of CVRR video dataset (#97) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li * VQAv2 eval (#4) * vqav2 * Add vqav2_process_results function and update vqav2_doc_to_text function * Implement vqav2_process_results function to return exact match score * Refactor fewshot_docs() to use config.fewshot_config * Refactor Task class to handle fewshot_docs when training and validation docs are not available * Add answer processing logic in vqav2_process_results function * Refactor vqav2_process_results function and add submission aggregation * Add vqav2_aggreate_submissions function to utils.py * textvqa * Refactor answer processing in textvqa_process_results() function * textvqa eval * Update dataset path and modify textvqa_doc_to_text function * Capitalize the question in textvqa_doc_to_text function * Update textvqa.yaml and utils.py * Fix formatting issues in lmms_eval/api/task.py, lmms_eval/tasks/gqa/utils.py, lmms_eval/tasks/textvqa/utils.py, and lmms_eval/tasks/vqav2/utils.py --------- Co-authored-by: Li Bo * [Big Changes] add LLaVA-1.6, MMVet, LLaVA-W, POPE, and many other changes on logs, model args. (#7) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * black lint * Remove unused code and scripts * Update lmms_eval tasks and utils * Update LMMS-Eval dependencies and configurations * Squashed commit of the following: commit 209f3904f33210bec0b4b146e96fcbd67a4e1541 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Wed Jan 17 20:27:13 2024 +0800 Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li commit f9e48cec5493010a363b446b81a335ef1484e42f Author: Zhang Peiyuan Date: Wed Jan 17 20:26:58 2024 +0800 Update utils.py (#6) * Fix logging issue and remove unnecessary whitespace * Add openai and pycocoevalcap dependencies * Fix device mapping issue in Llava constructor * Add support for truncating context in generation * Update Llava model and evaluation configuration * Update YAML configuration files * Update YAML configuration files * add otterhd and gemini models * Add support for custom image aspect ratio in Llava model * Add dataset_kwargs and max_gen_toks to YAML files * Fix log_samples suffix typo and use hash for output name * Refactor LMMS evaluation code and update LLAVA model properties * matched response for mistral-llava * Refactor logging in llava_aggregation function * Print evaluation statistics instead of logging them * Fix logging information in llava_aggregation function * Add new models and dataset_kwargs for COCO tasks * Update truncate_context parameter in Llava class constructor * Update dataset_kwargs in YAML files * Remove issue type tags from issue and pull request templates * add mmvet and try to modify llava arch * black lint * Update lmms_eval tasks and utils * Update LMMS-Eval dependencies and configurations * Squashed commit of the following: commit 209f3904f33210bec0b4b146e96fcbd67a4e1541 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Wed Jan 17 20:27:13 2024 +0800 Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li commit f9e48cec5493010a363b446b81a335ef1484e42f Author: Zhang Peiyuan Date: Wed Jan 17 20:26:58 2024 +0800 Update utils.py (#6) * Fix logging issue and remove unnecessary whitespace * Add openai and pycocoevalcap dependencies * Fix device mapping issue in Llava constructor * Add support for truncating context in generation * Update Llava model and evaluation configuration * Update YAML configuration files * Update YAML configuration files * add otterhd and gemini models * Add support for custom image aspect ratio in Llava model * Add dataset_kwargs and max_gen_toks to YAML files * Fix log_samples suffix typo and use hash for output name * Refactor LMMS evaluation code and update LLAVA model properties * matched response for mistral-llava * Refactor logging in llava_aggregation function * Print evaluation statistics instead of logging them * Fix logging information in llava_aggregation function * Add new models and dataset_kwargs for COCO tasks * Update truncate_context parameter in Llava class constructor * Update dataset_kwargs in YAML files * Remove issue type tags from issue and pull request templates * Refactor pope utils functions * Update transformers dependency to version 4.36.2 * Revise llava-in-the-wild prompt for align * Add default values for gen_kwargs in Llava class * Fix formatting issues and import pdb for debugging * Remove pdb.set_trace() and update default value for max_new_tokens * Add llava loglikelihood * Fix formatting and indentation issues in lmms_eval/api/metrics.py and lmms_eval/models/llava.py * Update function to handle edge cases This commit updates the function to handle edge cases, improving the overall reliability and robustness of the code. * Update black version in pre-commit config * Remove duplicate lines in gqa * Another way to solve memory issue * Handle exception in model generation * Refactor pope_aggregate_results to use "score" key instead of "pope_accuracy" * Update pope metrics aggregation functions * Add model_to_prompt in pope.yaml * Update pope.yaml configuration * Refactor code to simplify construct_requests call --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Add datetime to output name in cli_evaluate function Add get_datetime_str function to utils.py * Refactor pope_aggregate_f1_score function * Fix datetime format in get_datetime_str function * Update JSON dump indentation in cli_evaluate function * Add datetime to output name in cli_evaluate function (#10) * Revert "Add datetime to output name in cli_evaluate function" This reverts commit ef26f78c46b50d8769a4fb6990b909162c2881c3. * Add datetime to output name in cli_evaluate function * [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint * [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * add mmmu (#15) * add mmme * black * add mmmu (#15) * add mmme * black * [Memory issue] Solve memory issue for building context (#14) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * Remove unused function llava_aggregation * Refractor llava-bench aggregation code * Add logs and scripts to .gitignore, and set image_aspect_ratio to original in scienceqa.yaml * Update generation parameters in scienceqa.yaml * Solve memory issue for building context * Solved gather result error * Update lmms_eval scienceqa_img config * Fixed nocaps store results * Revise seedbench prompt * Squashed commit of the following: commit 290126e6a269db4cca9b3544bd017d6c17012793 Author: Zhang Peiyuan Date: Wed Jan 24 14:07:36 2024 +0800 add mmmu (#15) * add mmme * black commit 8b0227cd7b2602d096d773a01b2199d1f4110f22 Author: Li Bo Date: Wed Jan 24 10:00:33 2024 +0800 [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions commit fec494dbe5971e8fa5a886b191a4781be3ce7a6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 23 19:17:40 2024 +0800 [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint commit 4c3c2c63a681f29c537c2467957de1a90568748d Author: Li Bo Date: Tue Jan 23 19:17:12 2024 +0800 [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function --------- Co-authored-by: Bo Li * [Memory issue] Solve memory issue for building context (#14) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * Remove unused function llava_aggregation * Refractor llava-bench aggregation code * Add logs and scripts to .gitignore, and set image_aspect_ratio to original in scienceqa.yaml * Update generation parameters in scienceqa.yaml * Solve memory issue for building context * Solved gather result error * Update lmms_eval scienceqa_img config * Fixed nocaps store results * Revise seedbench prompt * Squashed commit of the following: commit c3cc24a89415aeccad31ccbb10642af677cd6fe5 Author: Zhang Peiyuan Date: Wed Jan 24 14:07:36 2024 +0800 add mmmu (#15) * add mmme * black commit 0dbc5d16c4f45ebea8def5f0bc1a36fcd93f9a05 Author: Li Bo Date: Wed Jan 24 10:00:33 2024 +0800 [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions commit fec494dbe5971e8fa5a886b191a4781be3ce7a6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 23 19:17:40 2024 +0800 [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint commit 4c3c2c63a681f29c537c2467957de1a90568748d Author: Li Bo Date: Tue Jan 23 19:17:12 2024 +0800 [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function --------- Co-authored-by: Bo Li * Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts * [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps * [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps * add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * [Datasets] Changes for Flickr30K and NoCaps, also merged Peiyuan's Model Specific Prompt. (#20) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit a2cc9303dc72e4d53983bb56e54a32e977c3e270 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit 35e87e7c7a480d005abf607c2527a35457d92311 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 89755323596b85208ed33aa88c296604a39af6eb Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0b0d30dfb247c5f0b7b68398b9e9fcde74cf7fa2 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit e273f9cbd91540df86bdbc652bff88a847bd0d2d Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit e84126aaaf8a07bd371a0571a914ccbcd3697f20 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 110deab53dc1a2fd349b1872cd261b69074c5fa8 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 0fa3e0c40075997ea80ed976bdee9615f17d3ece Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit 2aaca579120def99860f90054233f3358950fa66 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Add download configuration for dataset * Update GQA_RAW_IMAGE_DATASET path in utils.py * add datasets * Update gpt_eval_model_name in mathvista.yaml * Merge commit '817eb057bcb61226b33d3ac3c8def01c36c90f96' * Update pyproject.toml with dependencies and URLs * Squashed commit of the following: commit f253968ad703f682a29317bdd51ec6c1fd7c5465 Author: Zhang Peiyuan Date: Sat Jan 27 13:56:37 2024 +0800 Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Refactor image processing and submission file path * Refactor directory creation logic in cli_evaluate_single function * Update dataset path and test split in vqav2.yaml * Remove "total" column from cap_details_columns DataFrame * Add retry logic for dataset download * Add 'tenacity' to dependencies in pyproject.toml * Refactor code in ContextSampler class * Update Black version and configuration, and improve code readability in ContextSampler * Update Black version and line length --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: Fanyi Pu * [Datasets] Changes for Flickr30K and NoCaps, also merged Peiyuan's Model Specific Prompt. (#20) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit 0df825c9e72a06e6acb4c0bd43c2083ffe8b74c0 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit b9d9f9896993033b92346e9f47420c55b866c715 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 4256bef410e4c8d8761e0cd0d79ac5e57b97651b Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0c8a3919885b8fe2880bb2892f7a619d060012d1 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit d2bc7c92ac61179b8c4031e11bc31970355252f6 Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit c78fa29cd0d161641ee05db57bd39314b998c8c7 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 397f0906968fd8ba04b883469b96217737c43e09 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 52a7ea6c7599adeec2ac2787f500e215ce47cf79 Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit f706b2aaf9b288c582611191a1841b58feaeb741 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Add download configuration for dataset * Update GQA_RAW_IMAGE_DATASET path in utils.py * add datasets * Update gpt_eval_model_name in mathvista.yaml * Merge commit '0d620f98b49f8204d02633f209eedd5d8b7a1f7c' * Update pyproject.toml with dependencies and URLs * Squashed commit of the following: commit 8b600f55b6cf5627504c407871539db59f6085a3 Author: Zhang Peiyuan Date: Sat Jan 27 13:56:37 2024 +0800 Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Refactor image processing and submission file path * Refactor directory creation logic in cli_evaluate_single function * Update dataset path and test split in vqav2.yaml * Remove "total" column from cap_details_columns DataFrame * Add retry logic for dataset download * Add 'tenacity' to dependencies in pyproject.toml * Refactor code in ContextSampler class * Update Black version and configuration, and improve code readability in ContextSampler * Update Black version and line length --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: Fanyi Pu * vqav2 (#25) * Update tqdm progress bar position * Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' * Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 767f7e2cae60cf67ec5878234d84321395a3ed15 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * remove useless output file * Update dataset path in vqav2.yaml * Squashed commit of the following: commit eeb2b9827502f044ef67d8440f53124baf219ba3 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:56:45 2024 +0800 Black lint commit 1ce9f0b37e4bc5e6ff5fbfcd23fd339eb14974ae Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:47 2024 +0800 Solve doc_iterator_for_counting crashing issue commit e12b3bb41ed4f51540cfac84e5e96d15777540c4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:13 2024 +0800 Exclude train in refcoco/+/g config commit 42c56f82bc4ccae12e19e76d09d7e525ca9ef2f4 Merge: 6a1ae69 697a438 Author: Bo Li Date: Thu Jan 25 17:17:13 2024 +0000 Merge branch 'dev/bli_add_datasets' of https://github.com/EvolvingLMMs-Lab/lmms-eval into dev/bli_add_datasets commit aed08303fe87808986d206540a0c0ee6d8764988 Author: Bo Li Date: Thu Jan 25 17:17:06 2024 +0000 Fix file path and raise error if config file does not exist commit a105386613c443d9e740c89725cbd1281bbdfef6 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 00:47:24 2024 +0800 Fix tasks issue for nocaps, refcoco/+/g commit 21c8119e377760f44c769bed2528d863a8f4333b Author: Bo Li Date: Thu Jan 25 10:09:43 2024 +0000 Remove unused files and update task configuration commit 0ccb2629c2aacdb297b7cf0c9c2bcfa386bb7582 Author: Bo Li Date: Thu Jan 25 09:43:56 2024 +0000 Add submission file for coco, flickr30k, nocaps, and textcaps tasks commit 5365e13e93c702a1e0e259ee6a08d6a427d72470 Author: Bo Li Date: Thu Jan 25 09:32:54 2024 +0000 Refactor get_task_dict function to handle nested groups commit 6773348c807bcfa1b09ceffc90c75e15cad908f7 Author: Bo Li Date: Thu Jan 25 09:13:46 2024 +0000 Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability commit 31140f9c87dea89ca94c94bc850e3a8d43e5f8b4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 17:07:20 2024 +0800 Fix cli itself can not run with config file commit df1bad47f6ed13f94848d2bee29b28e00c2384b2 Author: Bo Li Date: Thu Jan 25 09:09:04 2024 +0000 Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 06383aa4a5ff59db52fc8d584f3086efd88b7e74 Author: Bo Li Date: Thu Jan 25 09:02:57 2024 +0000 Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit 7a71fd6022ee5985100dda38b94956595cec77a5 Merge: 22c3adf 1d3fdd4 Author: Bo Li Date: Thu Jan 25 08:43:15 2024 +0000 Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' into dev/bli_add_datasets commit 6870cba13cb54976480c1d5e8d97602c246f881b Author: Bo Li Date: Thu Jan 25 08:38:52 2024 +0000 Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit b40d522b6bf483ebdfbf5facd4573de0cf8a93f6 Author: Bo Li Date: Thu Jan 25 08:38:11 2024 +0000 Add coco_val and coco_test tasks to coco.yaml commit 5bf643f73d06f1e540897b753450352bb92fd9ec Author: Bo Li Date: Thu Jan 25 04:58:28 2024 +0000 Update dataset_path in flickr30k.yaml commit 95f110f0eef5196205bc501367e3642c57cc7a17 Author: Bo Li Date: Thu Jan 25 02:12:25 2024 +0000 Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' commit c844ae49b18c1334711832208b0359c9439fe1c0 Author: Bo Li Date: Thu Jan 25 02:10:18 2024 +0000 Add submission folder and update file paths for storing prediction results commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit f0446227f0dd93651e9d6c06254bbf5212ede2dd Merge: c6370bf 51f2eaa Author: Li Bo Date: Wed Jan 24 22:10:07 2024 +0800 Merge branch 'main' into dev/bli_add_datasets commit 1e1f6cfccba758dc606fa4217102518fab73c936 Author: Bo Li Date: Wed Jan 24 14:08:06 2024 +0000 Update dataset paths and improve user prompts commit 966933754b9e5179995b3ab41d746603e13e75c6 Author: Bo Li Date: Wed Jan 24 11:52:33 2024 +0000 Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' commit 767f7e2cae60cf67ec5878234d84321395a3ed15 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Fix bug in login functionality * create vqav2_val * Update vqav2_test.yaml * Update vqav2_test.yaml * Update vqav2_val.yaml --------- Co-authored-by: Li Bo * vqav2 (#25) * Update tqdm progress bar position * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 95ef3ea519cbd772924f9a6afa5394979eb00432 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * remove useless output file * Update dataset path in vqav2.yaml * Squashed commit of the following: commit 75bb7043ea5a533ab6351fc0f5ab055e86106423 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:56:45 2024 +0800 Black lint commit 6635a8aa34cfbd3c7a4afb6fcd214a7283ce01cb Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:47 2024 +0800 Solve doc_iterator_for_counting crashing issue commit 080f42b88ea8acacd527b8d67b84ba1d7d135b03 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:13 2024 +0800 Exclude train in refcoco/+/g config commit 4da84069c08c95e49e8ab0e64a1e103ff7ac8730 Merge: 6a1ae69 697a438 Author: Bo Li Date: Thu Jan 25 17:17:13 2024 +0000 Merge branch 'dev/bli_add_datasets' of https://github.com/EvolvingLMMs-Lab/lmms-eval into dev/bli_add_datasets commit 6a1ae69923d79ae32a001edac38206b605274ec3 Author: Bo Li Date: Thu Jan 25 17:17:06 2024 +0000 Fix file path and raise error if config file does not exist commit 697a4387827ceeec3e393237dd1baa217c714c88 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 00:47:24 2024 +0800 Fix tasks issue for nocaps, refcoco/+/g commit 47e40437126d39a5f062c9a33b4de426c1a29804 Author: Bo Li Date: Thu Jan 25 10:09:43 2024 +0000 Remove unused files and update task configuration commit 9976eb8e9ed03c8613725fdbd822ef5d8cf70e47 Author: Bo Li Date: Thu Jan 25 09:43:56 2024 +0000 Add submission file for coco, flickr30k, nocaps, and textcaps tasks commit 95f97a69faa6129676e89eee14960fcfe2076b7c Author: Bo Li Date: Thu Jan 25 09:32:54 2024 +0000 Refactor get_task_dict function to handle nested groups commit 3b79ee842b2488714baf92ab34528ef77989d392 Author: Bo Li Date: Thu Jan 25 09:13:46 2024 +0000 Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability commit f5c353f2ce93a2d96add4312b695b57432f68cbb Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 17:07:20 2024 +0800 Fix cli itself can not run with config file commit 9a68fec37be74cfe8d4a73390bc83edee147ae24 Author: Bo Li Date: Thu Jan 25 09:09:04 2024 +0000 Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 93f847c5851fd246716367935d6b807b17d53949 Author: Bo Li Date: Thu Jan 25 09:02:57 2024 +0000 Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit fa4ad4404e26d8924f55208746dbb9143b464011 Merge: 22c3adf 1d3fdd4 Author: Bo Li Date: Thu Jan 25 08:43:15 2024 +0000 Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' into dev/bli_add_datasets commit 22c3adfd0645acc23b6d7c06b487f4ffd47666c4 Author: Bo Li Date: Thu Jan 25 08:38:52 2024 +0000 Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit 4c712336b6f7438e717a865910bb241e413a4688 Author: Bo Li Date: Thu Jan 25 08:38:11 2024 +0000 Add coco_val and coco_test tasks to coco.yaml commit b5547126c855927fd4dc8384211e4aceee40870f Author: Bo Li Date: Thu Jan 25 04:58:28 2024 +0000 Update dataset_path in flickr30k.yaml commit f786f61e2559f082072f21aa9030e2080ddaf809 Author: Bo Li Date: Thu Jan 25 02:12:25 2024 +0000 Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' commit 796a011000e0df90f66f8e80cb34dc2318ae9ac8 Author: Bo Li Date: Thu Jan 25 02:10:18 2024 +0000 Add submission folder and update file paths for storing prediction results commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 118744c63eb2d9724571d85fbbd85fcc9ad05b59 Merge: c6370bf 51f2eaa Author: Li Bo Date: Wed Jan 24 22:10:07 2024 +0800 Merge branch 'main' into dev/bli_add_datasets commit c6370bff65903681f00cf3d07111d8e15a57b619 Author: Bo Li Date: Wed Jan 24 14:08:06 2024 +0000 Update dataset paths and improve user prompts commit 810daf458fa94cb3ec2b4a6cc5ecb1e656a24002 Author: Bo Li Date: Wed Jan 24 11:52:33 2024 +0000 Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' commit 95ef3ea519cbd772924f9a6afa5394979eb00432 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Fix bug in login functionality * create vqav2_val * Update vqav2_test.yaml * Update vqav2_test.yaml * Update vqav2_val.yaml --------- Co-authored-by: Li Bo * vizwiz dataset (#24) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit a2cc9303dc72e4d53983bb56e54a32e977c3e270 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit 35e87e7c7a480d005abf607c2527a35457d92311 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 89755323596b85208ed33aa88c296604a39af6eb Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0b0d30dfb247c5f0b7b68398b9e9fcde74cf7fa2 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit e273f9cbd91540df86bdbc652bff88a847bd0d2d Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit e84126aaaf8a07bd371a0571a914ccbcd3697f20 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 110deab53dc1a2fd349b1872cd261b69074c5fa8 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 0fa3e0c40075997ea80ed976bdee9615f17d3ece Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit 2aaca579120def99860f90054233f3358950fa66 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Update lmms_eval/evaluator.py and lmms_eval/tasks/vizwizvqa/utils.py * vizwiz-val * Update utils.py * Update vizwizvqa.yaml --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * vizwiz dataset (#24) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit 0df825c9e72a06e6acb4c0bd43c2083ffe8b74c0 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit b9d9f9896993033b92346e9f47420c55b866c715 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 4256bef410e4c8d8761e0cd0d79ac5e57b97651b Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0c8a3919885b8fe2880bb2892f7a619d060012d1 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit d2bc7c92ac61179b8c4031e11bc31970355252f6 Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit c78fa29cd0d161641ee05db57bd39314b998c8c7 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 397f0906968fd8ba04b883469b96217737c43e09 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 52a7ea6c7599adeec2ac2787f500e215ce47cf79 Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit f706b2aaf9b288c582611191a1841b58feaeb741 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Update lmms_eval/evaluator.py and lmms_eval/tasks/vizwizvqa/utils.py * vizwiz-val * Update utils.py * Update vizwizvqa.yaml --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Datasets] check vizwiz, vqav2 validation set and refcoco's naming conventions. (#26) * Update submission file naming and directory structure * Update task names in refcoco+ and refcocog * Merge commit '0265096d5dfda7ece8f1b95f4e4632417cfe775e' * [Datasets] check vizwiz, vqav2 validation set and refcoco's naming conventions. (#26) * Update submission file naming and directory structure * Update task names in refcoco+ and refcocog * Merge commit 'eac8adc657e2925cdca383e9c8e098e62ced4093' * Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Add/mmmu test (#30) * mmmu_test * black * Add/mmmu test (#30) * mmmu_test * black * [Fix] InfoVQA, WandB logging, CLI problems. (#31) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Refactor CLI evaluate function and improve error logging --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Fix] InfoVQA, WandB logging, CLI problems. (#31) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Refactor CLI evaluate function and improve error logging --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit 4b604e75cfde49df52e4abd90be4876ed9a1b08f Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit 799a6bcb9033656115755c5169f8c342eb927d54 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit d0c8c61d9a23686d31c7e014f0c15d802e04ee61 Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit f4fd4fd29b45436a96fe65395f0922612f598052 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * adapt qwen to sqa, gqa, ai2d, docvqa (#36) * adapt qwen to sqa, gqa, ai2d, docvqa * black * adapt qwen to sqa, gqa, ai2d, docvqa (#36) * adapt qwen to sqa, gqa, ai2d, docvqa * black * [Fix, Feat] Solve llava wild issue when task num can't divide, add fuyu ppl (#37) * Add fuyu ppl, fix llava-bench gather issue * Add gpt4V * Black lint * [Fix, Feat] Solve llava wild issue when task num can't divide, add fuyu ppl (#37) * Add fuyu ppl, fix llava-bench gather issue * Add gpt4V * Black lint * [Logging] Wandb Logging Support (#38) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit 4b604e75cfde49df52e4abd90be4876ed9a1b08f Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit 799a6bcb9033656115755c5169f8c342eb927d54 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * Refactor directory structure for RefCOCO+ and RefCOCOg datasets * Fix error logging in get_eval and parse_score functions * Update .gitignore and mme.yaml * Squashed commit of the following: commit 3d44977c9254d1ee5254b2ca24c8cc54984e84b0 Author: jzhang38 Date: Fri Feb 2 13:43:28 2024 +0800 black commit a38ffeb692fbeb9deebe20f65b0f3e041823e695 Author: jzhang38 Date: Fri Feb 2 13:42:03 2024 +0800 adapt qwen to sqa, gqa, ai2d, docvqa commit e24607fd5725aabb7f6db5fa457b5e6a5123c199 Author: Li Bo Date: Thu Feb 1 16:20:27 2024 +0800 [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit 4b604e75cfde49df52e4abd90be4876ed9a1b08f Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit 799a6bcb9033656115755c5169f8c342eb927d54 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- … * [Logging] Wandb Logging Support (#38) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit d0c8c61d9a23686d31c7e014f0c15d802e04ee61 Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit f4fd4fd29b45436a96fe65395f0922612f598052 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * Refactor directory structure for RefCOCO+ and RefCOCOg datasets * Fix error logging in get_eval and parse_score functions * Update .gitignore and mme.yaml * Squashed commit of the following: commit 380494bb2417fae1bcc1535ad8b67df7af667619 Author: jzhang38 Date: Fri Feb 2 13:43:28 2024 +0800 black commit e46b937aeeed45f5dd574b852459bfb416d165fd Author: jzhang38 Date: Fri Feb 2 13:42:03 2024 +0800 adapt qwen to sqa, gqa, ai2d, docvqa commit 2da8f918c37495b3447b9c24e74234ad0bba8cbf Author: Li Bo Date: Thu Feb 1 16:20:27 2024 +0800 [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit d0c8c61d9a23686d31c7e014f0c15d802e04ee61 Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit f4fd4fd29b45436a96fe65395f0922612f598052 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- … * [Fix] fix bugs (#41) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit 4b604e75cfde49df52e4abd90be4876ed9a1b08f Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit 799a6bcb9033656115755c5169f8c342eb927d54 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * Refactor directory structure for RefCOCO+ and RefCOCOg datasets * Fix error logging in get_eval and parse_score functions * Update .gitignore and mme.yaml * Squashed commit of the following: commit 3d44977c9254d1ee5254b2ca24c8cc54984e84b0 Author: jzhang38 Date: Fri Feb 2 13:43:28 2024 +0800 black commit a38ffeb692fbeb9deebe20f65b0f3e041823e695 Author: jzhang38 Date: Fri Feb 2 13:42:03 2024 +0800 adapt qwen to sqa, gqa, ai2d, docvqa commit e24607fd5725aabb7f6db5fa457b5e6a5123c199 Author: Li Bo Date: Thu Feb 1 16:20:27 2024 +0800 [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit 4b604e75cfde49df52e4abd90be4876ed9a1b08f Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit 799a6bcb9033656115755c5169f8c342eb927d54 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit '0f183a394426d3bf88884b4e2258ab53406bc705' * Squashed commit of the following: commit b81ed2ce4d0e226df7a41bddd82fe1f9d46a27fc Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit 0f183a394426d3bf88884b4e2258ab53406bc705 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 1e2ae936c90a15d684926e43a38aac86935f38c5 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 10bbaf01c0a4164b6f1d2628367befccf8f39c24 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit '0a403e6f5e17c70a50983c83a132edf0fdcd98de' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit fdb0c6785b0c5d6979d10e7ddf75ce9055038db8 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit eae210c3700a59b7d5cc9de46fcb855f443096aa Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 18e4a19e82357352ab25df77b5ae4f1b011d61ae Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit e899be48f55f95172fdf96bd2a98d3b91ff2aaed Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit a999fc6889c6986c28ec5d95460a4ab5233e5d4f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit 0a403e6f5e17c70a50983c83a132edf0fdcd98de Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co… * [Fix] fix bugs (#41) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit d0c8c61d9a23686d31c7e014f0c15d802e04ee61 Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit f4fd4fd29b45436a96fe65395f0922612f598052 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update API configuration and file paths * Refactor evaluate_by_chatgpt function in utils.py * Add hallusion_output_vd_model.json to .gitignore * Add timeout to API request * Refactor file path generation and remove unnecessary suffix in log samples output names * Refactor code and add output path handling * Update lmms-eval API and add new models and datasets * Refactor directory structure for RefCOCO+ and RefCOCOg datasets * Fix error logging in get_eval and parse_score functions * Update .gitignore and mme.yaml * Squashed commit of the following: commit 380494bb2417fae1bcc1535ad8b67df7af667619 Author: jzhang38 Date: Fri Feb 2 13:43:28 2024 +0800 black commit e46b937aeeed45f5dd574b852459bfb416d165fd Author: jzhang38 Date: Fri Feb 2 13:42:03 2024 +0800 adapt qwen to sqa, gqa, ai2d, docvqa commit 2da8f918c37495b3447b9c24e74234ad0bba8cbf Author: Li Bo Date: Thu Feb 1 16:20:27 2024 +0800 [Dataset] fix hallusion benchmark, add saving logic inside aggregate function (#35) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove scienceqa_img task configuration * eval scienceqa with no images --------- Co-authored-by: Bo Li Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Update hb_doc_to_text function to remove unnecessary line break * Add Fuyu model and update OtterHD model * Refactor model response handling and fix image processing bug * Refactor flatten method to support only getting the first element * Add support for specifying timezone in datetime string Update flatten method in OtterHD class Update get_datetime_str function in utils.py * Fix condition for checking wandb_args_dict in __main__.py * Commented out assertions for batch size in Fuyu model * Add warning message for existing output file * Fix batch size issue in OtterHD model * Squashed commit of the following: commit d0c8c61d9a23686d31c7e014f0c15d802e04ee61 Author: Li Bo Date: Wed Jan 31 16:00:22 2024 +0800 [Datasets] add hallubench (#34) * Add hallu bench * Fix hall_b gpt eval bugs --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> commit f4fd4fd29b45436a96fe65395f0922612f598052 Author: Li Bo Date: Wed Jan 31 14:23:15 2024 +0800 [Datasets & Models] Fuyu, HalluBench (w/Kaichen, commit 96d95b3) (#33) * add fuyu * Merge commit 'c7ffa8dee96e228c6519154d5a00742b35caa3f2' * Squashed commit of the following: commit 96d95b3cb3540cd17bcab31f1a85ad0d04a12f1e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 30 19:39:57 2024 +0800 Add hallu bench commit c7ffa8dee96e228c6519154d5a00742b35caa3f2 Author: Pu Fanyi Date: Tue Jan 30 14:52:51 2024 +0800 scienceqa for full set (#32) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration * Update generation kwargs for LMMS tasks * Update lmms_eval MME task configuration and utils * Update generation_kwargs in lmms_eval tasks * Update doc_to_text function in coco and okvqa tasks * Add COCO 2017 version * Update task name in coco_test2017.yaml * Squashed commit of the following: commit 0390783595c41232352599ab78fbe5949615e982 Author: Zhang Peiyuan Date: Mon Jan 29 22:41:33 2024 +0800 Add/mmmu test (#30) * mmmu_test * black commit 407bc2500c162d8949fbaae3d11d522afd2c9f28 Author: Li Bo Date: Sun Jan 28 22:19:13 2024 +0800 [Dataset Check] dataset check and add wandb logging (#29) * Remove unused code and configuration file * Remove docvqa.yaml and update vizwizvqa.yaml * lint * Add dataset_kwargs to vizwizvqa.yaml * Add dataset_kwargs to vizwizvqa.yaml * textvqa (#27) * Update textvqa.yaml and utils.py * Fix YAML formatting in textvqa.yaml and remove unused files * remove useless matric * add textvqa val & test * Update progress bar description in evaluator.py * Update submission file names in VizWizVQA tasks * Update output path to include log samples suffix * Update submission file paths in OKVQA and VizWizVQA tasks * Refactor llava-in-the-wild.yaml and utils.py * Update metric for llava evaluation * Refactor logging message in Task class * Merge commit 'f80465fd0f30781c8c36b46c1d6d7bba751f9e33' * Fix formatting issues and add progress bar closing statements * Update task from "infovqa_val" to "infovqa_test" in infovqa_test.yaml * Update tqdm progress bar in OtterHD model * Squashed commit of the following: commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * Fix error handling in loading YAML config files * Squashed commit of the following: commit 2df0ce76ef836be1cb8ffbf3c854fe05563647b0 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 12:41:40 2024 +0800 Fix key bugs commit af6c7a2b8c2959495dc351e6f6eb2a442efe4e94 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:46:19 2024 +0800 Black lint commit 26da729c40008f72ce3f10c932874f120f290e26 Merge: ab898e4 fb209e4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:45:31 2024 +0800 Merge branch 'main' into kc/list_tasks_num commit acbb1a1997c5159709e3b81c3f0292b2f9def109 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:44:23 2024 +0800 Enable list all tasks num commit b33ac32f0ff28777204eaaf27a963200024081df Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Jan 28 09:41:32 2024 +0800 Exclude train yaml file in the task list commit f80465fd0f30781c8c36b46c1d6d7bba751f9e33 Author: Zhang Peiyuan Date: Sun Jan 28 02:04:57 2024 +0800 Add InfoVQA, DocVQA, and QwenVL (#28) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * add qwenvl * add infovqa and docvqa * List task #num sorted * Update prompt messages for image-related tasks * Delete unused task configuration files * Remove coco_train.yaml configuration file * Update task name in mmmu.yaml * Fix error message for missing tasks * Add wandb import and integration --------- Co… * Add multiple choice output type support (#40) * Add multiple choice output type support (#40) * Fix wandb_args["name"] assignment in WandbLogger.init_run() method * Fix wandb_args["name"] assignment in WandbLogger.init_run() method * Joshua/vizwizvqa refactor (#42) * refactor vizwizvqa task * Merge commit '0cf06439d3c85aee8783034b226f1badd3a08608' * Fix exact_match accuracy calculation in vizwiz_vqa_process_results * Update vizwiz_vqa tasks --------- Co-authored-by: Fanyi Pu * Joshua/vizwizvqa refactor (#42) * refactor vizwizvqa task * Merge commit '41d044cd287adcbcf095afb1a0ef5a96c88c3d9d' * Fix exact_match accuracy calculation in vizwiz_vqa_process_results * Update vizwiz_vqa tasks --------- Co-authored-by: Fanyi Pu * [Feat] Add qwen loglikelihood (#43) * Add qwen loglikelihood * Revise the pyproject dependency. Move tiktoken out from optional-dependencies * Add ferret-bench * Add seedbench 2, test on llava * [Feat] Add qwen loglikelihood (#43) * Add qwen loglikelihood * Revise the pyproject dependency. Move tiktoken out from optional-dependencies * Add ferret-bench * Add seedbench 2, test on llava * add cmmmu (#44) Co-authored-by: ygjin11 <1633504509@qq.com> * add cmmmu (#44) Co-authored-by: ygjin11 <1633504509@qq.com> * add stvqa and multidocvqa (#46) * add stvqa and multidocvqa (#46) * Fix seedbench choices bugs (#45) * Fix seedbench choices bugs (#45) * [Model] Add models (#47) * Refactor logging and model initialization * Fix wandb_logger.online() method call * Add error handling during evaluation * Add wait time and error handling in get_chat_response function * Update wait_time in get_chat_response function * Refactor code for improved readability and maintainability * Refactor doc_to_visual function to handle multiple images in ICON-QA tasks * Refactor logging_utils.py and utils.py This commit refactors the `logging_utils.py` and `utils.py` files. It removes unused imports, adjusts code formatting, and updates the `get_chat_response` function to increase the `wait_time` parameter from 5 to 10. * Refactor code for wandb logging and generation in OtterHD class * Refactor prepare_report_by_task method in logging_utils.py * Update generation parameters in OtterHD model * Update generation parameters in OtterHD model * Squashed commit of the following: commit 5a44010c0e4dc836a244775750b4da57c55d4d3a Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Feb 13 18:50:37 2024 +0800 Fix seedbench choices bugs (#45) commit cf10a451a301e7655d8e23ad94d349db3cdd02a2 Author: XinrunDu <154438029+XinrunDu@users.noreply.github.com> Date: Tue Feb 13 18:50:23 2024 +0800 add stvqa and multidocvqa (#46) commit caaad1dd8d698a4a613cd7615a824a4ec0a53e1a Author: XinrunDu <154438029+XinrunDu@users.noreply.github.com> Date: Sun Feb 11 00:54:39 2024 +0800 add cmmmu (#44) Co-authored-by: ygjin11 <1633504509@qq.com> commit cfa11b689034ac694d05752c565fd23791e53507 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Feb 11 00:54:23 2024 +0800 [Feat] Add qwen loglikelihood (#43) * Add qwen loglikelihood * Revise the pyproject dependency. Move tiktoken out from optional-dependencies * Add ferret-bench * Add seedbench 2, test on llava commit 4d42aa88d6c9054c2b037732d506826215fc59c2 Author: JvThunder <44111143+JvThunder@users.noreply.github.com> Date: Wed Feb 7 00:08:22 2024 +0800 Joshua/vizwizvqa refactor (#42) * refactor vizwizvqa task * Merge commit '0cf06439d3c85aee8783034b226f1badd3a08608' * Fix exact_match accuracy calculation in vizwiz_vqa_process_results * Update vizwiz_vqa tasks --------- Co-authored-by: Fanyi Pu * [Model] Add models (#47) * Refactor logging and model initialization * Fix wandb_logger.online() method call * Add error handling during evaluation * Add wait time and error handling in get_chat_response function * Update wait_time in get_chat_response function * Refactor code for improved readability and maintainability * Refactor doc_to_visual function to handle multiple images in ICON-QA tasks * Refactor logging_utils.py and utils.py This commit refactors the `logging_utils.py` and `utils.py` files. It removes unused imports, adjusts code formatting, and updates the `get_chat_response` function to increase the `wait_time` parameter from 5 to 10. * Refactor code for wandb logging and generation in OtterHD class * Refactor prepare_report_by_task method in logging_utils.py * Update generation parameters in OtterHD model * Update generation parameters in OtterHD model * Squashed commit of the following: commit 4011e6cc087714a1a0ca848ec604d307c0761751 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Feb 13 18:50:37 2024 +0800 Fix seedbench choices bugs (#45) commit 16a6c1fef0d023b37e438710393c5162f3891c2c Author: XinrunDu <154438029+XinrunDu@users.noreply.github.com> Date: Tue Feb 13 18:50:23 2024 +0800 add stvqa and multidocvqa (#46) commit 515a7c46754dc55e963d174bdee91907773c5866 Author: XinrunDu <154438029+XinrunDu@users.noreply.github.com> Date: Sun Feb 11 00:54:39 2024 +0800 add cmmmu (#44) Co-authored-by: ygjin11 <1633504509@qq.com> commit b3a013c02934dcf328df18cb792d5907f298de54 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Feb 11 00:54:23 2024 +0800 [Feat] Add qwen loglikelihood (#43) * Add qwen loglikelihood * Revise the pyproject dependency. Move tiktoken out from optional-dependencies * Add ferret-bench * Add seedbench 2, test on llava commit 1b4a4776e16bf480cf94ddead55ede5004949541 Author: JvThunder <44111143+JvThunder@users.noreply.github.com> Date: Wed Feb 7 00:08:22 2024 +0800 Joshua/vizwizvqa refactor (#42) * refactor vizwizvqa task * Merge commit '41d044cd287adcbcf095afb1a0ef5a96c88c3d9d' * Fix exact_match accuracy calculation in vizwiz_vqa_process_results * Update vizwiz_vqa tasks --------- Co-authored-by: Fanyi Pu * [Fix] rearrange location of init eval_logger * [Fix] rearrange location of init eval_logger * [Support] Add prepare script deepspeed for llava (#51) * Add prepare script deepspeed for llava * Comment on using ds to prepare your model * [Support] Add prepare script deepspeed for llava (#51) * Add prepare script deepspeed for llava * Comment on using ds to prepare your model * [Feat] GPT4V added interleaved image and text support (#52) * Revise GPT4V to allow interleaved image and text * Use the first char as the answer for seedbench * Save gpt eval's answer * [Feat] GPT4V added interleaved image and text support (#52) * Revise GPT4V to allow interleaved image and text * Use the first char as the answer for seedbench * Save gpt eval's answer * Update README.md * Update README.md * Update README.md * Update README.md * [Loggings] update logging logic (#54) * [Fix] rearrange location of init eval_logger * Ignore DeprecationWarnings in lmms_eval/__main__.py and lmms_eval/models/fuyu.py * Update lmms_eval/__main__.py and lmms_eval/utils.py * update * Update llava.py with LLaVA model imports and error handling * Add and test new datasets * update * Update wandb version and require report-editing:v0 * Add support for logging samples to Weights and Biases This commit adds a new command-line argument `--wandb_log_samples` to enable logging all model outputs and documents for per-sample measurement and post-hoc analysis to Weights and Biases. The `cli_evaluate` function has been modified to handle this new argument and log the samples if the argument is set to True. The `wandb_logger` object has also been updated to include a new method `log_eval_samples` for logging the samples. This enhancement improves the functionality of the LMMS evaluation tool. * update * [Loggings] update logging logic (#54) * [Fix] rearrange location of init eval_logger * Ignore DeprecationWarnings in lmms_eval/__main__.py and lmms_eval/models/fuyu.py * Update lmms_eval/__main__.py and lmms_eval/utils.py * update * Update llava.py with LLaVA model imports and error handling * Add and test new datasets * update * Update wandb version and require report-editing:v0 * Add support for logging samples to Weights and Biases This commit adds a new command-line argument `--wandb_log_samples` to enable logging all model outputs and documents for per-sample measurement and post-hoc analysis to Weights and Biases. The `cli_evaluate` function has been modified to handle this new argument and log the samples if the argument is set to True. The `wandb_logger` object has also been updated to include a new method `log_eval_samples` for logging the samples. This enhancement improves the functionality of the LMMS evaluation tool. * update * Dataset Refractor (#50) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names --------- Co-authored-by: JvThunder Co-authored-by: kcz358 * Dataset Refractor (#50) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names --------- Co-authored-by: JvThunder Co-authored-by: kcz358 * [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 * Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 * Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 * Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 * [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [Repr] Provide reproduce environment and descriptions for llava-1.5 (#62) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Add timeout to API requests * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix error logging in get_chat_response function * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Squashed commit of the following: commit faf9cf65cf5b1e036ee3a74428e8bb1490e8b2eb Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit e3729eb925b718a44b6eb225ef9b41c7fd2408e0 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit 50b697a7ae93b0547484e1cd753722c1d2513349 Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 17425b5dce41cf67b96c5875139b57d6c7a423df Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 1bc17d54e79e79d11419ba89e7d8e55bc8cfa21b Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit a20bbc30ab576d3e2a587c70af1b7c06575bcd8b Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit e2b657694b888ef59b9f896415e7c4c82497e7bf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 6447d521842b9f83f5119cdcd7714c8f6053ca73 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit 8ac333a2e9ebbe6318d536b6589f767f71fbc092 Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 9e542ce049f68f49a237be165e3ad9cde7408ac0 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit f90ccf7b94b130e118b4eca321f68b81e7ab5850 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit f651a77707a4c723ebffb07f2a87743bf42ecea7 Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit a683559c704806b7abde5e4c8355f556f3e65866 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit 8e246e2466f3dd14a5e34f720269d7991a6dcf6b Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit 67f00dc4652d09c662e5202ff7e5fbf7bebcdaf6 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 53b7a845fe8412a652905101ec036c84e77a20c2 Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit 920b4112c4508e9a8afe824678958f2e78189e4e Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Fix small bugs in list_with_num * Revise list_with_num model args * Dev/readme rm rolling (#60) * remove log_likelyhood_rolling * Update time efficiency benchmark in README.md * add task guide --------- Co-authored-by: jzhang38 Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove unnecessary code and update dependencies * Fix logging utils bug on wandb grouping * Add reproduce envs * Squashed commit of the following: commit 74fff73053b88a90d0f4229a9c748256080fea08 Merge: 2475639 f89a736 Author: kcz358 Date: Sun Mar 3 22:12:12 2024 +0800 Merge branch 'main' into kc/final_fix commit 0c640a636e3882859a17e30a5c3504850a3d02d6 Author: kcz358 Date: Sun Mar 3 22:11:04 2024 +0800 Add reproduce envs commit 7f2b2c38277fcb033c48414d827e96a64e1cac8d Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 21:19:15 2024 +0800 [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit bebff9fad2a60bc0ac52ddc430e5d9e4e0ef6c24 Merge: 83358a4 5e1c9c7 Author: kcz358 Date: Sun Mar 3 07:25:48 2024 +0000 Merge branch 'main' into kc/final_fix commit 5042bb0c2ed4f830dda6bcd14231b1f8763aa95f Author: kcz358 Date: Sun Mar 3 07:23:19 2024 +0000 Fix logging utils bug on wandb grouping commit c82042b46e4c922efd5cb3fa441220333d521f6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 13:01:11 2024 +0800 [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit d78a3d7a53f5285a7eac39ce8f04e9854fdb3e73 Author: kcz358 Date: Sat Mar 2 05:58:08 2024 +0000 Revise list_with_num model args commit 8eefaec8489d48613de9395eb8e8150224985e01 Author: kcz358 Date: Sat Mar 2 05:09:15 2024 +0000 Fix small bugs in list_with_num commit faf9cf65cf5b1e036ee3a74428e8bb1490e8b2eb Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit e3729eb925b718a44b6eb225ef9b41c7fd2408e0 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit 50b697a7ae93b0547484e1cd753722c1d2513349 Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 17425b5dce41cf67b96c5875139b57d6c7a423df Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 1bc17d54e79e79d11419ba89e7d8e55bc8cfa21b Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit a20bbc30ab576d3e2a587c70af1b7c06575bcd8b Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit e2b657694b888ef59b9f896415e7c4c82497e7bf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 6447d521842b9f83f5119cdcd7714c8f6053ca73 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit 8ac333a2e9ebbe6318d536b6589f767f71fbc092 Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 9e542ce049f68f49a237be165e3ad9cde7408ac0 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit f90ccf7b94b130e118b4eca321f68b81e7ab5850 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit f651a77707a4c723ebffb07f2a87743bf42ecea7 Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit a683559c704806b7abde5e4c8355f556f3e65866 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit 8e246e2466f3dd14a5e34f720269d7991a6dcf6b Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit 67f00dc4652d09c662e5202ff7e5fbf7bebcdaf6 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 53b7a845fe8412a652905101ec036c84e77a20c2 Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit 920b4112c4508e9a8afe824678958f2e78189e4e Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update commands.md * Add repr_scripts for reference * Add timeout for gpt4V * Remove unnecessary dependencies * Add reproduce into readme * Revise seedbench process_result * Fix exclude dc hardcode postprocess logic error * Fix metric repeat issue * Update dataset runtime and add environment info * Revise val submission file saving path * Put the correct query into the gpt extraction * Update sleep time in utils.py * update --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [Repr] Provide reproduce environment and descriptions for llava-1.5 (#62) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Add timeout to API requests * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix error logging in get_chat_response function * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Squashed commit of the following: commit 2fbeafc882c80242a10381abc67629d5d8b7071a Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit f188052450bed2f3a30ab6f9a6f7eb844a64cb33 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit baef5905505892593fe783beb18a2de20991d6af Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 11b46f3b701b79b361dd5175a263e4d89bd07fb5 Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 0982de2e7a2310429e51ec7828886fd49953f716 Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit f840ed80f4ae467fff62b61844854a3a9e8ec8a5 Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit 80db78f600d07011188983637c94da84b9475fbf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 676229de870b8d465cef08867cd272a4b696e630 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit d293b96fb3537fea85f10f216d762abf35e05e8d Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 01bbd010590d6b7f105525580209191a1d6d5232 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit 66595ebc073ff9431f2400006196c0645be58ea4 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit 08c2ebad1532fd6c34ac04efb94a268db9862d4f Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit aefbd3c6856584135e2dcbe13381db0e0780f063 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit b9aebc3ff3b122d6d4a81bd2f28e86b2c390c505 Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit c9daa91f2576de69af73c80e263afb085ecd8288 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit b1c4c88b9b36e02e9ed738ff9217d98a5ef2117b Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit b35bc4a6c8fd6b4b2a68bb3054878807b8b92281 Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Fix small bugs in list_with_num * Revise list_with_num model args * Dev/readme rm rolling (#60) * remove log_likelyhood_rolling * Update time efficiency benchmark in README.md * add task guide --------- Co-authored-by: jzhang38 Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove unnecessary code and update dependencies * Fix logging utils bug on wandb grouping * Add reproduce envs * Squashed commit of the following: commit 556b12620379d79c9ed5ddba0856063b498f917c Merge: 2475639 f89a736 Author: kcz358 Date: Sun Mar 3 22:12:12 2024 +0800 Merge branch 'main' into kc/final_fix commit 9509a782c9e9824273cefb1dc9671c92b887697d Author: kcz358 Date: Sun Mar 3 22:11:04 2024 +0800 Add reproduce envs commit 0bff98b798c71a361639385c985eccc54c46dfb6 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 21:19:15 2024 +0800 [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit 7c4501a32bbb415ba7e62e93194b37ba9a435cf5 Merge: 83358a4 5e1c9c7 Author: kcz358 Date: Sun Mar 3 07:25:48 2024 +0000 Merge branch 'main' into kc/final_fix commit 5c419f9fa23616a63a0bd584f18e509bb7704b50 Author: kcz358 Date: Sun Mar 3 07:23:19 2024 +0000 Fix logging utils bug on wandb grouping commit 0010d0ac308051e977981b83a51d0654488501d9 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 13:01:11 2024 +0800 [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit b2ca65d1f12d84ae7a37ecc81f760901389a1af0 Author: kcz358 Date: Sat Mar 2 05:58:08 2024 +0000 Revise list_with_num model args commit a262ea1720b2c02839d21dad2a7618bc80725f18 Author: kcz358 Date: Sat Mar 2 05:09:15 2024 +0000 Fix small bugs in list_with_num commit 2fbeafc882c80242a10381abc67629d5d8b7071a Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit f188052450bed2f3a30ab6f9a6f7eb844a64cb33 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit baef5905505892593fe783beb18a2de20991d6af Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 11b46f3b701b79b361dd5175a263e4d89bd07fb5 Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 0982de2e7a2310429e51ec7828886fd49953f716 Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit f840ed80f4ae467fff62b61844854a3a9e8ec8a5 Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit 80db78f600d07011188983637c94da84b9475fbf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 676229de870b8d465cef08867cd272a4b696e630 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit d293b96fb3537fea85f10f216d762abf35e05e8d Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 01bbd010590d6b7f105525580209191a1d6d5232 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit 66595ebc073ff9431f2400006196c0645be58ea4 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit 08c2ebad1532fd6c34ac04efb94a268db9862d4f Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit aefbd3c6856584135e2dcbe13381db0e0780f063 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit b9aebc3ff3b122d6d4a81bd2f28e86b2c390c505 Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit c9daa91f2576de69af73c80e263afb085ecd8288 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit b1c4c88b9b36e02e9ed738ff9217d98a5ef2117b Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit b35bc4a6c8fd6b4b2a68bb3054878807b8b92281 Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update commands.md * Add repr_scripts for reference * Add timeout for gpt4V * Remove unnecessary dependencies * Add reproduce into readme * Revise seedbench process_result * Fix exclude dc hardcode postprocess logic error * Fix metric repeat issue * Update dataset runtime and add environment info * Revise val submission file saving path * Put the correct query into the gpt extraction * Update sleep time in utils.py * update --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 * [README] near public (#63) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Add timeout to API requests * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix error logging in get_chat_response function * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Squashed commit of the following: commit faf9cf65cf5b1e036ee3a74428e8bb1490e8b2eb Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit e3729eb925b718a44b6eb225ef9b41c7fd2408e0 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit 50b697a7ae93b0547484e1cd753722c1d2513349 Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 17425b5dce41cf67b96c5875139b57d6c7a423df Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 1bc17d54e79e79d11419ba89e7d8e55bc8cfa21b Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit a20bbc30ab576d3e2a587c70af1b7c06575bcd8b Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit e2b657694b888ef59b9f896415e7c4c82497e7bf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 6447d521842b9f83f5119cdcd7714c8f6053ca73 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit 8ac333a2e9ebbe6318d536b6589f767f71fbc092 Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 9e542ce049f68f49a237be165e3ad9cde7408ac0 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit f90ccf7b94b130e118b4eca321f68b81e7ab5850 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit f651a77707a4c723ebffb07f2a87743bf42ecea7 Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit a683559c704806b7abde5e4c8355f556f3e65866 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit 8e246e2466f3dd14a5e34f720269d7991a6dcf6b Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit 67f00dc4652d09c662e5202ff7e5fbf7bebcdaf6 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 53b7a845fe8412a652905101ec036c84e77a20c2 Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit 920b4112c4508e9a8afe824678958f2e78189e4e Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Fix small bugs in list_with_num * Revise list_with_num model args * Dev/readme rm rolling (#60) * remove log_likelyhood_rolling * Update time efficiency benchmark in README.md * add task guide --------- Co-authored-by: jzhang38 Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove unnecessary code and update dependencies * Fix logging utils bug on wandb grouping * Add reproduce envs * Squashed commit of the following: commit 74fff73053b88a90d0f4229a9c748256080fea08 Merge: 2475639 f89a736 Author: kcz358 Date: Sun Mar 3 22:12:12 2024 +0800 Merge branch 'main' into kc/final_fix commit 0c640a636e3882859a17e30a5c3504850a3d02d6 Author: kcz358 Date: Sun Mar 3 22:11:04 2024 +0800 Add reproduce envs commit 7f2b2c38277fcb033c48414d827e96a64e1cac8d Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 21:19:15 2024 +0800 [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit bebff9fad2a60bc0ac52ddc430e5d9e4e0ef6c24 Merge: 83358a4 5e1c9c7 Author: kcz358 Date: Sun Mar 3 07:25:48 2024 +0000 Merge branch 'main' into kc/final_fix commit 5042bb0c2ed4f830dda6bcd14231b1f8763aa95f Author: kcz358 Date: Sun Mar 3 07:23:19 2024 +0000 Fix logging utils bug on wandb grouping commit c82042b46e4c922efd5cb3fa441220333d521f6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 13:01:11 2024 +0800 [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit d78a3d7a53f5285a7eac39ce8f04e9854fdb3e73 Author: kcz358 Date: Sat Mar 2 05:58:08 2024 +0000 Revise list_with_num model args commit 8eefaec8489d48613de9395eb8e8150224985e01 Author: kcz358 Date: Sat Mar 2 05:09:15 2024 +0000 Fix small bugs in list_with_num commit faf9cf65cf5b1e036ee3a74428e8bb1490e8b2eb Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit e3729eb925b718a44b6eb225ef9b41c7fd2408e0 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit 50b697a7ae93b0547484e1cd753722c1d2513349 Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 17425b5dce41cf67b96c5875139b57d6c7a423df Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 1bc17d54e79e79d11419ba89e7d8e55bc8cfa21b Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit a20bbc30ab576d3e2a587c70af1b7c06575bcd8b Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit e2b657694b888ef59b9f896415e7c4c82497e7bf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 6447d521842b9f83f5119cdcd7714c8f6053ca73 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit 8ac333a2e9ebbe6318d536b6589f767f71fbc092 Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 9e542ce049f68f49a237be165e3ad9cde7408ac0 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit f90ccf7b94b130e118b4eca321f68b81e7ab5850 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit f651a77707a4c723ebffb07f2a87743bf42ecea7 Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit a683559c704806b7abde5e4c8355f556f3e65866 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit 8e246e2466f3dd14a5e34f720269d7991a6dcf6b Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit 67f00dc4652d09c662e5202ff7e5fbf7bebcdaf6 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 53b7a845fe8412a652905101ec036c84e77a20c2 Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit 920b4112c4508e9a8afe824678958f2e78189e4e Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 6b20902d94ef9120181cd26cdce1e139046dbdf4 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 21050baf08c4bc87c77d98dea55b6eecfefe1c0a Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit 'c5e52a785d3cc87a866be9b880deb477d9f73fb7' * Refactor ok_vqa_aggreate_submissions function * Merge commit 'e5aa0a9601d6d8ce727315e4b0a8f13f06f26bff' * Refactor VQA submission file saving * Update file utils * Merge commit '560deca9f72483ca091795d6dc2537d4c54b32b0' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit ba0e7f51e255540791d030468f79a126fec40eb5 Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update commands.md * Add repr_scripts for reference * Add timeout for gpt4V * Remove unnecessary dependencies * Add reproduce into readme * Revise seedbench process_result * Fix exclude dc hardcode postprocess logic error * Fix metric repeat issue * Update dataset runtime and add environment info * Revise val submission file saving path * Put the correct query into the gpt extraction * Update sleep time in utils.py * update --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: jzhang38 Co-authored-by: kcz358 * [README] near public (#63) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Add timeout to API requests * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix error logging in get_chat_response function * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Squashed commit of the following: commit 2fbeafc882c80242a10381abc67629d5d8b7071a Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit f188052450bed2f3a30ab6f9a6f7eb844a64cb33 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit baef5905505892593fe783beb18a2de20991d6af Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 11b46f3b701b79b361dd5175a263e4d89bd07fb5 Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 0982de2e7a2310429e51ec7828886fd49953f716 Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit f840ed80f4ae467fff62b61844854a3a9e8ec8a5 Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit 80db78f600d07011188983637c94da84b9475fbf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 676229de870b8d465cef08867cd272a4b696e630 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit d293b96fb3537fea85f10f216d762abf35e05e8d Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 01bbd010590d6b7f105525580209191a1d6d5232 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit 66595ebc073ff9431f2400006196c0645be58ea4 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit 08c2ebad1532fd6c34ac04efb94a268db9862d4f Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit aefbd3c6856584135e2dcbe13381db0e0780f063 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit b9aebc3ff3b122d6d4a81bd2f28e86b2c390c505 Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit c9daa91f2576de69af73c80e263afb085ecd8288 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit b1c4c88b9b36e02e9ed738ff9217d98a5ef2117b Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit b35bc4a6c8fd6b4b2a68bb3054878807b8b92281 Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Fix small bugs in list_with_num * Revise list_with_num model args * Dev/readme rm rolling (#60) * remove log_likelyhood_rolling * Update time efficiency benchmark in README.md * add task guide --------- Co-authored-by: jzhang38 Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Remove unnecessary code and update dependencies * Fix logging utils bug on wandb grouping * Add reproduce envs * Squashed commit of the following: commit 556b12620379d79c9ed5ddba0856063b498f917c Merge: 2475639 f89a736 Author: kcz358 Date: Sun Mar 3 22:12:12 2024 +0800 Merge branch 'main' into kc/final_fix commit 9509a782c9e9824273cefb1dc9671c92b887697d Author: kcz358 Date: Sun Mar 3 22:11:04 2024 +0800 Add reproduce envs commit 0bff98b798c71a361639385c985eccc54c46dfb6 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 21:19:15 2024 +0800 [Fix] wandb group logging missing columns (#61) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args * Fix logging utils bug on wandb grouping --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit 7c4501a32bbb415ba7e62e93194b37ba9a435cf5 Merge: 83358a4 5e1c9c7 Author: kcz358 Date: Sun Mar 3 07:25:48 2024 +0000 Merge branch 'main' into kc/final_fix commit 5c419f9fa23616a63a0bd584f18e509bb7704b50 Author: kcz358 Date: Sun Mar 3 07:23:19 2024 +0000 Fix logging utils bug on wandb grouping commit 0010d0ac308051e977981b83a51d0654488501d9 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Sun Mar 3 13:01:11 2024 +0800 [Fix] refcocog dataset path, record gpt prompt in internal eval, build context issue (#59) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update README.md with new features and installation instructions * Update supported models and datasets * Delete otter.py file * Fix capitalization in README.md * Update image sizes and add new features * Refactor README.md to improve readability and add new features * Add description for lmms-eval in README.md * Update accelerator support in README.md * Update lmms-eval README with improved description and additional features * Update README.md with improved task grouping description * change `Otter-AI/MME` to `lmms-lab/MME` * Update README.md * Update README.md * Remove unused code in mme.yaml * Squashed commit of the following: commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * add llava main in pyproject * Update README.md * Remove unnecessary dependencies and add specific version for llava_repr * Add dependencies for llava_repr*** * Update README.md * add some docs on models and command line commands * remove some lines * typo * Update model_guide.md * Update model_guide.md * Update README.md * Update README.md * Update README.md * Fix refcocog dataset path * Record gpt response in eval info * Resolve conflict * Fix hallusionbench gpt json saving path * Rename hallubench gpt output path * Change remove image to check by type instead of check by names * More robust check by type * Remove unnecessary img in data * Forcing an empty commit. * Testing * Delete unnecessary things * Fix seedbench2 image issue in doc_to_text * Add conditional exclude for internal eval * Fix small bugs in list_with_num * Revise list_with_num model args --------- Co-authored-by: Bo Li Co-authored-by: Fanyi Pu Co-authored-by: jzhang38 commit b2ca65d1f12d84ae7a37ecc81f760901389a1af0 Author: kcz358 Date: Sat Mar 2 05:58:08 2024 +0000 Revise list_with_num model args commit a262ea1720b2c02839d21dad2a7618bc80725f18 Author: kcz358 Date: Sat Mar 2 05:09:15 2024 +0000 Fix small bugs in list_with_num commit 2fbeafc882c80242a10381abc67629d5d8b7071a Author: kcz358 Date: Sat Mar 2 03:49:36 2024 +0000 Add conditional exclude for internal eval commit f188052450bed2f3a30ab6f9a6f7eb844a64cb33 Merge: a3cae8e ffb9eb2 Author: kcz358 Date: Sat Mar 2 03:24:29 2024 +0000 Merge branch 'dev/readme' into kc/final_fix commit baef5905505892593fe783beb18a2de20991d6af Author: kcz358 Date: Sat Mar 2 02:47:31 2024 +0000 Fix seedbench2 image issue in doc_to_text commit 11b46f3b701b79b361dd5175a263e4d89bd07fb5 Author: kcz358 Date: Fri Mar 1 15:32:49 2024 +0000 Delete unnecessary things commit 0982de2e7a2310429e51ec7828886fd49953f716 Author: kcz358 Date: Fri Mar 1 15:31:42 2024 +0000 Testing commit f840ed80f4ae467fff62b61844854a3a9e8ec8a5 Author: kcz358 Date: Fri Mar 1 15:29:30 2024 +0000 Forcing an empty commit. commit 80db78f600d07011188983637c94da84b9475fbf Merge: 786f2b5 1700786 Author: kcz358 Date: Fri Mar 1 15:24:56 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 676229de870b8d465cef08867cd272a4b696e630 Author: kcz358 Date: Fri Mar 1 15:24:20 2024 +0000 Remove unnecessary img in data commit d293b96fb3537fea85f10f216d762abf35e05e8d Merge: 4240785 888c1c1 Author: kcz358 Date: Fri Mar 1 13:41:24 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit 01bbd010590d6b7f105525580209191a1d6d5232 Author: kcz358 Date: Fri Mar 1 13:40:51 2024 +0000 More robust check by type commit 66595ebc073ff9431f2400006196c0645be58ea4 Author: kcz358 Date: Fri Mar 1 13:00:57 2024 +0000 Change remove image to check by type instead of check by names commit 08c2ebad1532fd6c34ac04efb94a268db9862d4f Author: kcz358 Date: Fri Mar 1 12:33:02 2024 +0000 Rename hallubench gpt output path commit aefbd3c6856584135e2dcbe13381db0e0780f063 Author: kcz358 Date: Fri Mar 1 09:32:52 2024 +0000 Fix hallusionbench gpt json saving path commit b9aebc3ff3b122d6d4a81bd2f28e86b2c390c505 Author: kcz358 Date: Fri Mar 1 08:51:13 2024 +0000 Resolve conflict commit c9daa91f2576de69af73c80e263afb085ecd8288 Merge: 9cf86fa 93534dc Author: kcz358 Date: Fri Mar 1 08:37:21 2024 +0000 Merge branch 'kc/final_fix' into dev/readme commit b1c4c88b9b36e02e9ed738ff9217d98a5ef2117b Author: kcz358 Date: Fri Mar 1 07:55:03 2024 +0000 Record gpt response in eval info commit b35bc4a6c8fd6b4b2a68bb3054878807b8b92281 Author: kcz358 Date: Fri Mar 1 07:49:01 2024 +0000 Fix refcocog dataset path commit 2a45079a974c55aeb8e04d367759e3cf383072c1 Author: Zhang Peiyuan Date: Thu Feb 29 13:40:02 2024 +0800 Dev/py add models (#57) * add instructblip * minicpm_v * remove from qwen-vl * speed up postprocessing * Optimize build context speed --------- Co-authored-by: Pu Fanyi Co-authored-by: kcz358 commit 7bdab7a743092cdca66b049e15332d8c21680147 Author: Pu Fanyi Date: Wed Feb 28 14:49:07 2024 +0800 Pufanyi/flickr30k refractor (#56) * refactor vizwizvqa task * Delete vqav2_test and vqav2_val YAML files * Refactor vqav2_process_results functions * Add a pack for vqav2 * refactor okvqa * roll back vizwiz_vqa * Fix exact_match calculation in ok_vqa_process_results * Update OKVQA dataset name in readme * add model_specific_prompt_kwargs * add model_specific_prompt_kwargs to vizwiz_vqa * add model_specific_prompt_kwargs for vqav2 * lint * fix a small bug for eval_logger * Refactor make_table function to display points as " - " if value is None * Merge commit '90f42f0876a4914c5ac0d213b9dffbfb4797ff62' * Refactor ok_vqa_aggreate_submissions function * Merge commit '4afec3303a0a7ed27a8265565343bf2851b9e4c7' * Refactor VQA submission file saving * Update file utils * Merge commit 'c144b75f0c9145a625b2bbdef5123ed81e343a11' * Refactor file path handling and submission generation * OKVQA path * vizwizvqa file * pack cmmmu * fix a small metric bug for cmmmu * Add higher_is_better flag to submission metric * Add CMMMU dataset to README.md * Add logging and refactor submission file generation in docvqa utils.py * pack docvqa * add traceback to print detailed error * Refactor docvqa_test_aggregate_results to accept additional arguments * Add metric check in evaluator.py and update test.yaml and val.yaml * add common `EvalAIAnswerProcessor` for okvqa, textvqa, vizwizvqa and vqav2 * merge textvqa * textvqa * Modify submission file generation for COCO test results * Update test result storage path * update coco cap file name * Update COCO 2017 Caption dataset name * ferret * Add Ferret dataset * Refactor hb_doc_to_text function to include model-specific prompts * Add IconQA and its subtasks * Refactor image list creation in doc_to_visual function * Add process_results function to default template * Update process_results function in iconqa utils.py * refactor flickr30k * change aggregation function * Fix formatting issues and update logging message * Fix llava can not handle only text question (no visuals) * Fix qwen can not handle no image question (no visuals) * Add fuyu prepare accelerator scripts * refactor mme * naming consistency * aggregation_submissions consistency * flickr30k naming consistency * remove submissions for mme * remove unused submission function * Refactor infovqa_test.yaml and infovqa_val.yaml * Refactor code for improved readability and maintainability * stvqa * remane sqa * Update lmms_eval textcaps files and utils.py * Update default prompt for text captions * Refactor textcaps_aggregation_result function * Add generate_submission_file function and update mathvista_aggregate_results signature * Update nocaps_test.yaml and nocaps_val.yaml * refractor internal_eval * Add internal evaluation datasets * pack multidocvqa * mmvet * Fix gpt eval timeout issue for hallubench, restore load from gpt to avoid re evaluating * Refractor llava wild * Refractor llava-bench-coco * Add JSON file generation for gpt evaluation details * mmmu * Remove MMBench English and Chinese tasks * Remove unnecessary return statement in mmbench_aggregate_test_results function * Fix distributed process group initialization * Update dataset paths and group names in mmbench test configs * Update import statements in cc_utils.py, cn_utils.py, and en_utils.py * Add torch module import * lint * Remove IconQA dataset from README.md * Add Multi-DocVQA and its submodules * Add new datasets and update task names * Refactor flickr_aggregation_result function to accept additional arguments * Add timeout kwargs in Accelerator constructor * Add encoding to be utf-8 for cmmmu * Fix llava try and catch, remove torch.distributed.init in main * Ds prepare script for llava --------- Co-authored-by: JvThunder Co-authored-by: kcz358 commit d3dfd94ec91706587bf9f57dfebaad2cc3b5281c Author: Li Bo Date: Tue Feb 27 22:52:07 2024 +0800 [Wandb Logger] add models, and args to wandb tables. (#55) * Refactor logging in lmms_eval package * Refactor variable names in lmms_eval package * Update commands.md * Add repr_scripts for reference * Add timeout for gpt4V * Remove unnecessary dependencies * Add reproduce into readme * Revise seedbench process_result * Fix exclude dc hardcode postprocess logic error * Fix metric repeat issue * Update dataset runtime and add environment info * Revise val submission file saving path * Put the correct query into the gpt extraction * Update sleep time in utils.py * update --------- Co-authored-by: Fanyi Pu Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: jzhang38 Co-authored-by: kcz358 * Update README.md * Update README.md * Fix bug in login functionality * Fix bug in login functionality * Refactor device assignment and remove unnecessary line * Refactor device assignment and remove unnecessary line * Refactor code and remove unnecessary lines * Refactor code and remove unnecessary lines * Refactor output path generation in cli_evaluate_single function * Refactor output path generation in cli_evaluate_single function * Update gpt_eval_model_name in llava-in-the-wild.yaml * Update gpt_eval_model_name in llava-in-the-wild.yaml * Update gpt_eval_model_name in llava-in-the-wild.yaml * Update gpt_eval_model_name in llava-in-the-wild.yaml * Fix loglikelihood error for llava 1.6 (#66) * [ReFactor] make internal_dev as the current main branch. (#67) * Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li * VQAv2 eval (#4) * vqav2 * Add vqav2_process_results function and update vqav2_doc_to_text function * Implement vqav2_process_results function to return exact match score * Refactor fewshot_docs() to use config.fewshot_config * Refactor Task class to handle fewshot_docs when training and validation docs are not available * Add answer processing logic in vqav2_process_results function * Refactor vqav2_process_results function and add submission aggregation * Add vqav2_aggreate_submissions function to utils.py * textvqa * Refactor answer processing in textvqa_process_results() function * textvqa eval * Update dataset path and modify textvqa_doc_to_text function * Capitalize the question in textvqa_doc_to_text function * Update textvqa.yaml and utils.py * Fix formatting issues in lmms_eval/api/task.py, lmms_eval/tasks/gqa/utils.py, lmms_eval/tasks/textvqa/utils.py, and lmms_eval/tasks/vqav2/utils.py --------- Co-authored-by: Li Bo * [Big Changes] add LLaVA-1.6, MMVet, LLaVA-W, POPE, and many other changes on logs, model args. (#7) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * black lint * Remove unused code and scripts * Update lmms_eval tasks and utils * Update LMMS-Eval dependencies and configurations * Squashed commit of the following: commit 209f3904f33210bec0b4b146e96fcbd67a4e1541 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Wed Jan 17 20:27:13 2024 +0800 Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li commit f9e48cec5493010a363b446b81a335ef1484e42f Author: Zhang Peiyuan Date: Wed Jan 17 20:26:58 2024 +0800 Update utils.py (#6) * Fix logging issue and remove unnecessary whitespace * Add openai and pycocoevalcap dependencies * Fix device mapping issue in Llava constructor * Add support for truncating context in generation * Update Llava model and evaluation configuration * Update YAML configuration files * Update YAML configuration files * add otterhd and gemini models * Add support for custom image aspect ratio in Llava model * Add dataset_kwargs and max_gen_toks to YAML files * Fix log_samples suffix typo and use hash for output name * Refactor LMMS evaluation code and update LLAVA model properties * matched response for mistral-llava * Refactor logging in llava_aggregation function * Print evaluation statistics instead of logging them * Fix logging information in llava_aggregation function * Add new models and dataset_kwargs for COCO tasks * Update truncate_context parameter in Llava class constructor * Update dataset_kwargs in YAML files * Remove issue type tags from issue and pull request templates * add mmvet and try to modify llava arch * black lint * Update lmms_eval tasks and utils * Update LMMS-Eval dependencies and configurations * Squashed commit of the following: commit 209f3904f33210bec0b4b146e96fcbd67a4e1541 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Wed Jan 17 20:27:13 2024 +0800 Add COCO, RefCOCO, RefCOCO+, RefCOCOg (#5) * Update author name and email in pyproject.toml * add mmvet and try to modify llava arch * Add coco, refcoco support * Fix doc_to_visual error * Fix segmentation mask error * Add refcoco+, refcocog * Remove debug code * black lint * Remove unused code and scripts * Fix group stderr N/A error between str and int * Fix letter case issue * Update lmms_eval tasks and utils * Fix coco test_split name * Add llava-bench-in-the-wild support * Black codestyle, lint * Add COCO evaluation metric * Add refcoco, refcocog, refcoco+ evaluation kit * Add llava bench coco support --------- Co-authored-by: Bo Li commit f9e48cec5493010a363b446b81a335ef1484e42f Author: Zhang Peiyuan Date: Wed Jan 17 20:26:58 2024 +0800 Update utils.py (#6) * Fix logging issue and remove unnecessary whitespace * Add openai and pycocoevalcap dependencies * Fix device mapping issue in Llava constructor * Add support for truncating context in generation * Update Llava model and evaluation configuration * Update YAML configuration files * Update YAML configuration files * add otterhd and gemini models * Add support for custom image aspect ratio in Llava model * Add dataset_kwargs and max_gen_toks to YAML files * Fix log_samples suffix typo and use hash for output name * Refactor LMMS evaluation code and update LLAVA model properties * matched response for mistral-llava * Refactor logging in llava_aggregation function * Print evaluation statistics instead of logging them * Fix logging information in llava_aggregation function * Add new models and dataset_kwargs for COCO tasks * Update truncate_context parameter in Llava class constructor * Update dataset_kwargs in YAML files * Remove issue type tags from issue and pull request templates * Refactor pope utils functions * Update transformers dependency to version 4.36.2 * Revise llava-in-the-wild prompt for align * Add default values for gen_kwargs in Llava class * Fix formatting issues and import pdb for debugging * Remove pdb.set_trace() and update default value for max_new_tokens * Add llava loglikelihood * Fix formatting and indentation issues in lmms_eval/api/metrics.py and lmms_eval/models/llava.py * Update function to handle edge cases This commit updates the function to handle edge cases, improving the overall reliability and robustness of the code. * Update black version in pre-commit config * Remove duplicate lines in gqa * Another way to solve memory issue * Handle exception in model generation * Refactor pope_aggregate_results to use "score" key instead of "pope_accuracy" * Update pope metrics aggregation functions * Add model_to_prompt in pope.yaml * Update pope.yaml configuration * Refactor code to simplify construct_requests call --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> * Add datetime to output name in cli_evaluate function Add get_datetime_str function to utils.py * Refactor pope_aggregate_f1_score function * Fix datetime format in get_datetime_str function * Update JSON dump indentation in cli_evaluate function * Add datetime to output name in cli_evaluate function (#10) * Revert "Add datetime to output name in cli_evaluate function" This reverts commit ef26f78c46b50d8769a4fb6990b909162c2881c3. * Add datetime to output name in cli_evaluate function * [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint * [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * add mmmu (#15) * add mmme * black * add mmmu (#15) * add mmme * black * [Memory issue] Solve memory issue for building context (#14) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * Remove unused function llava_aggregation * Refractor llava-bench aggregation code * Add logs and scripts to .gitignore, and set image_aspect_ratio to original in scienceqa.yaml * Update generation parameters in scienceqa.yaml * Solve memory issue for building context * Solved gather result error * Update lmms_eval scienceqa_img config * Fixed nocaps store results * Revise seedbench prompt * Squashed commit of the following: commit c3cc24a89415aeccad31ccbb10642af677cd6fe5 Author: Zhang Peiyuan Date: Wed Jan 24 14:07:36 2024 +0800 add mmmu (#15) * add mmme * black commit 0dbc5d16c4f45ebea8def5f0bc1a36fcd93f9a05 Author: Li Bo Date: Wed Jan 24 10:00:33 2024 +0800 [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions commit fec494dbe5971e8fa5a886b191a4781be3ce7a6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 23 19:17:40 2024 +0800 [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint commit 4c3c2c63a681f29c537c2467957de1a90568748d Author: Li Bo Date: Tue Jan 23 19:17:12 2024 +0800 [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function --------- Co-authored-by: Bo Li * [Memory issue] Solve memory issue for building context (#14) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions * Remove unused function llava_aggregation * Refractor llava-bench aggregation code * Add logs and scripts to .gitignore, and set image_aspect_ratio to original in scienceqa.yaml * Update generation parameters in scienceqa.yaml * Solve memory issue for building context * Solved gather result error * Update lmms_eval scienceqa_img config * Fixed nocaps store results * Revise seedbench prompt * Squashed commit of the following: commit 290126e6a269db4cca9b3544bd017d6c17012793 Author: Zhang Peiyuan Date: Wed Jan 24 14:07:36 2024 +0800 add mmmu (#15) * add mmme * black commit 8b0227cd7b2602d096d773a01b2199d1f4110f22 Author: Li Bo Date: Wed Jan 24 10:00:33 2024 +0800 [Datasets] Add four internal evaluation datasets (#13) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function * Remove unused variable in mmvet_process_results function * Remove unused imports in utils.py * Refactor get_chat_response function to include retries for API requests * Update gpt_eval_model_name in lmms_eval/tasks/dc100_en.yaml and add retry logic in get_chat_response function * Update prompt variable in lmms_eval tasks * Refactor output_name variable in cli_evaluate function * Fix logging message in mmvet_process_results function * Update sleep time in get_chat_response function * Merge commit 'fec494dbe5971e8fa5a886b191a4781be3ce7a6f' * Refactor get_eval function to include retries * Add token parameter to load_dataset function in gqa_doc_to_visual * Refactor llava_process_results and llava_aggregation functions commit fec494dbe5971e8fa5a886b191a4781be3ce7a6f Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Tue Jan 23 19:17:40 2024 +0800 [Dataset] Add SEED-Bench, TextCaps, NoCaps (#12) * Change coco from print to logger * Add llava loglikelihood * Add Nocaps support * Fix pass through function * Add textcaps support * Fix textcaps eval image_id * Add seedbench support * Add seedbench ppl evaluation * black lint commit 4c3c2c63a681f29c537c2467957de1a90568748d Author: Li Bo Date: Tue Jan 23 19:17:12 2024 +0800 [Datasets] Added POPE and Aligned. (#11) * Update generation_kwargs in pope.yaml * Update pope_doc_to_text function --------- Co-authored-by: Bo Li * Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts * [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps * [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps * add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * [Datasets] Changes for Flickr30K and NoCaps, also merged Peiyuan's Model Specific Prompt. (#20) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit 0df825c9e72a06e6acb4c0bd43c2083ffe8b74c0 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit b9d9f9896993033b92346e9f47420c55b866c715 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 4256bef410e4c8d8761e0cd0d79ac5e57b97651b Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0c8a3919885b8fe2880bb2892f7a619d060012d1 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit d2bc7c92ac61179b8c4031e11bc31970355252f6 Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit c78fa29cd0d161641ee05db57bd39314b998c8c7 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 397f0906968fd8ba04b883469b96217737c43e09 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 52a7ea6c7599adeec2ac2787f500e215ce47cf79 Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit f706b2aaf9b288c582611191a1841b58feaeb741 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Add download configuration for dataset * Update GQA_RAW_IMAGE_DATASET path in utils.py * add datasets * Update gpt_eval_model_name in mathvista.yaml * Merge commit '0d620f98b49f8204d02633f209eedd5d8b7a1f7c' * Update pyproject.toml with dependencies and URLs * Squashed commit of the following: commit 8b600f55b6cf5627504c407871539db59f6085a3 Author: Zhang Peiyuan Date: Sat Jan 27 13:56:37 2024 +0800 Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Refactor image processing and submission file path * Refactor directory creation logic in cli_evaluate_single function * Update dataset path and test split in vqav2.yaml * Remove "total" column from cap_details_columns DataFrame * Add retry logic for dataset download * Add 'tenacity' to dependencies in pyproject.toml * Refactor code in ContextSampler class * Update Black version and configuration, and improve code readability in ContextSampler * Update Black version and line length --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: Fanyi Pu * [Datasets] Changes for Flickr30K and NoCaps, also merged Peiyuan's Model Specific Prompt. (#20) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme * Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Fix cli itself can not run with config file * Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability * Refactor get_task_dict function to handle nested groups * Add submission file for coco, flickr30k, nocaps, and textcaps tasks * Remove unused files and update task configuration * Fix tasks issue for nocaps, refcoco/+/g * Fix file path and raise error if config file does not exist * Exclude train in refcoco/+/g config * Solve doc_iterator_for_counting crashing issue * Black lint * Refactor code to improve performance and readability * Squashed commit of the following: commit a2cc9303dc72e4d53983bb56e54a32e977c3e270 Author: JvThunder Date: Fri Jan 26 01:03:57 2024 +0800 change okvqa yaml commit 35e87e7c7a480d005abf607c2527a35457d92311 Author: JvThunder Date: Fri Jan 26 00:55:40 2024 +0800 change yaml commit 89755323596b85208ed33aa88c296604a39af6eb Author: JvThunder Date: Fri Jan 26 00:42:43 2024 +0800 add okvqa task commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Squashed commit of the following: commit 0b0d30dfb247c5f0b7b68398b9e9fcde74cf7fa2 Author: JvThunder Date: Fri Jan 26 01:06:02 2024 +0800 change ocr reference commit e273f9cbd91540df86bdbc652bff88a847bd0d2d Author: JvThunder Date: Fri Jan 26 01:05:46 2024 +0800 revert example_eval commit e84126aaaf8a07bd371a0571a914ccbcd3697f20 Author: JvThunder Date: Fri Jan 26 00:17:28 2024 +0800 edit vizwiz utils commit 110deab53dc1a2fd349b1872cd261b69074c5fa8 Author: JvThunder Date: Thu Jan 25 23:49:47 2024 +0800 reorganize __init__ commit 0fa3e0c40075997ea80ed976bdee9615f17d3ece Author: JvThunder Date: Thu Jan 25 23:46:20 2024 +0800 minor fixes commit 2aaca579120def99860f90054233f3358950fa66 Author: JvThunder Date: Thu Jan 25 17:41:03 2024 +0800 add vizwizvqa eval rask commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * Refactor mathvista.yaml and utils.py * Add gpt_eval_score to mathvista_process_results * Refactor mathvista_aggregate_results to return average accuracy score * Fix refcoco evaluation error * Fix evaluation problem for refcoco+/g * Refactor mathvista.yaml and mathvista_evals.py * Add dependencies and update YAML files * Refactor mmbench_en/utils.py to save test results to separate Excel file * Fix caption task prompt * Add group field to mmbench_en_test and mmbench_en_val yaml files * Delete mmbench_en_val.yaml file * Update mmbench_cn.yaml and mmbench_cn_test.yaml * Update mmbench_cn_val.yaml and utils.py * Remove unused fields in mmbench_cn_cc_process_results function * Update aggregation function for mmbench_en_dev.yaml * Fix capitalization of L2-category key in utils.py * Fix variable name in mmbench_process_results function * Delete mmbench_cn_val.yaml file * Update mathvista_test.yaml and mathvista_testmini.yaml * Fix warnings and update mathvista.yaml * Remove system message from MathVistaEvaluator * Update GPT model version in MathVistaEvaluator constructor * Update GQA_RAW_IMAGE_DATASET path in utils.py * change vizwiz to test set * Add split flag to mathvista_aggregate_results function * Add higher_is_better: false to gpt_eval_info metric in d170_cn, d170_en, dc100_en, and dc200_cn yaml files * Add download configuration for dataset * Update GQA_RAW_IMAGE_DATASET path in utils.py * add datasets * Update gpt_eval_model_name in mathvista.yaml * Merge commit '817eb057bcb61226b33d3ac3c8def01c36c90f96' * Update pyproject.toml with dependencies and URLs * Squashed commit of the following: commit f253968ad703f682a29317bdd51ec6c1fd7c5465 Author: Zhang Peiyuan Date: Sat Jan 27 13:56:37 2024 +0800 Dev/add chartqa and ai2d (#23) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code * add chartqa * black * add ai2d * black * update chartqa * blacl * update ai2d dataset * black * Add 'submissions/' directory to .gitignore * Add Python setup and Black version installation workflow Refactor ContextSampler class in samplers.py Remove unnecessary line in DecontaminationFilter class Update dependencies in pyproject.toml * Refactor code in ContextSampler class --------- Co-authored-by: Bo Li * Refactor image processing and submission file path * Refactor directory creation logic in cli_evaluate_single function * Update dataset path and test split in vqav2.yaml * Remove "total" column from cap_details_columns DataFrame * Add retry logic for dataset download * Add 'tenacity' to dependencies in pyproject.toml * Refactor code in ContextSampler class * Update Black version and configuration, and improve code readability in ContextSampler * Update Black version and line length --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: Fanyi Pu * vqav2 (#25) * Update tqdm progress bar position * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 95ef3ea519cbd772924f9a6afa5394979eb00432 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * remove useless output file * Update dataset path in vqav2.yaml * Squashed commit of the following: commit 75bb7043ea5a533ab6351fc0f5ab055e86106423 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:56:45 2024 +0800 Black lint commit 6635a8aa34cfbd3c7a4afb6fcd214a7283ce01cb Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:47 2024 +0800 Solve doc_iterator_for_counting crashing issue commit 080f42b88ea8acacd527b8d67b84ba1d7d135b03 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:13 2024 +0800 Exclude train in refcoco/+/g config commit 4da84069c08c95e49e8ab0e64a1e103ff7ac8730 Merge: 6a1ae69 697a438 Author: Bo Li Date: Thu Jan 25 17:17:13 2024 +0000 Merge branch 'dev/bli_add_datasets' of https://github.com/EvolvingLMMs-Lab/lmms-eval into dev/bli_add_datasets commit 6a1ae69923d79ae32a001edac38206b605274ec3 Author: Bo Li Date: Thu Jan 25 17:17:06 2024 +0000 Fix file path and raise error if config file does not exist commit 697a4387827ceeec3e393237dd1baa217c714c88 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 00:47:24 2024 +0800 Fix tasks issue for nocaps, refcoco/+/g commit 47e40437126d39a5f062c9a33b4de426c1a29804 Author: Bo Li Date: Thu Jan 25 10:09:43 2024 +0000 Remove unused files and update task configuration commit 9976eb8e9ed03c8613725fdbd822ef5d8cf70e47 Author: Bo Li Date: Thu Jan 25 09:43:56 2024 +0000 Add submission file for coco, flickr30k, nocaps, and textcaps tasks commit 95f97a69faa6129676e89eee14960fcfe2076b7c Author: Bo Li Date: Thu Jan 25 09:32:54 2024 +0000 Refactor get_task_dict function to handle nested groups commit 3b79ee842b2488714baf92ab34528ef77989d392 Author: Bo Li Date: Thu Jan 25 09:13:46 2024 +0000 Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability commit f5c353f2ce93a2d96add4312b695b57432f68cbb Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 17:07:20 2024 +0800 Fix cli itself can not run with config file commit 9a68fec37be74cfe8d4a73390bc83edee147ae24 Author: Bo Li Date: Thu Jan 25 09:09:04 2024 +0000 Squashed commit of the following: commit 18e984cfe173390843c73048a931baa17800f918 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 93f847c5851fd246716367935d6b807b17d53949 Author: Bo Li Date: Thu Jan 25 09:02:57 2024 +0000 Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit fa4ad4404e26d8924f55208746dbb9143b464011 Merge: 22c3adf 1d3fdd4 Author: Bo Li Date: Thu Jan 25 08:43:15 2024 +0000 Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' into dev/bli_add_datasets commit 22c3adfd0645acc23b6d7c06b487f4ffd47666c4 Author: Bo Li Date: Thu Jan 25 08:38:52 2024 +0000 Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit 7e8b57d3bcc21d2a049d3abbc8a8201631641db4 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 5f55126484a7c9325db586d26cf2052538222804 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit aa6f8853cf82384fb3b15306fec4769212fbc5ab Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit 4c712336b6f7438e717a865910bb241e413a4688 Author: Bo Li Date: Thu Jan 25 08:38:11 2024 +0000 Add coco_val and coco_test tasks to coco.yaml commit b5547126c855927fd4dc8384211e4aceee40870f Author: Bo Li Date: Thu Jan 25 04:58:28 2024 +0000 Update dataset_path in flickr30k.yaml commit f786f61e2559f082072f21aa9030e2080ddaf809 Author: Bo Li Date: Thu Jan 25 02:12:25 2024 +0000 Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' commit 796a011000e0df90f66f8e80cb34dc2318ae9ac8 Author: Bo Li Date: Thu Jan 25 02:10:18 2024 +0000 Add submission folder and update file paths for storing prediction results commit ecb47d73d6e000b472be6c5c0cdc9413c7734384 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit dc23f4b42b1dd60b41904d7ddbee1412d6851077 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts commit 118744c63eb2d9724571d85fbbd85fcc9ad05b59 Merge: c6370bf 51f2eaa Author: Li Bo Date: Wed Jan 24 22:10:07 2024 +0800 Merge branch 'main' into dev/bli_add_datasets commit c6370bff65903681f00cf3d07111d8e15a57b619 Author: Bo Li Date: Wed Jan 24 14:08:06 2024 +0000 Update dataset paths and improve user prompts commit 810daf458fa94cb3ec2b4a6cc5ecb1e656a24002 Author: Bo Li Date: Wed Jan 24 11:52:33 2024 +0000 Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' commit 95ef3ea519cbd772924f9a6afa5394979eb00432 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Fix bug in login functionality * create vqav2_val * Update vqav2_test.yaml * Update vqav2_test.yaml * Update vqav2_val.yaml --------- Co-authored-by: Li Bo * vqav2 (#25) * Update tqdm progress bar position * Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' * Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 767f7e2cae60cf67ec5878234d84321395a3ed15 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * remove useless output file * Update dataset path in vqav2.yaml * Squashed commit of the following: commit eeb2b9827502f044ef67d8440f53124baf219ba3 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:56:45 2024 +0800 Black lint commit 1ce9f0b37e4bc5e6ff5fbfcd23fd339eb14974ae Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:47 2024 +0800 Solve doc_iterator_for_counting crashing issue commit e12b3bb41ed4f51540cfac84e5e96d15777540c4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 09:55:13 2024 +0800 Exclude train in refcoco/+/g config commit 42c56f82bc4ccae12e19e76d09d7e525ca9ef2f4 Merge: 6a1ae69 697a438 Author: Bo Li Date: Thu Jan 25 17:17:13 2024 +0000 Merge branch 'dev/bli_add_datasets' of https://github.com/EvolvingLMMs-Lab/lmms-eval into dev/bli_add_datasets commit aed08303fe87808986d206540a0c0ee6d8764988 Author: Bo Li Date: Thu Jan 25 17:17:06 2024 +0000 Fix file path and raise error if config file does not exist commit a105386613c443d9e740c89725cbd1281bbdfef6 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Fri Jan 26 00:47:24 2024 +0800 Fix tasks issue for nocaps, refcoco/+/g commit 21c8119e377760f44c769bed2528d863a8f4333b Author: Bo Li Date: Thu Jan 25 10:09:43 2024 +0000 Remove unused files and update task configuration commit 0ccb2629c2aacdb297b7cf0c9c2bcfa386bb7582 Author: Bo Li Date: Thu Jan 25 09:43:56 2024 +0000 Add submission file for coco, flickr30k, nocaps, and textcaps tasks commit 5365e13e93c702a1e0e259ee6a08d6a427d72470 Author: Bo Li Date: Thu Jan 25 09:32:54 2024 +0000 Refactor get_task_dict function to handle nested groups commit 6773348c807bcfa1b09ceffc90c75e15cad908f7 Author: Bo Li Date: Thu Jan 25 09:13:46 2024 +0000 Fix bug in login functionality Refactor code for better performance Add new feature for user authentication Update UI layout for improved user experience Fix typo in variable name Optimize database queries for faster response time Add error handling for edge cases Update dependencies to latest versions Remove unused code Improve code readability and maintainability commit 31140f9c87dea89ca94c94bc850e3a8d43e5f8b4 Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 17:07:20 2024 +0800 Fix cli itself can not run with config file commit df1bad47f6ed13f94848d2bee29b28e00c2384b2 Author: Bo Li Date: Thu Jan 25 09:09:04 2024 +0000 Squashed commit of the following: commit b13a805623dfd9d826ddd440e1b5ecde773fbb12 Author: Zhang Peiyuan Date: Thu Jan 25 17:08:25 2024 +0800 add model specific prompt and gen kwargs in sqa (#19) * add mmme * black * add model specific prompt and gen kwargs * black * add yaml config to supprot multi-model eval * print table at the end * refactor multi model code commit 06383aa4a5ff59db52fc8d584f3086efd88b7e74 Author: Bo Li Date: Thu Jan 25 09:02:57 2024 +0000 Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit 7a71fd6022ee5985100dda38b94956595cec77a5 Merge: 22c3adf 1d3fdd4 Author: Bo Li Date: Thu Jan 25 08:43:15 2024 +0000 Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' into dev/bli_add_datasets commit 6870cba13cb54976480c1d5e8d97602c246f881b Author: Bo Li Date: Thu Jan 25 08:38:52 2024 +0000 Squashed commit of the following: commit 542a34dc5721ecdff6c5c68b0568692ad3a17149 Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 3c397b8af85192b1821b3b6a0d8b8df746b5347c Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit e7b8a2d1f1e7337f02298efafd2ebf81543f4f85 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit 2626383d99b5eac59d531ca0f293df960570c524 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 8349935fe145e33af0007ad4fb0d71fd925be7a0 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts in sqa commit d4e8e2552d40752bfdc5bbf4cd962c1798096258 Author: jzhang38 Date: Thu Jan 25 10:36:46 2024 +0800 add model specific prompt and gen kwargs commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit 520c7a2cafe60810aca79df814ce6829d4576032 Author: jzhang38 Date: Wed Jan 24 13:56:51 2024 +0800 black commit 3a633240327c078fa4f5a75dbd38ad5bc0d468dd Author: jzhang38 Date: Wed Jan 24 13:55:43 2024 +0800 add mmme commit b40d522b6bf483ebdfbf5facd4573de0cf8a93f6 Author: Bo Li Date: Thu Jan 25 08:38:11 2024 +0000 Add coco_val and coco_test tasks to coco.yaml commit 5bf643f73d06f1e540897b753450352bb92fd9ec Author: Bo Li Date: Thu Jan 25 04:58:28 2024 +0000 Update dataset_path in flickr30k.yaml commit 95f110f0eef5196205bc501367e3642c57cc7a17 Author: Bo Li Date: Thu Jan 25 02:12:25 2024 +0000 Merge commit '842fbc6f2da7d9a118adf9ec27c3d8542d74168e' commit c844ae49b18c1334711832208b0359c9439fe1c0 Author: Bo Li Date: Thu Jan 25 02:10:18 2024 +0000 Add submission folder and update file paths for storing prediction results commit 842fbc6f2da7d9a118adf9ec27c3d8542d74168e Author: kcz358 <92624596+kcz358@users.noreply.github.com> Date: Thu Jan 25 09:47:31 2024 +0800 [Dataset] Add flickr30k (#18) * Add flickr30k support * Black lint * Align prompt with NoCaps commit 4bf0504fabc3b62f356c467b2fd1119083d27313 Author: Li Bo Date: Wed Jan 24 22:10:14 2024 +0800 [Datasets] modify NoCaps data path and prompts (#17) * Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' * Update dataset paths and improve user prompts commit f0446227f0dd93651e9d6c06254bbf5212ede2dd Merge: c6370bf 51f2eaa Author: Li Bo Date: Wed Jan 24 22:10:07 2024 +0800 Merge branch 'main' into dev/bli_add_datasets commit 1e1f6cfccba758dc606fa4217102518fab73c936 Author: Bo Li Date: Wed Jan 24 14:08:06 2024 +0000 Update dataset paths and improve user prompts commit 966933754b9e5179995b3ab41d746603e13e75c6 Author: Bo Li Date: Wed Jan 24 11:52:33 2024 +0000 Merge commit '767f7e2cae60cf67ec5878234d84321395a3ed15' commit 767f7e2cae60cf67ec5878234d84321395a3ed15 Author: Li Bo Date: Wed Jan 24 19:51:34 2024 +0800 Add output path file naming convention (#16) Update datetime format in get_datetime_str() function * Fix bug in login functionality * create vqav2_val * Update vqav2_test.yaml * Update vqav2_test.yaml * Update vqav2_val.yaml --------- Co-authored-by: Li Bo * vizwiz dataset (#24) * Merge commit '95ef3ea519cbd772924f9a6afa5394979eb00432' * Update dataset paths and improve user prompts * Add submission folder and update file paths for storing prediction results * Merge commit 'ecb47d73d6e000b472be6c5c0cdc9413c7734384' * Update dataset_path in flickr30k.yaml * Add coco_val and coco_test tasks to coco.yaml * Squashed commit of the following: commit 4d48d0c9b88e62dfebe05ec909b7f1851e9cd75d Author: jzhang38 Date: Thu Jan 25 11:59:12 2024 +0800 refactor multi model code commit 4a4b7bec200c72332b61a0c277cd8f8a34e4f721 Author: jzhang38 Date: Thu Jan 25 11:51:16 2024 +0800 print table at the end commit 63739fc6fa0a462d807ae81de0db0173102de584 Author: jzhang38 Date: Thu Jan 25 11:20:59 2024 +0800 add yaml config to supprot multi-model eval commit edcc752f97ea3845cefad56624e5d2855066f680 Author: jzhang38 Date: Thu Jan 25 10:39:42 2024 +0800 black commit 41f4b63d3a6e83babe92bac32a7432a8ef740bb5 Merge: 7e8b57d 1d3fdd4 Author: jzhang38 Date: Thu Jan 25 10:37:57 2024 +0800 resolve conflicts i… * Update LLaVA-Bench name in README.md * Make sure that gen_kwargs are added to gpt4v * Merge pull request #13 from EvolvingLMMs-Lab/pufanyi/mmbench_fix [Tasks] Fix MMBench * Merge pull request #9 from EvolvingLMMs-Lab/pufanyi/pip_dev update version to 0.1.1 * Make sure that gen_kwargs are added to gpt4v (#68) * Merge commits from lmms-eval/main * Add worldqa task and llava_vid * Adjust snapshot download, we handle the unzip file and the loaded path for the user * Add sft_eval * Generate until strip all response for process results * Squashed commit of the following: commit 75445d4426f491f6369a1138fd3352cb7c9e74fd Author: kcz358 Date: Tue Mar 19 07:49:08 2024 +0000 Add worldqa task and llava_vid * Fix llava repr issue * Fix llava repr error (#70) * Refactor logging and sanitization in WandbLogger * updates * [Feat] Enable world qa evaluation (#71) * Add evaluation metric for worldqa mc and mc_ppl * Fix a small bug in qwen model * put images at the very from MMMU * debug batchsize >1 for llava * Fix image aspect ratio setting in Llava model * Fix setting image aspect ratio in Llava model * change image list * Fix LLaVA import error and update attention implementation * Update dependencies in pyproject.toml and add attn_implementation parameter in Llava class constructor * Squashed commit of the following: commit b1bd1b1644a16f49d1322a2483137254f1711c66 Author: Bo Li Date: Sat Mar 30 17:39:44 2024 +0000 Update dependencies in pyproject.toml and add attn_implementation parameter in Llava class constructor commit 5c0a7ab7d0cee5cab460bfdf674cbd793a1043ca Author: Bo Li Date: Sat Mar 30 16:14:48 2024 +0000 Fix LLaVA import error and update attention implementation * Fix endless warning in fuyu and instructblip * update * updates * remove debug traits * 🐞 fix(): set reasonble patience time * Fix token decoding error in Llava class * Add overwrite config to avoid longer than context length * Delete redundant args * Fix default parameters value error * merge * Remove builder script requirement in video eval * Add videochatgpt support * Add LLaMA-Vid support * Add video-llava support * merge llava_vid from kc/vid_eval to kr_ego * [WIP] adding mmbench dev evaluation (#75) * WIP * Update GPT evaluation model name and sys prompt * 🛠️ Scale accuracy to percentage The accuracy value is now multiplied by 100 in the aggregation function to represent it as a percentage. Regarding the evaluation process, `math` module importation and refactoring reduce progress log verbosity by logging every 100 evaluations instead of 10. It prevents potential logging overflow. Handling of NaN values is added to ensure 'default_value' is set in case of missing data, avoiding errors in split, category, and l2-category assignments. Finally, reporting of categorical and l2-categorical accuracies is streamlined through a new `calculate_hit_rates` function, improving code readability and maintenance. Issue refs: #1427, #1533 * Update GPT evaluation model name and API configuration * Refactor MMBench_Evaluator class to handle missing columns * Add print statements for detailed results in MMBench-CN(CC), MMBench-CN(Dev), and MMBench-EN(Dev) evaluations * Refactor MMBench-CN and MMBench-EN evaluation functions * 🔄 Refactor result processing and logging logic - Simplified the result processing functions across different utility modules (`cc_utils.py`, `cn_utils.py`, `en_utils.py`) to unify the handling of multiple-choice options. Now, all options ("A" to "E") are dynamically added to the result data, and default to "nan" if not provided in the document. - Removed redundant keys directly from the process results dict creation to avoid clutter and align with the new dynamic addition of options. - In `mmbench_evals.py`, removed the unnecessary check for all splits being 'dev' and streamlined the evaluation loop by eliminating the progress bar (tqdm) for a cleaner log output. - Commented-out code and verbose logging during evaluation, which may have interfered with performance, has been removed for a more efficient and less intrusive logging experience. This cleanup reduces redundancy in the codebase and improves evaluation performance. Refs #2045 --------- Co-authored-by: Bo Li * change frame num to 32 * change submission format * change builder file * complete the huggingface dataset building and downloading * add make_hf script * Remove redundant json files * remove redundant py files * remove redundant txt files * remove redundant file that makes hugginface dataset * remove redundant print * remove redundant tasks * add videochatgpt task * add activitynetqa * enable direct scoring for egoschema subset * add videochatgpt gpt-eval * "add some builder script files for activitynetqa as an example" * add cvrr benchmark object count dimension * reformat the files * complete cvrr video dataset * reformat the code with lint * Update .gitignore to exclude temp files * remo extra intermediate files * Remove LLaVA subproject * Delete unnecessary files and unused code * Add video_chatgpt model to lmms_eval * remove extra files and edit gitignore --------- Co-authored-by: kcz358 <92624596+kcz358@users.noreply.github.com> Co-authored-by: Bo Li Co-authored-by: Pu Fanyi Co-authored-by: Zhang Peiyuan Co-authored-by: JvThunder <44111143+JvThunder@users.noreply.github.com> Co-authored-by: XinrunDu <154438029+XinrunDu@users.noreply.github.com> Co-authored-by: ygjin11 <1633504509@qq.com> Co-authored-by: JvThunder Co-authored-by: kcz358 Co-authored-by: Bo Li --- lmms_eval/models/llava_vid.py | 3 +- ...vrr_fine_grained_action_understanding.yaml | 14 ++ ...cvrr_interpretation_of_social_context.yaml | 14 ++ ...cvrr_interpretation_of_visual_context.yaml | 14 ++ ...rr_multiple_actions_in_a_single_video.yaml | 14 ++ ...ctions_with_existent_scene_depictions.yaml | 14 ++ ...ns_with_non_existent_scene_depictions.yaml | 14 ++ .../cvrr/cvrr_object_instance_count.yaml | 2 +- .../tasks/cvrr/cvrr_partial_actions.yaml | 14 ++ .../cvrr/cvrr_time_order_understanding.yaml | 14 ++ .../cvrr_understanding_emotional_context.yaml | 14 ++ ...l_and_physically_anomalous_activities.yaml | 14 ++ lmms_eval/tasks/cvrr/utils.py | 180 ++++++++++++------ tools/make_activitynetqa.ipynb | 120 ------------ 14 files changed, 268 insertions(+), 177 deletions(-) create mode 100755 lmms_eval/tasks/cvrr/cvrr_fine_grained_action_understanding.yaml create mode 100755 lmms_eval/tasks/cvrr/cvrr_interpretation_of_social_context.yaml create mode 100755 lmms_eval/tasks/cvrr/cvrr_interpretation_of_visual_context.yaml create mode 100755 lmms_eval/tasks/cvrr/cvrr_multiple_actions_in_a_single_video.yaml create mode 100755 lmms_eval/tasks/cvrr/cvrr_non_existent_actions_with_existent_scene_depictions.yaml create mode 100755 lmms_eval/tasks/cvrr/cvrr_non_existent_actions_with_non_existent_scene_depictions.yaml create mode 100755 lmms_eval/tasks/cvrr/cvrr_partial_actions.yaml create mode 100755 lmms_eval/tasks/cvrr/cvrr_time_order_understanding.yaml create mode 100755 lmms_eval/tasks/cvrr/cvrr_understanding_emotional_context.yaml create mode 100755 lmms_eval/tasks/cvrr/cvrr_unusual_and_physically_anomalous_activities.yaml delete mode 100755 tools/make_activitynetqa.ipynb diff --git a/lmms_eval/models/llava_vid.py b/lmms_eval/models/llava_vid.py index 1da10083f..ebffb6dc6 100755 --- a/lmms_eval/models/llava_vid.py +++ b/lmms_eval/models/llava_vid.py @@ -32,6 +32,7 @@ try: from llavavid.model.language_model.llava_qwen import LlavaQwenConfig + AutoConfig.register("llava_qwen", LlavaQwenConfig) except: eval_logger.debug("No llava vid qwen yet for llavavid") @@ -346,7 +347,7 @@ def generate_until(self, requests) -> List[str]: if "max_new_tokens" not in gen_kwargs: gen_kwargs["max_new_tokens"] = 1024 if "temperature" not in gen_kwargs: - gen_kwargs["temperature"] = 0 + gen_kwargs["temperature"] = 0.2 if "top_p" not in gen_kwargs: gen_kwargs["top_p"] = None if "num_beams" not in gen_kwargs: diff --git a/lmms_eval/tasks/cvrr/cvrr_fine_grained_action_understanding.yaml b/lmms_eval/tasks/cvrr/cvrr_fine_grained_action_understanding.yaml new file mode 100755 index 000000000..a1cc069c6 --- /dev/null +++ b/lmms_eval/tasks/cvrr/cvrr_fine_grained_action_understanding.yaml @@ -0,0 +1,14 @@ +dataset_name: "fine_grained_action_understanding" +task: "cvrr_fine_grained_action_understanding" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.cvrr_doc_to_visual +doc_to_text: !function utils.cvrr_doc_to_text +doc_to_target: !function utils.cvrr_doc_to_answer +process_results: !function utils.cvrr_process_results +metric_list: + - metric: submission + aggregation: !function utils.cvrr_aggregate_results_dim2 + higher_is_better: true +include: _default_template_yaml + diff --git a/lmms_eval/tasks/cvrr/cvrr_interpretation_of_social_context.yaml b/lmms_eval/tasks/cvrr/cvrr_interpretation_of_social_context.yaml new file mode 100755 index 000000000..cf8cbe7ff --- /dev/null +++ b/lmms_eval/tasks/cvrr/cvrr_interpretation_of_social_context.yaml @@ -0,0 +1,14 @@ +dataset_name: "interpretation_of_social_context" +task: "cvrr_interpretation_of_social_context" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.cvrr_doc_to_visual +doc_to_text: !function utils.cvrr_doc_to_text +doc_to_target: !function utils.cvrr_doc_to_answer +process_results: !function utils.cvrr_process_results +metric_list: + - metric: submission + aggregation: !function utils.cvrr_aggregate_results_dim3 + higher_is_better: true +include: _default_template_yaml + diff --git a/lmms_eval/tasks/cvrr/cvrr_interpretation_of_visual_context.yaml b/lmms_eval/tasks/cvrr/cvrr_interpretation_of_visual_context.yaml new file mode 100755 index 000000000..5cc106863 --- /dev/null +++ b/lmms_eval/tasks/cvrr/cvrr_interpretation_of_visual_context.yaml @@ -0,0 +1,14 @@ +dataset_name: "interpretation_of_visual_context" +task: "cvrr_interpretation_of_visual_context" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.cvrr_doc_to_visual +doc_to_text: !function utils.cvrr_doc_to_text +doc_to_target: !function utils.cvrr_doc_to_answer +process_results: !function utils.cvrr_process_results +metric_list: + - metric: submission + aggregation: !function utils.cvrr_aggregate_results_dim4 + higher_is_better: true +include: _default_template_yaml + diff --git a/lmms_eval/tasks/cvrr/cvrr_multiple_actions_in_a_single_video.yaml b/lmms_eval/tasks/cvrr/cvrr_multiple_actions_in_a_single_video.yaml new file mode 100755 index 000000000..12f861a37 --- /dev/null +++ b/lmms_eval/tasks/cvrr/cvrr_multiple_actions_in_a_single_video.yaml @@ -0,0 +1,14 @@ +dataset_name: "multiple_actions_in_a_single_video" +task: "cvrr_multiple_actions_in_a_single_video" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.cvrr_doc_to_visual +doc_to_text: !function utils.cvrr_doc_to_text +doc_to_target: !function utils.cvrr_doc_to_answer +process_results: !function utils.cvrr_process_results +metric_list: + - metric: submission + aggregation: !function utils.cvrr_aggregate_results_dim5 + higher_is_better: true +include: _default_template_yaml + diff --git a/lmms_eval/tasks/cvrr/cvrr_non_existent_actions_with_existent_scene_depictions.yaml b/lmms_eval/tasks/cvrr/cvrr_non_existent_actions_with_existent_scene_depictions.yaml new file mode 100755 index 000000000..a2da9410f --- /dev/null +++ b/lmms_eval/tasks/cvrr/cvrr_non_existent_actions_with_existent_scene_depictions.yaml @@ -0,0 +1,14 @@ +dataset_name: "non_existent_actions_with_existent_scene_depictions" +task: "cvrr_non_existent_actions_with_existent_scene_depictions" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.cvrr_doc_to_visual +doc_to_text: !function utils.cvrr_doc_to_text +doc_to_target: !function utils.cvrr_doc_to_answer +process_results: !function utils.cvrr_process_results +metric_list: + - metric: submission + aggregation: !function utils.cvrr_aggregate_results_dim6 + higher_is_better: true +include: _default_template_yaml + diff --git a/lmms_eval/tasks/cvrr/cvrr_non_existent_actions_with_non_existent_scene_depictions.yaml b/lmms_eval/tasks/cvrr/cvrr_non_existent_actions_with_non_existent_scene_depictions.yaml new file mode 100755 index 000000000..b77dad4e0 --- /dev/null +++ b/lmms_eval/tasks/cvrr/cvrr_non_existent_actions_with_non_existent_scene_depictions.yaml @@ -0,0 +1,14 @@ +dataset_name: "non_existent_actions_with_non_existent_scene_depictions" +task: "cvrr_non_existent_actions_with_non_existent_scene_depictions" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.cvrr_doc_to_visual +doc_to_text: !function utils.cvrr_doc_to_text +doc_to_target: !function utils.cvrr_doc_to_answer +process_results: !function utils.cvrr_process_results +metric_list: + - metric: submission + aggregation: !function utils.cvrr_aggregate_results_dim7 + higher_is_better: true +include: _default_template_yaml + diff --git a/lmms_eval/tasks/cvrr/cvrr_object_instance_count.yaml b/lmms_eval/tasks/cvrr/cvrr_object_instance_count.yaml index fc85014af..d469f619c 100755 --- a/lmms_eval/tasks/cvrr/cvrr_object_instance_count.yaml +++ b/lmms_eval/tasks/cvrr/cvrr_object_instance_count.yaml @@ -8,7 +8,7 @@ doc_to_target: !function utils.cvrr_doc_to_answer process_results: !function utils.cvrr_process_results metric_list: - metric: submission - aggregation: !function utils.cvrr_aggregate_results + aggregation: !function utils.cvrr_aggregate_results_dim1 higher_is_better: true include: _default_template_yaml diff --git a/lmms_eval/tasks/cvrr/cvrr_partial_actions.yaml b/lmms_eval/tasks/cvrr/cvrr_partial_actions.yaml new file mode 100755 index 000000000..6379225ef --- /dev/null +++ b/lmms_eval/tasks/cvrr/cvrr_partial_actions.yaml @@ -0,0 +1,14 @@ +dataset_name: "partial_actions" +task: "cvrr_partial_actions" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.cvrr_doc_to_visual +doc_to_text: !function utils.cvrr_doc_to_text +doc_to_target: !function utils.cvrr_doc_to_answer +process_results: !function utils.cvrr_process_results +metric_list: + - metric: submission + aggregation: !function utils.cvrr_aggregate_results_dim8 + higher_is_better: true +include: _default_template_yaml + diff --git a/lmms_eval/tasks/cvrr/cvrr_time_order_understanding.yaml b/lmms_eval/tasks/cvrr/cvrr_time_order_understanding.yaml new file mode 100755 index 000000000..7d330fcda --- /dev/null +++ b/lmms_eval/tasks/cvrr/cvrr_time_order_understanding.yaml @@ -0,0 +1,14 @@ +dataset_name: "time_order_understanding" +task: "cvrr_time_order_understanding" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.cvrr_doc_to_visual +doc_to_text: !function utils.cvrr_doc_to_text +doc_to_target: !function utils.cvrr_doc_to_answer +process_results: !function utils.cvrr_process_results +metric_list: + - metric: submission + aggregation: !function utils.cvrr_aggregate_results_dim9 + higher_is_better: true +include: _default_template_yaml + diff --git a/lmms_eval/tasks/cvrr/cvrr_understanding_emotional_context.yaml b/lmms_eval/tasks/cvrr/cvrr_understanding_emotional_context.yaml new file mode 100755 index 000000000..f5128acb6 --- /dev/null +++ b/lmms_eval/tasks/cvrr/cvrr_understanding_emotional_context.yaml @@ -0,0 +1,14 @@ +dataset_name: "understanding_emotional_context" +task: "cvrr_understanding_emotional_context" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.cvrr_doc_to_visual +doc_to_text: !function utils.cvrr_doc_to_text +doc_to_target: !function utils.cvrr_doc_to_answer +process_results: !function utils.cvrr_process_results +metric_list: + - metric: submission + aggregation: !function utils.cvrr_aggregate_results_dim10 + higher_is_better: true +include: _default_template_yaml + diff --git a/lmms_eval/tasks/cvrr/cvrr_unusual_and_physically_anomalous_activities.yaml b/lmms_eval/tasks/cvrr/cvrr_unusual_and_physically_anomalous_activities.yaml new file mode 100755 index 000000000..92555a291 --- /dev/null +++ b/lmms_eval/tasks/cvrr/cvrr_unusual_and_physically_anomalous_activities.yaml @@ -0,0 +1,14 @@ +dataset_name: "unusual_and_physically_anomalous_activities" +task: "cvrr_unusual_and_physically_anomalous_activities" +test_split: test +output_type: generate_until +doc_to_visual: !function utils.cvrr_doc_to_visual +doc_to_text: !function utils.cvrr_doc_to_text +doc_to_target: !function utils.cvrr_doc_to_answer +process_results: !function utils.cvrr_process_results +metric_list: + - metric: submission + aggregation: !function utils.cvrr_aggregate_results_dim11 + higher_is_better: true +include: _default_template_yaml + diff --git a/lmms_eval/tasks/cvrr/utils.py b/lmms_eval/tasks/cvrr/utils.py index 0e300d4f5..01dfc54e6 100755 --- a/lmms_eval/tasks/cvrr/utils.py +++ b/lmms_eval/tasks/cvrr/utils.py @@ -41,25 +41,47 @@ "Content-Type": "application/json", } -# Unzip all the zip files to HF HOME cache dir -HF_HOME = os.environ["HF_HOME"] -cache_dir = config["dataset_kwargs"]["cache_dir"] -cache_dir = os.path.join(HF_HOME, cache_dir) -cache_dir = os.path.join(cache_dir, "CVRR-ES/continuity_and_object_instance_count") - # Pass in video path here # Can only work correctly with video llm def cvrr_doc_to_visual(doc): - video_path = doc["VideoID"] + + # Unzip all the zip files to HF HOME cache dir + HF_HOME = os.environ["HF_HOME"] + cache_dir = config["dataset_kwargs"]["cache_dir"] + cache_dir = os.path.join(HF_HOME, cache_dir) + cache_dir = os.path.join(cache_dir, "CVRR-ES") if doc["DimensionName"] == "Continuity and Object Instance Count": + cache_dir = os.path.join(cache_dir, "continuity_and_object_instance_count") + elif doc["DimensionName"] == "Fine-grained action understanding": + cache_dir = os.path.join(cache_dir, "fine_grained_action_understanding") + elif doc["DimensionName"] == "Interpretation of social context": + cache_dir = os.path.join(cache_dir, "interpretation_of_social_context") + elif doc["DimensionName"] == "Interpretation of visual context": + cache_dir = os.path.join(cache_dir, "interpretation_of_visual_context") + elif doc["DimensionName"] == "Multiple actions in a single video": + cache_dir = os.path.join(cache_dir, "multiple_actions_in_a_single_video") + elif doc["DimensionName"] == "Non-existent actions with existent scene depictions": + cache_dir = os.path.join(cache_dir, "non_existent_actions_with_existent_scene_depictions") + elif doc["DimensionName"] == "Non-existent actions with non-existent scene depictions": + cache_dir = os.path.join(cache_dir, "non_existent_actions_with_non_existent_scene_depictions") + elif doc["DimensionName"] == "Partial actions": + cache_dir = os.path.join(cache_dir, "partial_actions") + elif doc["DimensionName"] == "Time order understanding": + cache_dir = os.path.join(cache_dir, "time_order_understanding") + elif doc["DimensionName"] == "Understanding of emotional context": + cache_dir = os.path.join(cache_dir, "understanding_emotional_context") + elif doc["DimensionName"] == "Unusual and Physically Anomalous activities": + cache_dir = os.path.join(cache_dir, "unusual_and_physically_anomalous_activities") + + video_path = doc["VideoID"] + video_path = os.path.join(cache_dir, video_path) + if os.path.exists(video_path): + video_path = video_path + else: + sys.exit(f"video path:{video_path} does not exist, please check") - video_path = os.path.join(cache_dir, video_path) - if os.path.exists(video_path): - video_path = video_path - else: - sys.exit(f"video path:{video_path} does not exist, please check") return [video_path] @@ -109,34 +131,31 @@ def cvrr_aggregate_submissions(results, args, task): return path -def get_eval(question, answer, pred, task, max_tokens: int, retries: int = 5): +def get_eval(question, answer, pred, max_tokens: int, retries: int = 5): global headers - if task == "continuity_and_object_instance_count": - messages = [ - { - "role": "system", - "content": "You are an intelligent chatbot designed for evaluating the correctness of AI assistant predictions for question-answer pairs. " - "Your task is to compare the predicted answer with the ground-truth answer and determine if the predicted answer is correct or not. Here's how you can accomplish the task:" - "------" - "##INSTRUCTIONS: " - "- Focus on the correctness and accuracy of the predicted answer with the ground-truth.\n" - "- Consider predictions with less specific details as correct evaluation, unless such details are explicitly asked in the question.\n", - }, - { - "role": "user", - "content": "Please evaluate the following video-based question-answer pair:\n\n" - f"Question: {question}\n" - f"Ground truth correct Answer: {answer}\n" - f"Predicted Answer: {pred}\n\n" - "Provide your evaluation as a correct/incorrect prediction along with the score where the score is an integer value between 0 (fully wrong) and 5 (fully correct). The middle score provides the percentage of correctness." - "Please generate the response in the form of a Python dictionary string with keys 'pred', 'score' and 'reason', where value of 'pred' is a string of 'correct' or 'incorrect', value of 'score' is in INTEGER, not STRING and value of 'reason' should provide the reason behind the decision." - "Only provide the Python dictionary string." - "For example, your response should look like this: {'pred': 'correct', 'score': 4.8, 'reason': reason}.", - }, - ] - - print(messages) + messages = [ + { + "role": "system", + "content": "You are an intelligent chatbot designed for evaluating the correctness of AI assistant predictions for question-answer pairs. " + "Your task is to compare the predicted answer with the ground-truth answer and determine if the predicted answer is correct or not. Here's how you can accomplish the task:" + "------" + "##INSTRUCTIONS: " + "- Focus on the correctness and accuracy of the predicted answer with the ground-truth.\n" + "- Consider predictions with less specific details as correct evaluation, unless such details are explicitly asked in the question.\n", + }, + { + "role": "user", + "content": "Please evaluate the following video-based question-answer pair:\n\n" + f"Question: {question}\n" + f"Ground truth correct Answer: {answer}\n" + f"Predicted Answer: {pred}\n\n" + "Provide your evaluation as a correct/incorrect prediction along with the score where the score is an integer value between 0 (fully wrong) and 5 (fully correct). The middle score provides the percentage of correctness." + "Please generate the response in the form of a Python dictionary string with keys 'pred', 'score' and 'reason', where value of 'pred' is a string of 'correct' or 'incorrect', value of 'score' is in INTEGER, not STRING and value of 'reason' should provide the reason behind the decision." + "Only provide the Python dictionary string." + 'For example, your response should look like this: {"pred": "correct", "score": 4.8, "reason": reason}.', + }, + ] payload = { "model": GPT_EVAL_MODEL_NAME, @@ -179,6 +198,7 @@ def get_eval(question, answer, pred, task, max_tokens: int, retries: int = 5): def parse_score(review): try: # Convert the string representation of a dictionary to an actual dictionary + # Escape single quotes inside the dictionary string to prevent parsing errors review_dict = ast.literal_eval(review) correctness = review_dict.get("pred", "incorrect") score = review_dict.get("score", 0) @@ -203,38 +223,28 @@ def cvrr_print_scores(eval_file_path, args): score_file_name = "scores.json" path = file_utils.generate_submission_file(score_file_name, args) - # Compute average score and final accuracy - # Initialize counters - yes_count = 0 - no_count = 0 + # Compute average score total_score = 0 - # Iterate over the results to count correctness and sum scores + # Iterate over the results to sum scores for result_list in evaluated_list: eval_dict = result_list[0] total_score += eval_dict["score"] - if eval_dict["Correctness"] == "yes": - yes_count += 1 - else: - no_count += 1 - # Calculate accuracy and average score - accuracy = yes_count / (yes_count + no_count) if (yes_count + no_count) > 0 else 0 average_score = total_score / len(evaluated_list) if evaluated_list else 0 # Print the results - print(f"Accuracy: {accuracy}") print(f"Average Score: {average_score}") # Write the processed data to the scores file with open(path, "w") as f: - json.dump({"accuracy": accuracy, "average_score": average_score}, f, indent=4) + json.dump({"average_score": average_score}, f, indent=4) eval_logger.info(f"Score file saved to {path}") -def cvrr_gpt_eval(result_file_path, args, task): +def cvrr_gpt_eval(result_file_path, args): """ Process the result file containing predictions, score them using GPT, and save the results with added scores and correctness fields to a new file. @@ -264,7 +274,7 @@ def cvrr_gpt_eval(result_file_path, args, task): pred = data_dict.get("pred", "") # Assume get_eval returns a review and the model name, and parse_score parses this review - review, model_name = get_eval(question, answer, pred, task, 64) + review, model_name = get_eval(question, answer, pred, 512) correctness, score, reason = parse_score(review) except Exception as e: eval_logger.error(f"Error for Video Name: {data_dict.get('VideoID', 'Unknown')}: {e}") @@ -295,7 +305,67 @@ def cvrr_gpt_eval(result_file_path, args, task): return eval_file_path -def cvrr_aggregate_results(results, args): +def cvrr_aggregate_results_dim1(results, args): result_file_path = cvrr_aggregate_submissions(results, args, "continuity_and_object_instance_count") - eval_file_path = cvrr_gpt_eval(result_file_path, args, "continuity_and_object_instance_count") + eval_file_path = cvrr_gpt_eval(result_file_path, args) + cvrr_print_scores(eval_file_path, args) + + +def cvrr_aggregate_results_dim2(results, args): + result_file_path = cvrr_aggregate_submissions(results, args, "fine_grained_action_understanding") + eval_file_path = cvrr_gpt_eval(result_file_path, args) + cvrr_print_scores(eval_file_path, args) + + +def cvrr_aggregate_results_dim3(results, args): + result_file_path = cvrr_aggregate_submissions(results, args, "interpretation_of_social_context") + eval_file_path = cvrr_gpt_eval(result_file_path, args) + cvrr_print_scores(eval_file_path, args) + + +def cvrr_aggregate_results_dim4(results, args): + result_file_path = cvrr_aggregate_submissions(results, args, "interpretation_of_visual_context") + eval_file_path = cvrr_gpt_eval(result_file_path, args) + cvrr_print_scores(eval_file_path, args) + + +def cvrr_aggregate_results_dim5(results, args): + result_file_path = cvrr_aggregate_submissions(results, args, "multiple_actions_in_a_single_video") + eval_file_path = cvrr_gpt_eval(result_file_path, args) + cvrr_print_scores(eval_file_path, args) + + +def cvrr_aggregate_results_dim6(results, args): + result_file_path = cvrr_aggregate_submissions(results, args, "non_existent_actions_with_existent_scene_depictions") + eval_file_path = cvrr_gpt_eval(result_file_path, args) + cvrr_print_scores(eval_file_path, args) + + +def cvrr_aggregate_results_dim7(results, args): + result_file_path = cvrr_aggregate_submissions(results, args, "non_existent_actions_with_non_existent_scene_depictions") + eval_file_path = cvrr_gpt_eval(result_file_path, args) + cvrr_print_scores(eval_file_path, args) + + +def cvrr_aggregate_results_dim8(results, args): + result_file_path = cvrr_aggregate_submissions(results, args, "partial_actions") + eval_file_path = cvrr_gpt_eval(result_file_path, args) + cvrr_print_scores(eval_file_path, args) + + +def cvrr_aggregate_results_dim9(results, args): + result_file_path = cvrr_aggregate_submissions(results, args, "time_order_understanding") + eval_file_path = cvrr_gpt_eval(result_file_path, args) + cvrr_print_scores(eval_file_path, args) + + +def cvrr_aggregate_results_dim10(results, args): + result_file_path = cvrr_aggregate_submissions(results, args, "understanding_emotional_context") + eval_file_path = cvrr_gpt_eval(result_file_path, args) + cvrr_print_scores(eval_file_path, args) + + +def cvrr_aggregate_results_dim11(results, args): + result_file_path = cvrr_aggregate_submissions(results, args, "unusual_and_physically_anomalous_activities") + eval_file_path = cvrr_gpt_eval(result_file_path, args) cvrr_print_scores(eval_file_path, args) diff --git a/tools/make_activitynetqa.ipynb b/tools/make_activitynetqa.ipynb deleted file mode 100755 index efbef00e2..000000000 --- a/tools/make_activitynetqa.ipynb +++ /dev/null @@ -1,120 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# This notebook will guide you to make correct format of Huggingface dataset, in proper parquet format and visualizable in Huggingface dataset hub.\n", - "# We will take the example of the dataset \"Otter-AI/MMVet\" and convert it to the proper format." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from datasets import load_dataset\n", - "\n", - "data_path = \"Otter-AI/MMVet\"\n", - "df = load_dataset(data_path, split=\"test\").to_pandas()\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from datasets import Dataset, Features, Value, Image\n", - "import pandas as pd\n", - "\n", - "# Define the features for the dataset\n", - "features = Features(\n", - " {\n", - " \"question_id\": Value(dtype=\"string\"),\n", - " \"image\": Image(),\n", - " \"question\": Value(dtype=\"string\"),\n", - " \"answer\": Value(dtype=\"string\"),\n", - " \"image_source\": Value(dtype=\"string\"),\n", - " \"capability\": Value(dtype=\"string\"),\n", - " # Add other fields as necessary\n", - " }\n", - ")\n", - "\n", - "df_items = {\n", - " \"question_id\": [],\n", - " \"image\": [],\n", - " \"question\": [],\n", - " \"answer\": [],\n", - " \"image_source\": [],\n", - " \"capability\": [],\n", - "}\n", - "\n", - "for idx, row in df.iterrows():\n", - " df_items[\"question_id\"].append(str(row[\"id\"]))\n", - " image = {\"bytes\": row[\"images\"][0][\"bytes\"], \"path\": \"\"}\n", - " df_items[\"image\"].append(image)\n", - " df_items[\"question\"].append(str(row[\"instruction\"]))\n", - " df_items[\"answer\"].append(str(row[\"answer\"]))\n", - " df_items[\"image_source\"].append(str(row[\"image_source\"]))\n", - " df_items[\"capability\"].append(\",\".join(list(row[\"capability\"])))\n", - " # Add other fields as necessary\n", - "\n", - "df_items = pd.DataFrame(df_items)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df_items.head()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dataset = Dataset.from_pandas(df_items, features=features)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "hub_dataset_path = \"lmms-lab/MMVet\"\n", - "dataset.push_to_hub(repo_id=hub_dataset_path, split=\"test\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "lmms-eval", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.18" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 965cc5bf5979860efbe2d1a4680615032a653be8 Mon Sep 17 00:00:00 2001 From: Fanyi Pu Date: Sun, 26 May 2024 18:57:16 +0800 Subject: [PATCH 077/181] dont cache failed content --- lmms_eval/models/gemini_api.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index 455db085d..dc31bb6e9 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -131,9 +131,10 @@ def generate_until(self, requests) -> List[str]: if doc_id in self.response_cache: doc_uuid = str(doc_id) content = self.response_cache[doc_uuid] - res.append(content) - pbar.update(1) - continue + if content: + res.append(content) + pbar.update(1) + continue for attempt in range(5): try: From e1856401e3ff6ef68017c4b3d07b31c33df44ec7 Mon Sep 17 00:00:00 2001 From: Fanyi Pu Date: Sun, 26 May 2024 20:28:49 +0800 Subject: [PATCH 078/181] Fix content generation in GeminiAPI --- lmms_eval/models/gemini_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index dc31bb6e9..5833aa8c0 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -140,7 +140,7 @@ def generate_until(self, requests) -> List[str]: try: content = self.model.generate_content(message, generation_config=config) content = content.text - + break except Exception as e: eval_logger.info(f"Attempt {attempt + 1} failed with error: {str(e)}") if attempt < 5 - 1: # If we have retries left, sleep and then continue to next attempt From a9cc36f73f72ef65b97bf97727d1189b77768909 Mon Sep 17 00:00:00 2001 From: Fanyi Pu Date: Sun, 26 May 2024 20:39:31 +0800 Subject: [PATCH 079/181] safty settings --- lmms_eval/models/gemini_api.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index 5833aa8c0..003a2bf7e 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -11,6 +11,7 @@ from lmms_eval.api.model import lmms from lmms_eval.api.instance import Instance from accelerate import Accelerator, DistributedType +from google.generativeai.types import HarmBlockThreshold eval_logger = logging.getLogger("lmms-eval") @@ -138,11 +139,18 @@ def generate_until(self, requests) -> List[str]: for attempt in range(5): try: - content = self.model.generate_content(message, generation_config=config) + content = self.model.generate_content(message, generation_config=config, safety_settings=HarmBlockThreshold.BLOCK_NONE) content = content.text break except Exception as e: eval_logger.info(f"Attempt {attempt + 1} failed with error: {str(e)}") + if isinstance(e, ValueError): + try: + eval_logger.info(f"Prompt feed_back: {content.prompt_feedback}") + eval_logger.info(f"finish reason: {content.candidates[0].finish_reason}") + eval_logger.info(f"safety ratings: {content.candidates[0].safety_ratings}") + except Exception as e: + pass if attempt < 5 - 1: # If we have retries left, sleep and then continue to next attempt time.sleep(NUM_SECONDS_TO_SLEEP) else: # If this was the last attempt, log and return empty From ce67461722b996e170f8444e9458e8c08424ae93 Mon Sep 17 00:00:00 2001 From: Fanyi Pu Date: Sun, 26 May 2024 20:45:09 +0800 Subject: [PATCH 080/181] Fix HarmBlockThreshold import in GeminiAPI --- lmms_eval/models/gemini_api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index 003a2bf7e..ff3a96db9 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -11,7 +11,7 @@ from lmms_eval.api.model import lmms from lmms_eval.api.instance import Instance from accelerate import Accelerator, DistributedType -from google.generativeai.types import HarmBlockThreshold +from google.generativeai.types import HarmCategory, HarmBlockThreshold eval_logger = logging.getLogger("lmms-eval") @@ -139,7 +139,7 @@ def generate_until(self, requests) -> List[str]: for attempt in range(5): try: - content = self.model.generate_content(message, generation_config=config, safety_settings=HarmBlockThreshold.BLOCK_NONE) + content = self.model.generate_content(message, generation_config=config, safety_settings={HarmCategory.HARM_CATEGORY_UNSPECIFIED: HarmBlockThreshold.BLOCK_NONE}) content = content.text break except Exception as e: From bb09ad47da748fe1dababea0feb5c30238ce6096 Mon Sep 17 00:00:00 2001 From: Fanyi Pu Date: Sun, 26 May 2024 20:51:04 +0800 Subject: [PATCH 081/181] Fix harmful content generation and update logging configuration --- lmms_eval/api/task.py | 3 ++- lmms_eval/models/gemini_api.py | 2 +- lmms_eval/tasks/olympiadbench/olympiadbench_evals.py | 1 + lmms_eval/tasks/synthdog/donut_evaluator.py | 1 + 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index b31e4b348..30d35a73f 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -691,8 +691,9 @@ def download(self, dataset_kwargs=None) -> None: cache_path = snapshot_download(repo_id=self.DATASET_PATH, repo_type="dataset") zip_files = glob(os.path.join(cache_path, "**/*.zip"), recursive=True) - + from accelerate import Accelerator + accelerator = Accelerator() if not os.path.exists(cache_dir) and len(zip_files) > 0 and accelerator.is_main_process: for zip_file in zip_files: diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index ff3a96db9..6a1576b19 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -139,7 +139,7 @@ def generate_until(self, requests) -> List[str]: for attempt in range(5): try: - content = self.model.generate_content(message, generation_config=config, safety_settings={HarmCategory.HARM_CATEGORY_UNSPECIFIED: HarmBlockThreshold.BLOCK_NONE}) + content = self.model.generate_content(message, generation_config=config, safety_settings={HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_NONE}) content = content.text break except Exception as e: diff --git a/lmms_eval/tasks/olympiadbench/olympiadbench_evals.py b/lmms_eval/tasks/olympiadbench/olympiadbench_evals.py index ffecfa4e3..fbda732c9 100644 --- a/lmms_eval/tasks/olympiadbench/olympiadbench_evals.py +++ b/lmms_eval/tasks/olympiadbench/olympiadbench_evals.py @@ -2,6 +2,7 @@ import sympy as sp import logging + eval_logger = logging.getLogger("lmms-eval") try: diff --git a/lmms_eval/tasks/synthdog/donut_evaluator.py b/lmms_eval/tasks/synthdog/donut_evaluator.py index 91f2bbaab..dd9b022f1 100644 --- a/lmms_eval/tasks/synthdog/donut_evaluator.py +++ b/lmms_eval/tasks/synthdog/donut_evaluator.py @@ -12,6 +12,7 @@ import logging + eval_logger = logging.getLogger("lmms-eval") try: From 15de067b41947129782ad5debd2b04945a6d1641 Mon Sep 17 00:00:00 2001 From: Fanyi Pu Date: Sun, 26 May 2024 20:53:39 +0800 Subject: [PATCH 082/181] fix bug in continous mode --- lmms_eval/models/gemini_api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index 6a1576b19..4617b17de 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -129,8 +129,8 @@ def generate_until(self, requests) -> List[str]: message = [contexts] + visuals if self.continual_mode is True and self.cache_mode == "resume": - if doc_id in self.response_cache: - doc_uuid = str(doc_id) + doc_uuid = str(doc_id) + if doc_uuid in self.response_cache: content = self.response_cache[doc_uuid] if content: res.append(content) From 2ec645d2bc1eb38966d2473aa4caf47ec1d3aa5c Mon Sep 17 00:00:00 2001 From: Fanyi Pu Date: Sun, 26 May 2024 20:59:10 +0800 Subject: [PATCH 083/181] Refactor GeminiAPI class to improve cache handling --- lmms_eval/models/gemini_api.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index 4617b17de..c41e6f033 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -112,6 +112,15 @@ def generate_until(self, requests) -> List[str]: pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + if self.continual_mode is True and self.cache_mode == "resume": + doc_uuid = str(doc_id) + if doc_uuid in self.response_cache: + content = self.response_cache[doc_uuid] + if content: + res.append(content) + pbar.update(1) + continue + if "max_new_tokens" not in gen_kwargs: gen_kwargs["max_new_tokens"] = 1024 if "temperature" not in gen_kwargs: @@ -128,15 +137,6 @@ def generate_until(self, requests) -> List[str]: message = [contexts] + visuals - if self.continual_mode is True and self.cache_mode == "resume": - doc_uuid = str(doc_id) - if doc_uuid in self.response_cache: - content = self.response_cache[doc_uuid] - if content: - res.append(content) - pbar.update(1) - continue - for attempt in range(5): try: content = self.model.generate_content(message, generation_config=config, safety_settings={HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_NONE}) From a474f2219e7ba5cbc5c194cb7b2413e39422f364 Mon Sep 17 00:00:00 2001 From: Fanyi Pu Date: Sun, 26 May 2024 21:02:03 +0800 Subject: [PATCH 084/181] Fix issue with clearing content variable in GeminiAPI class --- lmms_eval/models/gemini_api.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index c41e6f033..1ac1756bb 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -149,6 +149,8 @@ def generate_until(self, requests) -> List[str]: eval_logger.info(f"Prompt feed_back: {content.prompt_feedback}") eval_logger.info(f"finish reason: {content.candidates[0].finish_reason}") eval_logger.info(f"safety ratings: {content.candidates[0].safety_ratings}") + content = "" + break except Exception as e: pass if attempt < 5 - 1: # If we have retries left, sleep and then continue to next attempt From 99518f4b560cbed2ca7de8309b4d35b6f62143cc Mon Sep 17 00:00:00 2001 From: Fanyi Pu Date: Sun, 26 May 2024 21:07:27 +0800 Subject: [PATCH 085/181] Refactor exception handling in GeminiAPI class --- lmms_eval/models/gemini_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index 1ac1756bb..645073817 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -151,7 +151,7 @@ def generate_until(self, requests) -> List[str]: eval_logger.info(f"safety ratings: {content.candidates[0].safety_ratings}") content = "" break - except Exception as e: + except Exception: pass if attempt < 5 - 1: # If we have retries left, sleep and then continue to next attempt time.sleep(NUM_SECONDS_TO_SLEEP) From bd908ef144f0eb3ded23ef22e958c7553c4a0e71 Mon Sep 17 00:00:00 2001 From: Fanyi Pu Date: Mon, 27 May 2024 10:49:05 +0800 Subject: [PATCH 086/181] Update safety settings in GeminiAPI.generate_content() method --- lmms_eval/models/gemini_api.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index 645073817..9a6f8cd06 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -139,7 +139,16 @@ def generate_until(self, requests) -> List[str]: for attempt in range(5): try: - content = self.model.generate_content(message, generation_config=config, safety_settings={HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_NONE}) + content = self.model.generate_content( + message, + generation_config=config, + safety_settings={ + HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_NONE, + HarmCategory.HARM_CATEGORY_HATE_SPEECH: HarmBlockThreshold.BLOCK_NONE, + HarmCategory.HARM_CATEGORY_HARASSMENT: HarmBlockThreshold.BLOCK_NONE, + HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_NONE, + }, + ) content = content.text break except Exception as e: From b2d5df18c6368862e4d694a15b17328fd0fd5f26 Mon Sep 17 00:00:00 2001 From: Fanyi Pu Date: Mon, 27 May 2024 11:17:42 +0800 Subject: [PATCH 087/181] optimize query in gemini --- lmms_eval/models/gemini_api.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index 9a6f8cd06..4a41535b8 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -156,8 +156,6 @@ def generate_until(self, requests) -> List[str]: if isinstance(e, ValueError): try: eval_logger.info(f"Prompt feed_back: {content.prompt_feedback}") - eval_logger.info(f"finish reason: {content.candidates[0].finish_reason}") - eval_logger.info(f"safety ratings: {content.candidates[0].safety_ratings}") content = "" break except Exception: From 128a76e2b82d2b4140706865d2be29ced740a71f Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 27 May 2024 06:01:32 +0000 Subject: [PATCH 088/181] Add load video in model_utils --- lmms_eval/models/model_utils/load_video.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 lmms_eval/models/model_utils/load_video.py diff --git a/lmms_eval/models/model_utils/load_video.py b/lmms_eval/models/model_utils/load_video.py new file mode 100644 index 000000000..9c0cd7f3e --- /dev/null +++ b/lmms_eval/models/model_utils/load_video.py @@ -0,0 +1,20 @@ +import av +import numpy as np + +def read_video_pyav(video_path, num_frm=8): + frames = [] + container = av.open(video_path) + + # sample uniformly 8 frames from the video + total_frames = container.streams.video[0].frames + num_frm = min(total_frames, num_frm) + indices = np.arange(0, total_frames, total_frames / num_frm).astype(int) + container.seek(0) + start_index = indices[0] + end_index = indices[-1] + for i, frame in enumerate(container.decode(video=0)): + if i > end_index: + break + if i >= start_index and i in indices: + frames.append(frame) + return np.stack([x.to_ndarray(format="rgb24") for x in frames]) \ No newline at end of file From fa326689422fd065c7a81a004f85b46c7f9c880b Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 27 May 2024 06:01:04 +0000 Subject: [PATCH 089/181] Change load video to pyav in videoChatGPT --- lmms_eval/models/videoChatGPT.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/lmms_eval/models/videoChatGPT.py b/lmms_eval/models/videoChatGPT.py index 94f618039..a860970b5 100644 --- a/lmms_eval/models/videoChatGPT.py +++ b/lmms_eval/models/videoChatGPT.py @@ -8,6 +8,7 @@ from accelerate.state import AcceleratorState from huggingface_hub import snapshot_download import torch +from PIL import Image from datetime import timedelta import logging @@ -15,12 +16,13 @@ from tqdm import tqdm try: - from video_chatgpt.eval.model_utils import load_video, initialize_model - from video_chatgpt.inference import video_chatgpt_infer, video_chatgpt_infer_ppl, get_spatio_temporal_features_torch + from lmms_eval.models.video_chatgpt.eval.model_utils import load_video, initialize_model + from lmms_eval.models.video_chatgpt.inference import video_chatgpt_infer, video_chatgpt_infer_ppl, get_spatio_temporal_features_torch except ImportError: eval_logger = logging.getLogger("lmms-eval") eval_logger.info("Failed to import video_chatgpt modules") +from lmms_eval.models.model_utils.load_video import read_video_pyav eval_logger = logging.getLogger("lmms-eval") @@ -103,12 +105,21 @@ def generate_until(self, requests) -> List[str]: # encode, pad, and truncate contexts for this batch visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] visuals = self.flatten(visuals) - videos = [] + # videos = [] for visual in visuals: - video_frames = load_video(visual, num_frm=self.num_frm) + video_frames = read_video_pyav(visual, num_frm=self.num_frm) + target_h, target_w = 224, 224 + # If image shape is not as target, resize it + if video_frames.shape[-3] != target_h or video_frames.shape[-2] != target_w: + video_frames = torch.from_numpy(video_frames).permute(0, 3, 1, 2).float() + video_frames = torch.nn.functional.interpolate(video_frames, size=(target_h, target_w)) + video_frames = video_frames.permute(0, 2, 3, 1).to(torch.uint8).numpy() + video_frames = [Image.fromarray(frame) for frame in video_frames] + if len(video_frames) > self.num_frm: + video_frames = video_frames[: self.num_frm] # VideoChatGPT load video return a list of PIL Image - videos += video_frames - + # videos += video_frames + output = video_chatgpt_infer( video_frames, contexts, conv_mode="video-chatgpt_v1", model=self.model, vision_tower=self.vision_tower, tokenizer=self.tokenizer, image_processor=self.image_processor, video_token_len=self.video_token_len ) From 80fbf66f093eda8ab96b42a6978554650e714829 Mon Sep 17 00:00:00 2001 From: Hukairui <71913595+KairuiHu@users.noreply.github.com> Date: Mon, 27 May 2024 15:24:55 +0800 Subject: [PATCH 090/181] Fix the bug of file overwrite when running multiple video datasets (#99) * Resolve conflict when merge the kr_ego with internal_main_dev * fix the bug of file overwrite --- .../activitynetqa_generation.yaml | 2 - lmms_eval/tasks/activitynetqa/utils.py | 17 +++-- lmms_eval/tasks/cvrr/utils.py | 70 +++++++++++-------- .../_default_template_yaml | 2 +- .../tasks/video_detail_description/utils.py | 44 ++++++++++-- lmms_eval/tasks/videochatgpt/utils.py | 37 +++++----- lmms_eval/utils.py | 9 ++- 7 files changed, 119 insertions(+), 62 deletions(-) diff --git a/lmms_eval/tasks/activitynetqa/activitynetqa_generation.yaml b/lmms_eval/tasks/activitynetqa/activitynetqa_generation.yaml index e6c167e5f..f6092ff40 100755 --- a/lmms_eval/tasks/activitynetqa/activitynetqa_generation.yaml +++ b/lmms_eval/tasks/activitynetqa/activitynetqa_generation.yaml @@ -10,8 +10,6 @@ metric_list: - metric: submission aggregation: !function utils.activitynetqa_aggregate higher_is_better: true - - metric: exact_match - higher_is_better: true include: _default_template_yaml generation_kwargs: diff --git a/lmms_eval/tasks/activitynetqa/utils.py b/lmms_eval/tasks/activitynetqa/utils.py index b06be6bbd..d06c7060e 100755 --- a/lmms_eval/tasks/activitynetqa/utils.py +++ b/lmms_eval/tasks/activitynetqa/utils.py @@ -204,9 +204,9 @@ def activitynetqa_process_results(doc, result): return data_dict -def activitynetqa_aggregate_submissions(results, args, task): +def activitynetqa_aggregate_submissions(results, args): now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - submission_file_name = f"activitynetqa-{task}-{now_date_time}.json" + submission_file_name = f"activitynetqa_{now_date_time}.json" path = file_utils.generate_submission_file(submission_file_name, args) with open(path, "w") as f: @@ -222,7 +222,8 @@ def activitynetqa_print_scores(eval_file_path, args): with open(eval_file_path, "r") as file: evaluated_list = json.load(file) - score_file_name = "scores.json" + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + score_file_name = f"scores_activitynetqa_{now_date_time}.json" path = file_utils.generate_submission_file(score_file_name, args) # Compute average score and final accuracy @@ -253,6 +254,8 @@ def activitynetqa_print_scores(eval_file_path, args): eval_logger.info(f"Score file saved to {path}") + return accuracy, average_score + # we process answer and gpt_eval seperately, in case gpt is not stable # so we obtained a submission file for answer first @@ -269,7 +272,8 @@ def activitynetqa_gpt_eval(result_file_path, args): eval_file_path: path to save the JSON file with evaluated results """ - eval_file_name = "gpt_eval_result.json" + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + eval_file_name = f"gpt_eval_result_activitynetqa_{now_date_time}.json" eval_file_path = file_utils.generate_submission_file(eval_file_name, args) # Load the predictions from the result file @@ -307,6 +311,7 @@ def activitynetqa_gpt_eval(result_file_path, args): # Factory into different aggregate def activitynetqa_aggregate(results, args): - result_file_path = activitynetqa_aggregate_submissions(results, args, "Generation") + result_file_path = activitynetqa_aggregate_submissions(results, args) eval_file_path = activitynetqa_gpt_eval(result_file_path, args) - activitynetqa_print_scores(eval_file_path, args) + accuracy, average_score = activitynetqa_print_scores(eval_file_path, args) + return "acc: " + str(accuracy) + " score: " + str(average_score) diff --git a/lmms_eval/tasks/cvrr/utils.py b/lmms_eval/tasks/cvrr/utils.py index 01dfc54e6..e0558cad1 100755 --- a/lmms_eval/tasks/cvrr/utils.py +++ b/lmms_eval/tasks/cvrr/utils.py @@ -215,12 +215,13 @@ def parse_score(review): return "incorrect", float(0), "" -def cvrr_print_scores(eval_file_path, args): +def cvrr_print_scores(eval_file_path, args, task): # Load the predictions from the result file with open(eval_file_path, "r") as file: evaluated_list = json.load(file) - score_file_name = "scores.json" + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + score_file_name = f"gpt_eval_result_cvrr_{task}_{now_date_time}.json" path = file_utils.generate_submission_file(score_file_name, args) # Compute average score @@ -234,17 +235,16 @@ def cvrr_print_scores(eval_file_path, args): # Calculate accuracy and average score average_score = total_score / len(evaluated_list) if evaluated_list else 0 - # Print the results - print(f"Average Score: {average_score}") - # Write the processed data to the scores file with open(path, "w") as f: json.dump({"average_score": average_score}, f, indent=4) eval_logger.info(f"Score file saved to {path}") + return average_score -def cvrr_gpt_eval(result_file_path, args): + +def cvrr_gpt_eval(result_file_path, args, task): """ Process the result file containing predictions, score them using GPT, and save the results with added scores and correctness fields to a new file. @@ -253,7 +253,8 @@ def cvrr_gpt_eval(result_file_path, args): result_file_path: path to the JSON file with results to be evaluated """ - eval_file_name = "gpt_eval_result.json" + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + eval_file_name = f"gpt_eval_result_cvrr_{task}_{now_date_time}.json" eval_file_path = file_utils.generate_submission_file(eval_file_name, args) # Load the predictions from the result file @@ -307,65 +308,76 @@ def cvrr_gpt_eval(result_file_path, args): def cvrr_aggregate_results_dim1(results, args): result_file_path = cvrr_aggregate_submissions(results, args, "continuity_and_object_instance_count") - eval_file_path = cvrr_gpt_eval(result_file_path, args) - cvrr_print_scores(eval_file_path, args) + eval_file_path = cvrr_gpt_eval(result_file_path, args, "continuity_and_object_instance_count") + average_score = cvrr_print_scores(eval_file_path, args, "continuity_and_object_instance_count") + return average_score def cvrr_aggregate_results_dim2(results, args): result_file_path = cvrr_aggregate_submissions(results, args, "fine_grained_action_understanding") - eval_file_path = cvrr_gpt_eval(result_file_path, args) - cvrr_print_scores(eval_file_path, args) + eval_file_path = cvrr_gpt_eval(result_file_path, args, "fine_grained_action_understanding") + average_score = cvrr_print_scores(eval_file_path, args, "fine_grained_action_understanding") + return average_score def cvrr_aggregate_results_dim3(results, args): result_file_path = cvrr_aggregate_submissions(results, args, "interpretation_of_social_context") - eval_file_path = cvrr_gpt_eval(result_file_path, args) - cvrr_print_scores(eval_file_path, args) + eval_file_path = cvrr_gpt_eval(result_file_path, args, "interpretation_of_social_context") + average_score = cvrr_print_scores(eval_file_path, args, "interpretation_of_social_context") + return average_score def cvrr_aggregate_results_dim4(results, args): result_file_path = cvrr_aggregate_submissions(results, args, "interpretation_of_visual_context") - eval_file_path = cvrr_gpt_eval(result_file_path, args) - cvrr_print_scores(eval_file_path, args) + eval_file_path = cvrr_gpt_eval(result_file_path, args, "interpretation_of_visual_context") + average_score = cvrr_print_scores(eval_file_path, args, "interpretation_of_visual_context") + return average_score def cvrr_aggregate_results_dim5(results, args): result_file_path = cvrr_aggregate_submissions(results, args, "multiple_actions_in_a_single_video") - eval_file_path = cvrr_gpt_eval(result_file_path, args) - cvrr_print_scores(eval_file_path, args) + eval_file_path = cvrr_gpt_eval(result_file_path, args, "multiple_actions_in_a_single_video") + average_score = cvrr_print_scores(eval_file_path, args, "multiple_actions_in_a_single_video") + return average_score def cvrr_aggregate_results_dim6(results, args): result_file_path = cvrr_aggregate_submissions(results, args, "non_existent_actions_with_existent_scene_depictions") - eval_file_path = cvrr_gpt_eval(result_file_path, args) - cvrr_print_scores(eval_file_path, args) + eval_file_path = cvrr_gpt_eval(result_file_path, args, "non_existent_actions_with_existent_scene_depictions") + average_score = cvrr_print_scores(eval_file_path, args, "non_existent_actions_with_existent_scene_depictions") + return average_score def cvrr_aggregate_results_dim7(results, args): result_file_path = cvrr_aggregate_submissions(results, args, "non_existent_actions_with_non_existent_scene_depictions") - eval_file_path = cvrr_gpt_eval(result_file_path, args) - cvrr_print_scores(eval_file_path, args) + eval_file_path = cvrr_gpt_eval(result_file_path, args, "non_existent_actions_with_non_existent_scene_depictions") + average_score = cvrr_print_scores(eval_file_path, args, "non_existent_actions_with_non_existent_scene_depictions") + return average_score def cvrr_aggregate_results_dim8(results, args): result_file_path = cvrr_aggregate_submissions(results, args, "partial_actions") - eval_file_path = cvrr_gpt_eval(result_file_path, args) - cvrr_print_scores(eval_file_path, args) + eval_file_path = cvrr_gpt_eval(result_file_path, args, "partial_actions") + average_score = cvrr_print_scores(eval_file_path, args, "partial_actions") + return average_score def cvrr_aggregate_results_dim9(results, args): result_file_path = cvrr_aggregate_submissions(results, args, "time_order_understanding") - eval_file_path = cvrr_gpt_eval(result_file_path, args) - cvrr_print_scores(eval_file_path, args) + eval_file_path = cvrr_gpt_eval(result_file_path, args, "time_order_understanding") + average_score = cvrr_print_scores(eval_file_path, args, "time_order_understanding") + return average_score def cvrr_aggregate_results_dim10(results, args): result_file_path = cvrr_aggregate_submissions(results, args, "understanding_emotional_context") - eval_file_path = cvrr_gpt_eval(result_file_path, args) - cvrr_print_scores(eval_file_path, args) + eval_file_path = cvrr_gpt_eval(result_file_path, args, "understanding_emotional_context") + average_score = cvrr_print_scores(eval_file_path, args, "understanding_emotional_context") + return average_score def cvrr_aggregate_results_dim11(results, args): result_file_path = cvrr_aggregate_submissions(results, args, "unusual_and_physically_anomalous_activities") - eval_file_path = cvrr_gpt_eval(result_file_path, args) - cvrr_print_scores(eval_file_path, args) + eval_file_path = cvrr_gpt_eval(result_file_path, args, "unusual_and_physically_anomalous_activities") + average_score = cvrr_print_scores(eval_file_path, args, "unusual_and_physically_anomalous_activities") + return average_score diff --git a/lmms_eval/tasks/video_detail_description/_default_template_yaml b/lmms_eval/tasks/video_detail_description/_default_template_yaml index 57bc49410..914bf8ee3 100644 --- a/lmms_eval/tasks/video_detail_description/_default_template_yaml +++ b/lmms_eval/tasks/video_detail_description/_default_template_yaml @@ -2,7 +2,7 @@ dataset_path: lmms-lab/VideoDetailDescription dataset_kwargs: token: True video: True - cache_dir: video-chatgpt + cache_dir: videochatgpt model_specific_prompt_kwargs: default: pre_prompt: "" diff --git a/lmms_eval/tasks/video_detail_description/utils.py b/lmms_eval/tasks/video_detail_description/utils.py index f2a6878c5..5f68ca89b 100755 --- a/lmms_eval/tasks/video_detail_description/utils.py +++ b/lmms_eval/tasks/video_detail_description/utils.py @@ -40,13 +40,18 @@ # But the idea is that we will unzip all the zip files # To HF HOME cache dir # And load it here -HF_HOME = os.environ["HF_HOME"] -cache_dir = config["dataset_kwargs"]["cache_dir"] -cache_dir = os.path.join(HF_HOME, "datasets", cache_dir) -cache_dir = os.path.join(cache_dir, "evaluation/Test_Videos") +# HF_HOME = os.environ["HF_HOME"] +# cache_dir = config["dataset_kwargs"]["cache_dir"] +# cache_dir = os.path.join(HF_HOME, "datasets", cache_dir) +# cache_dir = os.path.join(cache_dir, "evaluation/Test_Videos") eval_logger = logging.getLogger("lmms-eval") +HF_HOME = os.environ["HF_HOME"] +cache_dir = config["dataset_kwargs"]["cache_dir"] +cache_dir = os.path.join(HF_HOME, cache_dir) +cache_dir = os.path.join(cache_dir, "Test_Videos") + # Pass in video path here # Can only work correctly with video llm @@ -227,7 +232,18 @@ def gpt_eval(results): def video_detail_description_gen_gpt_eval(results, args): + # Save the raw inference results to a new JSON file + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + submission_file_name = f"video_detail_description_{now_date_time}.json" + path = file_utils.generate_submission_file(submission_file_name, args) + + with open(path, "w") as f: + json.dump(results, f, indent=4) + + eval_logger.info(f"Submission file saved to {path}") + eval_results = gpt_eval(results) + score = 0 for result in eval_results: eval_score = result["score"] @@ -237,4 +253,22 @@ def video_detail_description_gen_gpt_eval(results, args): eval_score = 0.0 score += eval_score - return score / len(results) + average_score = score / len(results) + + # Save the evaluated results to a new JSON file + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + eval_file_name = f"gpt_eval_result_video_detail_description_{now_date_time}.json" + eval_file_path = file_utils.generate_submission_file(eval_file_name, args) + + with open(eval_file_path, "w") as f: + json.dump(eval_results, f, indent=4) + + # Save the scores to a new JSON file + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + score_file_name = f"scores_video_detail_description_{now_date_time}.json" + path = file_utils.generate_submission_file(score_file_name, args) + + with open(path, "w") as f: + json.dump({"average_score": average_score}, f, indent=4) + + return average_score diff --git a/lmms_eval/tasks/videochatgpt/utils.py b/lmms_eval/tasks/videochatgpt/utils.py index b763b630a..3bd2abd46 100755 --- a/lmms_eval/tasks/videochatgpt/utils.py +++ b/lmms_eval/tasks/videochatgpt/utils.py @@ -137,7 +137,7 @@ def videochatgpt_process_results_consistency(doc, result): def videochatgpt_aggregate_submissions(results, args, task): now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - submission_file_name = f"videochatgpt-{task}-{now_date_time}.json" + submission_file_name = f"videochatgpt_{task}_{now_date_time}.json" path = file_utils.generate_submission_file(submission_file_name, args) with open(path, "w") as f: @@ -150,7 +150,7 @@ def videochatgpt_aggregate_submissions(results, args, task): def videochatgpt_aggregate_submissions_consistency(results, args, task): now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - submission_file_name = f"videochatgpt-{task}-{now_date_time}.json" + submission_file_name = f"videochatgpt_{task}_{now_date_time}.json" path = file_utils.generate_submission_file(submission_file_name, args) combined_results = [] @@ -279,7 +279,7 @@ def get_eval_generic(question, answer, pred, task, max_tokens: int, retries: int "For example, your response should look like this: {''score': 4.8}.", }, ] - print(messages) + payload = { "model": GPT_EVAL_MODEL_NAME, "messages": messages, @@ -348,7 +348,7 @@ def get_eval_consistency(question1, question2, answer, pred1, pred2, max_tokens: "For example, your response should look like this: {''score': 4.8}.", }, ] - print(messages) + payload = { "model": GPT_EVAL_MODEL_NAME, "messages": messages, @@ -404,12 +404,13 @@ def parse_score(review): return 0 -def videochatgpt_print_scores(eval_file_path, args): +def videochatgpt_print_scores(eval_file_path, args, task): # Load the predictions from the result file with open(eval_file_path, "r") as file: evaluated_list = json.load(file) - score_file_name = "scores.json" + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + score_file_name = f"scores_videochatgpt_{task}_{now_date_time}.json" path = file_utils.generate_submission_file(score_file_name, args) # Compute average score @@ -422,15 +423,14 @@ def videochatgpt_print_scores(eval_file_path, args): # Calculate accuracy and average score average_score = total_score / len(evaluated_list) if evaluated_list else 0 - # Print the results - print(f"Average Score: {average_score}") - # Write the processed data to the scores file with open(path, "w") as f: json.dump({"average_score": average_score}, f, indent=4) eval_logger.info(f"Score file saved to {path}") + return average_score + def videochatgpt_gpt_eval(result_file_path, args, task): """ @@ -440,8 +440,8 @@ def videochatgpt_gpt_eval(result_file_path, args, task): Args: result_file_path: path to the JSON file with results to be evaluated """ - - eval_file_name = "gpt_eval_result.json" + now_date_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + eval_file_name = f"gpt_eval_result_videochatgpt_{task}_{now_date_time}.json" eval_file_path = file_utils.generate_submission_file(eval_file_name, args) # Load the predictions from the result file @@ -524,28 +524,33 @@ def videochatgpt_gpt_eval(result_file_path, args, task): def videochatgpt_aggregate_correctness(results, args): result_file_path = videochatgpt_aggregate_submissions(results, args, "correctness") eval_file_path = videochatgpt_gpt_eval(result_file_path, args, "correctness") - videochatgpt_print_scores(eval_file_path, args) + average_score = videochatgpt_print_scores(eval_file_path, args, "correctness") + return average_score def videochatgpt_aggregate_detailed_orientation(results, args): result_file_path = videochatgpt_aggregate_submissions(results, args, "detailed_orientation") eval_file_path = videochatgpt_gpt_eval(result_file_path, args, "detailed_orientation") - videochatgpt_print_scores(eval_file_path, args) + average_score = videochatgpt_print_scores(eval_file_path, args, "detailed_orientation") + return average_score def videochatgpt_aggregate_context(results, args): result_file_path = videochatgpt_aggregate_submissions(results, args, "context") eval_file_path = videochatgpt_gpt_eval(result_file_path, args, "context") - videochatgpt_print_scores(eval_file_path, args) + average_score = videochatgpt_print_scores(eval_file_path, args, "context") + return average_score def videochatgpt_aggregate_temporal(results, args): result_file_path = videochatgpt_aggregate_submissions(results, args, "temporal") eval_file_path = videochatgpt_gpt_eval(result_file_path, args, "temporal") - videochatgpt_print_scores(eval_file_path, args) + average_score = videochatgpt_print_scores(eval_file_path, args, "temporal") + return average_score def videochatgpt_aggregate_consistency(results, args): result_file_path = videochatgpt_aggregate_submissions_consistency(results, args, "consistency") eval_file_path = videochatgpt_gpt_eval(result_file_path, args, "consistency") - videochatgpt_print_scores(eval_file_path, args) + average_score = videochatgpt_print_scores(eval_file_path, args, "consistency") + return average_score diff --git a/lmms_eval/utils.py b/lmms_eval/utils.py index d6c085536..b0bdfa263 100755 --- a/lmms_eval/utils.py +++ b/lmms_eval/utils.py @@ -411,9 +411,12 @@ def make_table(result_dict, column: str = "results"): points = "N/A" if v is not None: - if 0 <= v <= 1: - v *= 100 - points = "%.4f" % v + if isinstance(v, str): + points = v + else: + if 0 <= v <= 1: + v *= 100 + points = "%.4f" % v if m + "_stderr" + "," + f in dic: if v is None: From fa1224fb65949a7727010948159e1a28c8817cdf Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 27 May 2024 08:11:32 +0000 Subject: [PATCH 091/181] Revise gemini api import --- lmms_eval/models/gemini_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lmms_eval/models/gemini_api.py b/lmms_eval/models/gemini_api.py index 4a41535b8..b85a54610 100644 --- a/lmms_eval/models/gemini_api.py +++ b/lmms_eval/models/gemini_api.py @@ -11,12 +11,12 @@ from lmms_eval.api.model import lmms from lmms_eval.api.instance import Instance from accelerate import Accelerator, DistributedType -from google.generativeai.types import HarmCategory, HarmBlockThreshold eval_logger = logging.getLogger("lmms-eval") try: import google.generativeai as genai + from google.generativeai.types import HarmCategory, HarmBlockThreshold NUM_SECONDS_TO_SLEEP = 30 GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") From 0a89fb2e04e45320b1066a926dd6194a35499e38 Mon Sep 17 00:00:00 2001 From: kcz358 Date: Mon, 27 May 2024 08:12:16 +0000 Subject: [PATCH 092/181] Change video_llava to use transformers instead build from source --- lmms_eval/models/video_llava.py | 83 ++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 38 deletions(-) diff --git a/lmms_eval/models/video_llava.py b/lmms_eval/models/video_llava.py index 7aba4ab01..88007a4f2 100644 --- a/lmms_eval/models/video_llava.py +++ b/lmms_eval/models/video_llava.py @@ -17,22 +17,24 @@ eval_logger = logging.getLogger("lmms-eval") -try: - import torch - from videollava.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN - from videollava.conversation import conv_templates, SeparatorStyle - from videollava.model.builder import load_pretrained_model - from videollava.utils import disable_torch_init - from videollava.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria -except ImportError: - eval_logger.debug("Video-LLaVA is not installed. Please install Video-LLaVA to use this model.") - +# try: +# import torch +# from videollava.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN +# from videollava.conversation import conv_templates, SeparatorStyle +# from videollava.model.builder import load_pretrained_model +# from videollava.utils import disable_torch_init +# from videollava.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria +# except ImportError: +# eval_logger.debug("Video-LLaVA is not installed. Please install Video-LLaVA to use this model.") + +from transformers import VideoLlavaProcessor, VideoLlavaForConditionalGeneration +from lmms_eval.models.model_utils.load_video import read_video_pyav @register_model("video_llava") class VideoLLaVA(lmms): def __init__( self, - pretrained: str = "LanguageBind/Video-LLaVA-7B", + pretrained: str = "LanguageBind/Video-LLaVA-7B-hf", truncation: Optional[bool] = True, device: Optional[str] = "cuda:0", dtype: Optional[Union[str, torch.dtype]] = "auto", @@ -45,7 +47,8 @@ def __init__( device_map="cuda:0", conv_template="llava_v1", use_cache=True, - truncate_context=False, # whether to truncate the context in generation, set it False for LLaVA-1.6 + truncate_context=False, + num_frames: int = 8, # whether to truncate the context in generation, set it False for LLaVA-1.6 **kwargs, ) -> None: super().__init__() @@ -62,9 +65,14 @@ def __init__( self.device_map = f"cuda:{accelerator.local_process_index}" self.pretrained = pretrained - self.model_name = get_model_name_from_path(pretrained) - self._tokenizer, self._model, self.processor, self._max_length = load_pretrained_model(pretrained, None, self.model_name, device_map=self.device_map) - self.video_processor = self.processor["video"] + self._model = VideoLlavaForConditionalGeneration.from_pretrained(pretrained) + self._processor = VideoLlavaProcessor.from_pretrained(pretrained) + self.prompt = "USER: Discord_Thread [discord/lmms-eval](https://discord.gg/zdkwKUqrPy) +🏠 [LMMs-Lab Homepage](https://lmms-lab.github.io/) | 🎉 [Blog](https://lmms-lab.github.io/lmms-eval-blog/lmms-eval-0.1/) | 📚 [Documentation](docs/README.md) | 🤗 [Huggingface Datasets](https://huggingface.co/lmms-lab) | Discord_Thread [discord/lmms-eval](https://discord.gg/zdkwKUqrPy) In today's world, we're on an exciting journey toward creating Artificial General Intelligence (AGI), much like the enthusiasm of the 1960s moon landing. This journey is powered by advanced large language models (LLMs) and large multimodal models (LMMs), which are complex systems capable of understanding, learning, and performing a wide variety of human tasks. These advancements bring us closer to achieving AGI. From a81e30b2f194fdff5ec0859473a368b65077dc4a Mon Sep 17 00:00:00 2001 From: Li Bo Date: Sun, 9 Jun 2024 19:45:32 +0800 Subject: [PATCH 120/181] [WIP] check video datasets, in progress (#110) * Refactor process_results function to handle full_docs in videochatgpt task * Refactor models/__init__.py to add "Reka" model * chore: Add "Llava_OneVision" model to lmms_eval/models/__init__.py * update onevision model interface. * Fix error message when importing claude in lmms_eval/models/claude.py * Refactor lmms_eval/models/llava_vid.py for safer object type handling in llama_3 conv_template * Refactor llava_vid.py to handle pad_token_ids for "llama_3" conv_template * Refactor lmms_eval/api/task.py to update datasets.config for streaming read retries and intervals --- lmms_eval/api/task.py | 4 + lmms_eval/evaluator.py | 2 + lmms_eval/models/__init__.py | 2 + lmms_eval/models/batch_gpt4.py | 3 + lmms_eval/models/claude.py | 72 ++- lmms_eval/models/llava_onevision.py | 474 +++++++++++++++++++ lmms_eval/models/llava_sglang.py | 13 +- lmms_eval/models/llava_vid.py | 37 +- lmms_eval/models/reka.py | 136 ++++-- lmms_eval/tasks/mmbench/cc_utils.py | 4 +- lmms_eval/tasks/mmbench/cn_utils.py | 3 + lmms_eval/tasks/mmbench/en_utils.py | 3 + lmms_eval/tasks/mme/utils.py | 2 +- lmms_eval/tasks/mmmu/arial.ttf | Bin 0 -> 275572 bytes lmms_eval/tasks/mmmu/mmmu_group_img_val.yaml | 2 +- lmms_eval/tasks/mmmu/mmmu_val.yaml | 2 +- lmms_eval/tasks/mmmu/utils.py | 12 +- lmms_eval/tasks/mmmu/utils_group_img.py | 18 +- pyproject.toml | 1 + 19 files changed, 708 insertions(+), 82 deletions(-) create mode 100755 lmms_eval/models/llava_onevision.py create mode 100644 lmms_eval/tasks/mmmu/arial.ttf diff --git a/lmms_eval/api/task.py b/lmms_eval/api/task.py index 40097b74f..9aa3b3b7c 100755 --- a/lmms_eval/api/task.py +++ b/lmms_eval/api/task.py @@ -12,6 +12,10 @@ from tqdm import tqdm import datasets + +datasets.config.STREAMING_READ_MAX_RETRIES = 20 # default +datasets.config.STREAMING_READ_RETRY_INTERVAL = 5 # default + from datasets import Image, Sequence import numpy as np from PIL import ImageFile diff --git a/lmms_eval/evaluator.py b/lmms_eval/evaluator.py index 7c56212f0..7554130f4 100755 --- a/lmms_eval/evaluator.py +++ b/lmms_eval/evaluator.py @@ -415,6 +415,8 @@ def evaluate( vals_torch[(task_name, key, metric)] = gathered_item vals = vals_torch + # Ensure all ranks wait for rank 0 to finish aggregation + torch.distributed.barrier() if lm.rank == 0: ### Get task ordering for correct sample-wide aggregation diff --git a/lmms_eval/models/__init__.py b/lmms_eval/models/__init__.py index b818c7a8a..c6c13032e 100755 --- a/lmms_eval/models/__init__.py +++ b/lmms_eval/models/__init__.py @@ -23,6 +23,8 @@ "internvl": "InternVLChat", "gemini_api": "GeminiAPI", "gemini_model": "GeminiModel", + "reka": "Reka", + "llava_onevision": "Llava_OneVision", "from_log": "FromLog", } diff --git a/lmms_eval/models/batch_gpt4.py b/lmms_eval/models/batch_gpt4.py index 9c6d5ba3e..54bfa1495 100755 --- a/lmms_eval/models/batch_gpt4.py +++ b/lmms_eval/models/batch_gpt4.py @@ -47,6 +47,9 @@ "api-key": API_KEY, "Content-Type": "application/json", } +else: + API_URL = "YOUR_API_URL" + API_KEY = "YOUR_API_KEY" @register_model("batch_gpt4") diff --git a/lmms_eval/models/claude.py b/lmms_eval/models/claude.py index a726f851f..c629ca063 100644 --- a/lmms_eval/models/claude.py +++ b/lmms_eval/models/claude.py @@ -2,6 +2,7 @@ from copy import deepcopy import os import base64 +import json from typing import List, Tuple, Union from tqdm import tqdm import requests as url_requests @@ -22,8 +23,10 @@ try: import anthropic -except: - eval_logger.debug("Can not import anthropic") + from decord import VideoReader, cpu + import numpy as np +except Exception as e: + eval_logger.error(f"Error importing claude: {e}") API_URL = os.getenv("ANTHROPIC_API_URL", "https://api.anthropic.com/v1/complete") API_KEY = os.getenv("ANTHROPIC_API_KEY", "YOUR_API_KEY") @@ -36,12 +39,30 @@ def __init__( model_version: str = "claude-3-opus-20240229", image_token: str = "", # Use to separate interleaved image and text system_prompt: str = "", # Whether you want some special system prompt here + modality: str = "image", + continual_mode: bool = False, + response_persistent_folder: str = None, **kwargs, ) -> None: super().__init__() self.model_version = model_version self.image_token = image_token self.system_prompt = system_prompt + self.modality = modality + + self.continual_mode = continual_mode + if self.continual_mode and response_persistent_folder is None: + raise ValueError("Continual mode requires a persistent path for the response. Please provide a valid path.") + self.response_persistent_folder = response_persistent_folder + self.response_persistent_file = os.path.join(self.response_persistent_folder, f"{self.model_version}_response.json") + + if os.path.exists(self.response_persistent_file): + with open(self.response_persistent_file, "r") as f: + self.response_cache = json.load(f) + self.cache_mode = "resume" + else: + self.response_cache = {} + self.cache_mode = "start" accelerator = Accelerator() if accelerator.num_processes > 1: @@ -105,6 +126,24 @@ def shrink_image_to_file_size(self, img: Image, max_file_size=4838990) -> Image: return self.shrink_image_to_file_size(img, max_file_size) + def encode_video(self, video_path): + vr = VideoReader(video_path, ctx=cpu(0)) + total_frame_num = len(vr) + uniform_sampled_frames = np.linspace(0, total_frame_num - 1, self.max_frames_for_video, dtype=int) + frame_idx = uniform_sampled_frames.tolist() + frames = vr.get_batch(frame_idx).asnumpy() + + base64_frames = [] + for frame in frames: + img = Image.fromarray(frame) + output_buffer = BytesIO() + img.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + base64_frames.append(f"data:image/jpeg;base64,{base64_str}") + + return base64_frames + def generate_until(self, requests) -> List[str]: client = anthropic.Anthropic() @@ -127,14 +166,28 @@ def generate_until(self, requests) -> List[str]: ] for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: - # encode, pad, and truncate contexts for this batch + ###################### CONTINUAL MODE ###################### + if self.continual_mode is True and self.cache_mode == "resume": + doc_uuid = f"{task}___{split}___{doc_id}" + if doc_uuid in self.response_cache: + response_text = self.response_cache[doc_uuid] + if response_text: + res.append(response_text) + pbar.update(1) + continue + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] visuals = self.flatten(visuals) imgs = [] for visual in visuals: - visual = self.shrink_image_to_file_size(visual) - img = self.encode_image(visual) - imgs.append(img) + if isinstance(visual, str) and os.path.exists(visual): # Assuming visual is a path to a video + visual = self.encode_video(visual) + for img in visual: + imgs.append(img) + else: + visual = self.shrink_image_to_file_size(visual) + img = self.encode_image(visual) + imgs.append(img) messages = deepcopy(empty_messages) @@ -188,6 +241,13 @@ def generate_until(self, requests) -> List[str]: res.append(message.content[0].text) pbar.update(1) + ###################### CONTINUAL MODE ###################### + if self.continual_mode is True: # Cache the response + doc_uuid = f"{task}___{split}___{doc_id}" + self.response_cache[doc_uuid] = response_text + with open(self.response_persistent_file, "w") as f: + json.dump(self.response_cache, f) + pbar.close() return res diff --git a/lmms_eval/models/llava_onevision.py b/lmms_eval/models/llava_onevision.py new file mode 100755 index 000000000..7acd66df6 --- /dev/null +++ b/lmms_eval/models/llava_onevision.py @@ -0,0 +1,474 @@ +from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs +from accelerate.state import AcceleratorState +from transformers import AutoConfig + +import math +import torch + +torch.backends.cuda.matmul.allow_tf32 = True + +from tqdm import tqdm +from datetime import timedelta +from decord import VideoReader, cpu +import numpy as np + +import copy +import PIL +from typing import List, Optional, Union, Tuple +from packaging import version +import warnings +import logging + +warnings.filterwarnings("ignore") + +eval_logger = logging.getLogger("lmms-eval") + +from lmms_eval import utils +from lmms_eval.api.instance import Instance +from lmms_eval.api.model import lmms +from lmms_eval.api.registry import register_model + +try: + from llava.model.builder import load_pretrained_model + from llava.mm_utils import get_model_name_from_path, process_images, tokenizer_image_token, KeywordsStoppingCriteria + from llava.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN, IGNORE_INDEX + from llava.conversation import conv_templates, SeparatorStyle + + from llavavid.model.language_model.llava_qwen import LlavaQwenConfig + from llavavid.model.language_model.llava_llama import LlavaConfig + + AutoConfig.register("llava_qwen", LlavaQwenConfig) + AutoConfig.register("llava_llama", LlavaConfig) + +except Exception as e: + eval_logger.debug("LLaVA is not installed. Please install LLaVA to use this model.\nError: %s" % e) + +# inference implementation for attention, can be "sdpa", "eager", "flash_attention_2". Seems FA2 is not effective during inference: https://discuss.huggingface.co/t/flash-attention-has-no-effect-on-inference/73453/5 +# if is_flash_attn_2_available: +# best_fit_attn_implementation = "flash_attention_2" # flash_attn has a bug that says: ERROR Error query and key must have the same dtype in generating + +if version.parse(torch.__version__) >= version.parse("2.1.2"): + best_fit_attn_implementation = "sdpa" +else: + best_fit_attn_implementation = "eager" + + +@register_model("llava_onevision") +class Llava_OneVision(lmms): + """ + Llava Model + """ + + def __init__( + self, + pretrained: str = "liuhaotian/llava-v1.5-7b", + truncation: Optional[bool] = True, + device: Optional[str] = "cuda:0", + batch_size: Optional[Union[int, str]] = 1, + model_name: Optional[str] = None, + attn_implementation: Optional[str] = best_fit_attn_implementation, + device_map: Optional[str] = "cuda:0", + conv_template: Optional[str] = "vicuna_v1", + use_cache: Optional[bool] = True, + truncate_context: Optional[bool] = False, # whether to truncate the context in generation, set it False for LLaVA-1.6 + customized_config: Optional[str] = None, # ends in json + max_frames_num: Optional[int] = 32, + mm_spatial_pool_stride: Optional[int] = 2, + mm_spatial_pool_mode: Optional[str] = "average", + token_strategy: Optional[str] = "single", # could be "single" or "multiple", "multiple" denotes adding multiple tokens for each frame + **kwargs, + ) -> None: + super().__init__() + # Do not use kwargs for now + assert kwargs == {}, f"Unexpected kwargs: {kwargs}" + + accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) + accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) + if accelerator.num_processes > 1: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + elif accelerator.num_processes == 1 and device_map == "auto": + self._device = torch.device(device) + self.device_map = device_map + else: + self._device = torch.device(f"cuda:{accelerator.local_process_index}") + self.device_map = f"cuda:{accelerator.local_process_index}" + + llava_model_args = { + "multimodal": True, + } + if customized_config is not None: + llava_model_args["customized_config"] = customized_config + if attn_implementation is not None: + llava_model_args["attn_implementation"] = attn_implementation + if "use_flash_attention_2" in kwargs: + llava_model_args["use_flash_attention_2"] = kwargs["use_flash_attention_2"] + model_name = model_name if model_name is not None else get_model_name_from_path(pretrained) + + self.pretrained = pretrained + self.token_strategy = token_strategy + self.max_frames_num = max_frames_num + self.mm_spatial_pool_stride = mm_spatial_pool_stride + self.mm_spatial_pool_mode = mm_spatial_pool_mode + + overwrite_config = {} + overwrite_config["mm_spatial_pool_stride"] = self.mm_spatial_pool_stride + overwrite_config["mm_spatial_pool_mode"] = self.mm_spatial_pool_mode + cfg_pretrained = AutoConfig.from_pretrained(self.pretrained) + + if cfg_pretrained.architectures[0] == "LlavaLlamaForCausalLM": # Ugly code, only used in vicuna that needs ROPE + if "224" in cfg_pretrained.mm_vision_tower: + least_token_number = self.max_frames_num * (16 // self.mm_spatial_pool_stride) ** 2 + 1000 + else: + least_token_number = self.max_frames_num * (24 // self.mm_spatial_pool_stride) ** 2 + 1000 + + scaling_factor = math.ceil(least_token_number / 4096) + if scaling_factor >= 2: + overwrite_config["rope_scaling"] = {"factor": float(scaling_factor), "type": "linear"} + overwrite_config["max_sequence_length"] = 4096 * scaling_factor + overwrite_config["tokenizer_model_max_length"] = 4096 * scaling_factor + + llava_model_args["overwrite_config"] = overwrite_config + try: + # Try to load the model with the multimodal argument + self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, model_name, device_map=self.device_map, **llava_model_args) + except TypeError: + # for older versions of LLaVA that don't have multimodal argument + llava_model_args.pop("multimodal", None) + self._tokenizer, self._model, self._image_processor, self._max_length = load_pretrained_model(pretrained, None, model_name, device_map=self.device_map, **llava_model_args) + + self._config = self._model.config + self.model.eval() + self.model.tie_weights() + self.truncation = truncation + self.batch_size_per_gpu = int(batch_size) + self.conv_template = conv_template + self.use_cache = use_cache + self.truncate_context = truncate_context + assert self.batch_size_per_gpu == 1, "Llava currently does not support batched generation. See https://github.com/haotian-liu/LLaVA/issues/754. HF Llava also has this issue." + + if accelerator.num_processes > 1: + assert accelerator.distributed_type in [DistributedType.FSDP, DistributedType.MULTI_GPU, DistributedType.DEEPSPEED], "Unsupported distributed type provided. Only DDP and FSDP are supported." + # If you want to use DistributedType.DEEPSPEED, you have to run accelerate config before using the model + # Also, you have to select zero stage 0 (equivalent to DDP) in order to make the prepare model works + # I tried to set different parameters in the kwargs to let default zero 2 stage works, but it didn't work. + if accelerator.distributed_type == DistributedType.DEEPSPEED: + kwargs = { + "train_micro_batch_size_per_gpu": self.batch_size_per_gpu, + "train_batch_size": self.batch_size_per_gpu * accelerator.num_processes, + } + AcceleratorState().deepspeed_plugin.deepspeed_config_process(must_match=True, **kwargs) + eval_logger.info("Detected that you are using DistributedType.DEEPSPEED. Make sure you run `accelerate config` and set zero stage to 0") + + if accelerator.distributed_type == DistributedType.FSDP or accelerator.distributed_type == DistributedType.DEEPSPEED: + self._model = accelerator.prepare(self.model) + else: + self._model = accelerator.prepare_model(self.model, evaluation_mode=True) + self.accelerator = accelerator + if self.accelerator.is_local_main_process: + eval_logger.info(f"Using {accelerator.num_processes} devices with data parallelism") + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + + elif accelerator.num_processes == 1 and device_map == "auto": + eval_logger.info(f"Using {accelerator.num_processes} devices with tensor parallelism") + self._rank = 0 + self._word_size = 1 + + else: + eval_logger.info(f"Using single device: {self._device}") + self.model.to(self._device) + self._rank = 0 + self._world_size = 1 + + @property + def config(self): + # return the associated transformers.AutoConfig for the given pretrained model. + return self._config + + @property + def tokenizer(self): + return self._tokenizer + + @property + def model(self): + # returns the model, unwrapping it if using Accelerate + if hasattr(self, "accelerator"): + return self.accelerator.unwrap_model(self._model) + else: + return self._model + + @property + def eot_token_id(self): + # we use EOT because end of *text* is more accurate for what we're doing than end of *sentence* + return self.tokenizer.eos_token_id + + @property + def max_length(self): + return self._max_length + + def pad_sequence(self, input_ids, batch_first, padding_value): + if self.tokenizer.padding_side == "left": + input_ids = [torch.flip(_input_ids, [0]) for _input_ids in input_ids] + input_ids = torch.nn.utils.rnn.pad_sequence(input_ids, batch_first=batch_first, padding_value=padding_value) + if self.tokenizer.padding_side == "left": + input_ids = torch.flip(input_ids, [1]) + return input_ids + + @property + def batch_size(self): + return self.batch_size_per_gpu + + @property + def device(self): + return self._device + + @property + def rank(self): + return self._rank + + @property + def world_size(self): + return self._world_size + + def tok_encode(self, string: str, left_truncate_len=None, add_special_tokens=None) -> List[int]: + """ """ + add_special_tokens = False if add_special_tokens is None else add_special_tokens + encoding = self.tokenizer.encode(string, add_special_tokens=add_special_tokens) + # left-truncate the encoded context to be at most `left_truncate_len` tokens long + if left_truncate_len: + encoding = encoding[-left_truncate_len:] + return encoding + + def tok_decode(self, tokens): + try: + return self.tokenizer.decode(tokens) + except: + return self.tokenizer.decode([tokens]) + + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + # TODO + res = [] + pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") + + for contexts, doc_to_target, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + # encode, pad, and truncate contexts for this batch + if type(doc_to_target) == str: + continuation = doc_to_target + else: + continuation = doc_to_target(self.task_dict[task][split][doc_id]) + visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] + visuals = self.flatten(visuals) + image_sizes = [[visual.size[0], visual.size[1]] for visual in visuals] + if visuals: + image = process_images(visuals, self._image_processor, self._config) + if type(image) is list: + image = [_image.to(dtype=torch.float16, device=self.device) for _image in image] + else: + image = image.to(dtype=torch.float16, device=self.device) + else: + image = None + + prompts_input = contexts[0] if isinstance(contexts, list) else contexts + + if image is not None and len(image) != 0 and DEFAULT_IMAGE_TOKEN not in prompts_input: + """ + Three senarios: + 1. No image, and there for, no image token should be added. + 2. image token is already specified in the context, so we don't need to add it. + 3. image token is not specified in the context and there is image inputs, so we need to add it. In this case, we add the image token at the beginning of the context and add a new line. + """ + image_tokens = [DEFAULT_IMAGE_TOKEN] * len(visuals) + image_tokens = " ".join(image_tokens) + prompts_input = image_tokens + "\n" + (contexts[0] if isinstance(contexts, list) else contexts) + + # This is much safer for llama3, as we now have some object type in it + if "llama_3" in self.conv_template: + conv = copy.deepcopy(conv_templates[self.conv_template]) + else: + conv = conv_templates[self.conv_template].copy() + + conv.append_message(conv.roles[0], prompts_input) + conv.append_message(conv.roles[1], None) + prompt = conv.get_prompt() + pad_token_id = self.tokenizer.pad_token_id if self.tokenizer.pad_token_id is not None else self.tokenizer.eos_token_id + contxt_id = tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).to(self.device) + # Add the answer of the second role + conv.messages[1][1] = continuation + + prompt = conv.get_prompt() + input_ids = tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).to(self.device) + labels = input_ids.clone() + # Context part no need to calculate for loss + labels[0, : contxt_id.shape[1]] = -100 + with torch.inference_mode(): + outputs = self.model(input_ids=input_ids, labels=labels, images=image, use_cache=True, image_sizes=image_sizes) + loss = outputs["loss"] + # loss = torch.exp(loss) + logits = outputs["logits"] + greedy_tokens = logits.argmax(dim=-1) + cont_toks = input_ids[:, contxt_id.shape[1] :] # [1, seq] + greedy_tokens = greedy_tokens[:, contxt_id.shape[1] : input_ids.shape[1]] # [1, seq] + max_equal = (greedy_tokens == cont_toks).all() + res.append((float(loss.item()), bool(max_equal))) + pbar.update(1) + + pbar.close() + return res + + def flatten(self, input): + new_list = [] + for i in input: + for j in i: + new_list.append(j) + return new_list + + def load_video(self, video_path, max_frames_num): + if type(video_path) == str: + vr = VideoReader(video_path, ctx=cpu(0)) + else: + vr = VideoReader(video_path[0], ctx=cpu(0)) + total_frame_num = len(vr) + uniform_sampled_frames = np.linspace(0, total_frame_num - 1, max_frames_num, dtype=int) + frame_idx = uniform_sampled_frames.tolist() + spare_frames = vr.get_batch(frame_idx).asnumpy() + return spare_frames # (frames, height, width, channels) + + def generate_until(self, requests: List[Instance]) -> List[str]: + res = [] + + def _collate(x): + # the negative sign on len(toks) sorts descending - this has a few advantages: + # - time estimates will always be over not underestimates, which is more useful for planning + # - to know the size of a batch when going through the list, you know the first one is always the batch + # padded context length. this is useful to simplify the batching logic and more importantly to make + # automatic adaptive batches much much easier to implement + # - any OOMs will happen right away rather than near the end + toks = self.tok_encode(x[0]) + return -len(toks), x[0] + + # we group requests by their generation_kwargs, + # so that we don't try to execute e.g. greedy sampling and temp=0.8 sampling + # in the same batch. + re_ords = utils.Collator([reg.args for reg in requests], _collate, grouping=True) + chunks = re_ords.get_batched(n=self.batch_size, batch_fn=None) + num_iters = len(requests) // self.batch_size if len(requests) % self.batch_size == 0 else len(requests) // self.batch_size + 1 + pbar = tqdm(total=num_iters, disable=(self.rank != 0), desc="Model Responding") + for chunk in chunks: + batched_contexts, all_gen_kwargs, batched_doc_to_visual, batched_doc_id, batched_task, batched_split = zip(*chunk) + task = batched_task[0] + split = batched_split[0] + batched_visuals = [batched_doc_to_visual[0](self.task_dict[task][split][ids]) for ids in batched_doc_id] # [B, N] + assert len(batched_visuals) == 1 + + # we assume all gen kwargs in the batch are the same + # this is safe to assume because the `grouper` object ensures it. + gen_kwargs = all_gen_kwargs[0] + if "until" in gen_kwargs: + gen_kwargs.pop("until") + + question_input = [] + + for visual, context in zip(batched_visuals, batched_contexts): + if "image_aspect_ratio" in gen_kwargs.keys() and "image_aspect_ratio" not in self._config.__dict__: + # here we should pop it out of gen_kwargs so that it doesn't get passed to the model for next step of generation + self._config.image_aspect_ratio = gen_kwargs.pop("image_aspect_ratio") + eval_logger.info(f"Setting image aspect ratio: {self._config.image_aspect_ratio}") + + # encode, pad, and truncate contexts for this batch + if type(visual[0]) == PIL.Image.Image: # For image task + image_tensor = process_images(visual, self._image_processor, self._config) + if type(image_tensor) is list: + image_tensor = [_image.to(dtype=torch.float16, device=self.device) for _image in image_tensor] + else: + image_tensor = image_tensor.to(dtype=torch.float16, device=self.device) + + task_type = "image" + + elif type(visual[0]) == str: # For video task + image_tensor = [] + try: + frames = self.load_video(visual, self.max_frames_num) + frames = self._image_processor.preprocess(frames, return_tensors="pt")["pixel_values"].half().cuda() + image_tensor.append(frames) + except Exception as e: + eval_logger.error(f"Error {e} in loading video") + image_tensor = None + + task_type = "video" + + if image_tensor is not None and len(image_tensor) != 0 and DEFAULT_IMAGE_TOKEN not in context: + """ + Three senarios: + 1. No image, and there for, no image token should be added. + 2. image token is already specified in the context, so we don't need to add it. + 3. image token is not specified in the context and there is image inputs, so we need to add it. In this case, we add the image token at the beginning of the context and add a new line. + 4. For video tasks, we could add a token or multiple tokens for each frame in the context. This depends on the training strategy and should balance in test to decide which is better + """ + if task_type == "image": + image_tokens = [DEFAULT_IMAGE_TOKEN] * len(visual) if isinstance(visual, list) else [DEFAULT_IMAGE_TOKEN] + elif task_type == "video": + image_tokens = [DEFAULT_IMAGE_TOKEN] * len(frames) if self.token_strategy == "multiple" else [DEFAULT_IMAGE_TOKEN] + + image_tokens = " ".join(image_tokens) + question = image_tokens + "\n" + context + else: + question = context + + # This is much safer for llama3, as we now have some object type in it + if "llama_3" in self.conv_template: + conv = copy.deepcopy(conv_templates[self.conv_template]) + else: + conv = conv_templates[self.conv_template].copy() + conv.append_message(conv.roles[0], question) + conv.append_message(conv.roles[1], None) + prompt_question = conv.get_prompt() + question_input.append(prompt_question) + + # preconfigure gen_kwargs with defaults + if "max_new_tokens" not in gen_kwargs: + gen_kwargs["max_new_tokens"] = 1024 + if "temperature" not in gen_kwargs: + gen_kwargs["temperature"] = 0 + if "do_sample" not in gen_kwargs: + gen_kwargs["do_sample"] = False + if "top_p" not in gen_kwargs: + gen_kwargs["top_p"] = None + if "num_beams" not in gen_kwargs: + gen_kwargs["num_beams"] = 1 + + input_ids_list = [tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt") for prompt in question_input] + pad_token_ids = self.tokenizer.pad_token_id if self.tokenizer.pad_token_id is not None else self.tokenizer.eos_token_id + input_ids = self.pad_sequence(input_ids_list, batch_first=True, padding_value=pad_token_ids).to(self.device) + attention_masks = input_ids.ne(pad_token_ids).to(self.device) + + if task_type == "image": + gen_kwargs["image_sizes"] = [batched_visuals[idx][0].size for idx in range(len(batched_visuals))] + elif task_type == "video": + stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2 + keywords = [stop_str] + stopping_criteria = KeywordsStoppingCriteria(keywords, self.tokenizer, input_ids) + gen_kwargs["modalities"] = ["video"] + gen_kwargs["stopping_criteria"] = [stopping_criteria] + self._config.mm_spatial_pool_stride = self.mm_spatial_pool_stride + self._config.mm_spatial_pool_mode = self.mm_spatial_pool_mode + + # These steps are not in LLaVA's original code, but are necessary for generation to work + # TODO: attention to this major generation step... + try: + with torch.inference_mode(): + cont = self.model.generate(input_ids, attention_mask=attention_masks, pad_token_id=pad_token_ids, images=image_tensor, use_cache=self.use_cache, **gen_kwargs) + + text_outputs = self.tokenizer.batch_decode(cont, skip_special_tokens=True) + except Exception as e: + raise e + + text_outputs = [response.strip() for response in text_outputs] + res.extend(text_outputs) + self.cache_hook.add_partial("generate_until", (context, gen_kwargs), text_outputs) + pbar.update(1) + # reorder this group of results back to original unsorted form + res = re_ords.get_original(res) + + pbar.close() + return res diff --git a/lmms_eval/models/llava_sglang.py b/lmms_eval/models/llava_sglang.py index af79d1550..47c672888 100644 --- a/lmms_eval/models/llava_sglang.py +++ b/lmms_eval/models/llava_sglang.py @@ -1,4 +1,5 @@ import torch +import random torch.backends.cuda.matmul.allow_tf32 = True @@ -11,7 +12,6 @@ from lmms_eval.api.model import lmms from lmms_eval.api.registry import register_model -from accelerate import Accelerator, InitProcessGroupKwargs from typing import List, Optional, Union, Tuple import warnings @@ -53,11 +53,11 @@ def __init__( self.tokenizer = tokenizer self.tp_size = tp_size self.conv_template = conv_template - torch.multiprocessing.set_start_method("spawn") + # torch.multiprocessing.set_start_method("spawn") - accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) - accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) - assert accelerator.num_processes == 1, "Llava-sglang does not support multi-processes yet (it does support tensor parallelism)." + # accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) + # accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) + # assert accelerator.num_processes == 1, "Llava-sglang does not support multi-processes yet (it does support tensor parallelism)." self._rank = 0 self._world_size = 1 self.parallel = parallel @@ -66,7 +66,8 @@ def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: raise NotImplementedError("Llava-sglang does not support loglikelihood evaluation yet") def generate_until(self, requests: List[Instance]) -> List[str]: - runtime = sgl.Runtime(model_path=self.pretrained, tokenizer_path=self.tokenizer, tp_size=self.tp_size) + torch.multiprocessing.set_start_method("spawn", force=True) + runtime = sgl.Runtime(model_path=self.pretrained, tokenizer_path=self.tokenizer, tp_size=self.tp_size, port=random.randint(10000, 50000)) runtime.endpoint.chat_template = get_chat_template(self.conv_template) sgl.set_default_backend(runtime) diff --git a/lmms_eval/models/llava_vid.py b/lmms_eval/models/llava_vid.py index 26a21e748..3465766f5 100755 --- a/lmms_eval/models/llava_vid.py +++ b/lmms_eval/models/llava_vid.py @@ -8,36 +8,29 @@ import numpy as np import math from datetime import timedelta -from transformers import AutoConfig, AutoModelForCausalLM +from transformers import AutoConfig +import copy -from lmms_eval import utils from lmms_eval.api.instance import Instance from lmms_eval.api.model import lmms from lmms_eval.api.registry import register_model -from lmms_eval.utils import stop_sequences_criteria -from lmms_eval.models.model_utils.load_video import read_video_pyav eval_logger = logging.getLogger("lmms-eval") try: from llavavid.model.language_model.llava_llama import LlavaConfig + from llavavid.model.language_model.llava_qwen import LlavaQwenConfig from llavavid.model.builder import load_pretrained_model from llavavid.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria - from llavavid.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN, IGNORE_INDEX + from llavavid.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN from llavavid.conversation import conv_templates, SeparatorStyle + AutoConfig.register("llava_qwen", LlavaQwenConfig) AutoConfig.register("llava_llama", LlavaConfig) except ImportError: eval_logger.debug("LLaVA-Video is not installed. Please install LLaVA-Video to use this model.") -try: - from llavavid.model.language_model.llava_qwen import LlavaQwenConfig - - AutoConfig.register("llava_qwen", LlavaQwenConfig) -except: - eval_logger.debug("No llava vid qwen yet for llavavid") - @register_model("llavavid") class LlavaVid(lmms): @@ -50,10 +43,7 @@ def __init__( pretrained: str = "liuhaotian/llava-v1.5-7b", truncation: Optional[bool] = True, device: Optional[str] = "cuda:0", - dtype: Optional[Union[str, torch.dtype]] = "auto", batch_size: Optional[Union[int, str]] = 1, - trust_remote_code: Optional[bool] = False, - revision=None, attn_implementation=( "sdpa" if torch.__version__ >= "2.1.2" else "eager" ), # inference implementation for attention, can be "sdpa", "eager", "flash_attention_2". Seems FA2 is not effective during inference: https://discuss.huggingface.co/t/flash-attention-has-no-effect-on-inference/73453/5 @@ -337,13 +327,26 @@ def generate_until(self, requests) -> List[str]: else: qs = DEFAULT_IMAGE_TOKEN + "\n" + qs - conv = conv_templates[self.conv_template].copy() + # This is much safer for llama3, as we now have some object type in it + if "llama_3" in self.conv_template: + conv = copy.deepcopy(conv_templates[self.conv_template]) + else: + conv = conv_templates[self.conv_template].copy() + conv.append_message(conv.roles[0], qs) conv.append_message(conv.roles[1], None) prompt = conv.get_prompt() input_ids = tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).cuda() - attention_masks = input_ids.ne(self.tokenizer.pad_token_id).long().cuda() + pad_token_ids = self.tokenizer.pad_token_id if self.tokenizer.pad_token_id is not None else self.tokenizer.eos_token_id + if "llama_3" in self.conv_template: + pad_token_ids = 0 # lmms-lab/llama3-llava-8b is trained on this pad token id. You may need to customize this for other models. + attention_masks = input_ids.ne(pad_token_ids).long().cuda() + + # input_ids_list = [tokenizer_image_token(prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt") for prompt in question_input] + # pad_token_ids = self.tokenizer.pad_token_id if self.tokenizer.pad_token_id is not None else self.tokenizer.eos_token_id + # input_ids = self.pad_sequence(input_ids_list, batch_first=True, padding_value=pad_token_ids).to(self.device) + # attention_masks = input_ids.ne(pad_token_ids).to(self.device) stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2 keywords = [stop_str] diff --git a/lmms_eval/models/reka.py b/lmms_eval/models/reka.py index be384bb1b..d5e85d5dc 100644 --- a/lmms_eval/models/reka.py +++ b/lmms_eval/models/reka.py @@ -9,26 +9,22 @@ import requests as url_requests import time import logging +import json from lmms_eval.api.instance import Instance from lmms_eval.api.model import lmms from lmms_eval.api.registry import register_model -from lmms_eval import utils - -from accelerate import Accelerator, DistributedType, InitProcessGroupKwargs -from accelerate.state import AcceleratorState +from accelerate import Accelerator, DistributedType NUM_SECONDS_TO_SLEEP = 30 eval_logger = logging.getLogger("lmms-eval") try: - import reka + from reka.client import Reka as RekaClient + from reka import ChatMessage from decord import VideoReader, cpu - - reka.API_KEY = os.getenv("REKA_API_KEY", "YOUR_API_KEY") except Exception as e: - eval_logger.error(f"{e}") - pass + eval_logger.error(f"Error importing reka: {e}") @register_model("reka") @@ -39,6 +35,8 @@ def __init__( modality: str = "image", max_frames_for_video: int = 10, timeout: int = 120, + continual_mode: bool = False, + response_persistent_folder: str = None, # We will cache the Gemini API response in this path and use it for future requests **kwargs, ) -> None: super().__init__() @@ -46,6 +44,21 @@ def __init__( self.modality = modality self.max_frames_for_video = max_frames_for_video self.timeout = timeout + self.continual_mode = continual_mode + if self.continual_mode and response_persistent_folder is None: + raise ValueError("Continual mode requires a persistent path for the response. Please provide a valid path.") + self.response_persistent_folder = response_persistent_folder + self.response_persistent_file = os.path.join(self.response_persistent_folder, f"{self.model_version}_response.json") + + if os.path.exists(self.response_persistent_file): + with open(self.response_persistent_file, "r") as f: + self.response_cache = json.load(f) + self.cache_mode = "resume" + else: + self.response_cache = {} + self.cache_mode = "start" + + self.reka = RekaClient(api_key=os.getenv("REKA_API_KEY", "YOUR_API_KEY")) accelerator = Accelerator() if accelerator.num_processes > 1: @@ -62,31 +75,72 @@ def __init__( self.device = self.accelerator.device - def encode_media(self, media_path): - img = Image.open(media_path) - output_buffer = BytesIO() - img.save(output_buffer, format="PNG") - byte_data = output_buffer.getvalue() - base64_str = base64.b64encode(byte_data).decode("utf-8") - - return f"data:image/jpeg;base64,{base64_str}" + def encode_image(self, image): + if type(image) == list: + media_urls = [] + for img in image: + output_buffer = BytesIO() + img.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + media_urls.append(f"data:image/jpeg;base64,{base64_str}") + return media_urls + else: + output_buffer = BytesIO() + image.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + + return f"data:image/jpeg;base64,{base64_str}" + + def encode_video(self, video_path): + vr = VideoReader(video_path, ctx=cpu(0)) + total_frame_num = len(vr) + uniform_sampled_frames = np.linspace(0, total_frame_num - 1, self.max_frames_for_video, dtype=int) + frame_idx = uniform_sampled_frames.tolist() + frames = vr.get_batch(frame_idx).asnumpy() + + base64_frames = [] + for frame in frames: + img = Image.fromarray(frame) + output_buffer = BytesIO() + img.save(output_buffer, format="PNG") + byte_data = output_buffer.getvalue() + base64_str = base64.b64encode(byte_data).decode("utf-8") + base64_frames.append(f"data:image/jpeg;base64,{base64_str}") + + return base64_frames def generate_until(self, requests) -> List[str]: res = [] pbar = tqdm(total=len(requests), disable=(self.rank != 0), desc="Model Responding") - for contexts, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: - visuals = [doc_to_visual(self.task_dict[task][split][doc_id])] - - conversations_history = [] - media_urls = [] - for visual in visuals: - if self.modality == "image": - media_url = self.encode_media(visual) - else: - raise NotImplementedError - - conversations_history.append({"type": "human", "text": contexts, "media_url": media_url}) + for context, gen_kwargs, doc_to_visual, doc_id, task, split in [reg.args for reg in requests]: + if self.continual_mode is True and self.cache_mode == "resume": + doc_uuid = f"{task}___{split}___{doc_id}" + if doc_uuid in self.response_cache: + response_text = self.response_cache[doc_uuid] + if response_text: + res.append(response_text) + pbar.update(1) + continue + + visual = doc_to_visual(self.task_dict[task][split][doc_id]) + + message_content = [] + + if self.modality == "image": + media_urls = self.encode_image(visual) + message_content.append({"type": "text", "text": context}) + for media_url in media_urls: + message_content.append({"type": "image_url", "image_url": media_url}) + elif self.modality == "video": + message_content.append({"type": "text", "text": context}) + assert len(visual) == 1, "Reka only supports one video per request" + media_urls = self.encode_video(visual[0]) + assert len(media_urls) == self.max_frames_for_video, f"Reka only supports {self.max_frames_for_video} frames per request" + for media_url in media_urls: + message_content.append({"type": "image_url", "image_url": media_url}) if "max_new_tokens" not in gen_kwargs: gen_kwargs["max_new_tokens"] = 1024 @@ -99,13 +153,16 @@ def generate_until(self, requests) -> List[str]: for attempt in range(5): try: - response = reka.chat( - conversations_history=conversations_history, + response = self.reka.chat.create( + messages=[ + ChatMessage( + role="user", + content=message_content, + ) + ], model=self.model_version, - request_output_len=gen_kwargs["max_new_tokens"], - temperature=gen_kwargs["temperature"], ) - content = response["text"].strip() + response_text = response.responses[0].message.content.strip() break # If successful, break out of the loop except Exception as e: @@ -114,11 +171,16 @@ def generate_until(self, requests) -> List[str]: time.sleep(NUM_SECONDS_TO_SLEEP) else: # If this was the last attempt, log and return empty eval_logger.error(f"All 5 attempts failed. Last error message: {str(e)}") - eval_logger.error(f"Response: {response}") - content = "" + response_text = "" - res.append(content) + res.append(response_text) pbar.update(1) + if self.continual_mode is True: # Cache the response + doc_uuid = f"{task}___{split}___{doc_id}" + self.response_cache[doc_uuid] = response_text + with open(self.response_persistent_file, "w") as f: + json.dump(self.response_cache, f) + pbar.close() return res diff --git a/lmms_eval/tasks/mmbench/cc_utils.py b/lmms_eval/tasks/mmbench/cc_utils.py index abb24ab17..a5b9326c8 100755 --- a/lmms_eval/tasks/mmbench/cc_utils.py +++ b/lmms_eval/tasks/mmbench/cc_utils.py @@ -28,7 +28,9 @@ elif API_TYPE == "azure": API_URL = os.getenv("AZURE_ENDPOINT", "https://api.cognitive.microsoft.com/sts/v1.0/issueToken") API_KEY = os.getenv("AZURE_API_KEY", "YOUR_API_KEY") - +else: + API_URL = "YOUR_API_URL" + API_KEY = "YOUR_API_KEY" mmbench_evaluator = MMBench_Evaluator(sys_prompt=config["metadata"]["sys_prompt"], API_KEY=API_KEY, API_URL=API_URL, model_version=GPT_EVAL_MODEL_NAME) diff --git a/lmms_eval/tasks/mmbench/cn_utils.py b/lmms_eval/tasks/mmbench/cn_utils.py index 39a55f728..ba076b6f7 100755 --- a/lmms_eval/tasks/mmbench/cn_utils.py +++ b/lmms_eval/tasks/mmbench/cn_utils.py @@ -29,6 +29,9 @@ elif API_TYPE == "azure": API_URL = os.getenv("AZURE_ENDPOINT", "https://api.cognitive.microsoft.com/sts/v1.0/issueToken") API_KEY = os.getenv("AZURE_API_KEY", "YOUR_API_KEY") +else: + API_URL = "YOUR_API_URL" + API_KEY = "YOUR_API_KEY" mmbench_evaluator = MMBench_Evaluator(sys_prompt=config["metadata"]["sys_prompt"], API_KEY=API_KEY, API_URL=API_URL, model_version=GPT_EVAL_MODEL_NAME) diff --git a/lmms_eval/tasks/mmbench/en_utils.py b/lmms_eval/tasks/mmbench/en_utils.py index 1ddccbb68..60121ec5a 100755 --- a/lmms_eval/tasks/mmbench/en_utils.py +++ b/lmms_eval/tasks/mmbench/en_utils.py @@ -28,6 +28,9 @@ elif API_TYPE == "azure": API_URL = os.getenv("AZURE_ENDPOINT", "https://api.cognitive.microsoft.com/sts/v1.0/issueToken") API_KEY = os.getenv("AZURE_API_KEY", "YOUR_API_KEY") +else: + API_URL = "YOUR_API_URL" + API_KEY = "YOUR_API_KEY" mmbench_evaluator = MMBench_Evaluator(sys_prompt=config["metadata"]["sys_prompt"], API_KEY=API_KEY, API_URL=API_URL, model_version=GPT_EVAL_MODEL_NAME) diff --git a/lmms_eval/tasks/mme/utils.py b/lmms_eval/tasks/mme/utils.py index 993136cd3..26d5942ca 100755 --- a/lmms_eval/tasks/mme/utils.py +++ b/lmms_eval/tasks/mme/utils.py @@ -114,7 +114,7 @@ def mme_aggregate_results(results): for category, question2scores in category2score.items(): total_score = 0 for question_id, scores in question2scores.items(): - assert len(scores) == 2 + assert len(scores) == 2, "MME only supports pairwise evaluation" acc = sum(scores) / len(scores) * 100.0 acc_plus = (sum(scores) == 2) * 100.0 score = acc_plus + acc diff --git a/lmms_eval/tasks/mmmu/arial.ttf b/lmms_eval/tasks/mmmu/arial.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7ff88f22869126cc992030f18e0eeff65ec8bbac GIT binary patch literal 275572 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 YR_Tt=P6 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

    p3{iu%!3x8^p% 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