Commit 25869601 authored by Baber's avatar Baber
Browse files

Merge branch 'main' into mathvista

# Conflicts:
#	lm_eval/models/hf_vlms.py
parents 56f40c53 c1d8795d
include: _turkishmmlu_cot_default_yaml
task: turkishmmlu_cot_religion_and_ethics
description:
"Soru: (I) Allah’a (c.c.) inanmak insanın hayatında olumlu değişiklikler yapar. (II) Bunun nedeni imanın; duygu, düşünce ve davranışlar üzerinde etkili olmasıdır.\
\ (III) İnsanın Allah (c.c.) ile irtibatı dua, ibadet, tövbe ve Kur’an okuma gibi yollarla gerçekleşir. (IV) İnsan büyük oranda inancına göre görür, düşünür ve davranışlar sergiler.\
\ (V) Bu durumu açıklayan birçok ayet ve hadis bulunmaktadır. Bu parçadaki numaralanmış cümlelerden hangisi düşüncenin akışını bozmaktadır?\nA)\
\ I\nB) II\nC) III\nD) IV\nE) V\nÇözüm: Adım adım düşünelim.\
\ Metinde düşüncenin akışını bozan cümle C) III'dür. Çünkü diğer cümleler imanın insan üzerindeki etkilerine odaklanırken,\
\ III numaralı cümle insanın Allah ile irtibatını nasıl gerçekleştirdiğine dair bir açıklama sunar, bu da ana fikrin akışını biraz keser. \
\ Doğru cevap C şıkkıdır.\n\nSoru: İslam ahlakının kaynağı aşağıdakilerden hangisidir?\nA)\
\ Kur’an ve sünnet\nB) Birey ve toplum\nC) Terbiye ve deneyim\nD)\
\ Akıl ve düşünce\nE) Vicdan ve bilgi\nÇözüm: Adım adım düşünelim.\
\ İslam ahlakının kaynağı \"Kur'an ve Sünnet\"tir. \
\ Kur'an, İslam'ın kutsal kitabıdır ve peygamberin sözleri, eylemleri ve onayladıkları olan sünnet, İslam ahlakının temelini oluşturur.\
\ Doğru cevap A şıkkıdır.\n\nSoru: Dinimizin ibadetler konusunda önem verdiği temel ilkelerden biri ihlastır.\
\ Dolayısıyla İslami açıdan ibadetlerin, sadece Yüce Allah’ın (c.c.) rızasını kazanmak amacıyla yapılması esastır.\
\ Mümin, her zaman bu bilinçte olmalıdır.\nİbadetlerini bu bilinçle, severek, isteyerek ve samimiyetle yapmalıdır.\
\ Nitekim bizler her gün namazlarda okuduğumuz Fâtiha suresinde, ---- diyerek bunu ifade ediyoruz.\
\ Verilen parçada boş bırakılan yere aşağıdaki ayetlerden hangisi getirilmelidir?\nA)\
\ “Rahmân ve rahîm olan Allah’ın adıyla.” (Fâtiha suresi, 1. ayet.) \nB)\
\ “Hamd (övme ve övülme), âlemlerin Rabbi Allah’a mahsustur. (Fâtiha suresi, 2. ayet.) \nC)\
\ “O, rahmândır ve rahîmdir. Ceza gününün malikidir. (Fâtiha suresi, 3-4. ayetler.) \nD)\
\ “Yalnız sana ibadet eder ve yalnız senden yardım dileriz.” (Fâtiha suresi, 5. ayet.) \nE)\
\ “Bize doğru yolu göster. (Fâtiha suresi, 6. ayet.)\nÇözüm: Adım adım düşünelim. \
\ Verilen parçada ifade edildiği gibi, İslami ibadetlerin temel amacı Allah'ın rızasını kazanmaktır ve bu amaçla ibadetlerin ihlas ile yapılması önemlidir. Namazlarda okunan Fatiha suresinde bu bilinci ifade eden bir ayet bulunmaktadır.\
\ Fatiha suresinin ayetleri şunlardır:\
\ Rahmân ve Rahîm olan Allah'ın adıyla.\
\ Hamd (övme ve övülme) âlemlerin Rabbi Allah'a mahsustur.\
\ O, Rahmân'dır ve Rahîm'dir.\
\ Ceza gününün malikidir. \
\ Yalnız sana ibadet eder ve yalnız senden yardım dileriz.\
\ Bize doğru yolu göster.\
\ İbadetlerin ihlas ile yapılması ve sadece Allah'ın rızasını gözeterek gerçekleştirilmesi kavramını ifade eden ayet ise D) Yalnız sana ibadet eder ve yalnız senden yardım dileriz. şeklindeki 5. ayettir.\
\ Doğru cevap D şıkkıdır.\n\nSoru: Müminler ancak kardeştirler. Öyleyse kardeşlerinizin arasını düzeltin.\
\ Allah’a karşı gelmekten sakının ki size merhamet edilsin.” (Hucurât suresi, 10. ayet.) Ayetin asıl konusu nedir?\nA)\
\ Adalet\nB) Kardeşlik\nC) İtaat\nD) Bağışlama\nE) Sorumluluk\nÇözüm: Adım adım düşünelim.\
\ Bu ayetin asıl konusu \"Kardeşlik\"tir. Çünkü ayette müminlerin birbirlerine kardeş oldukları\
\ ve aralarındaki ilişkilerin düzeltilmesi gerektiği vurgulanır. Doğru cevap B şıkkıdır.\n\nSoru:\
\ İslam medeniyeti, Emeviler döneminde oluşum sürecine girmiş, Abbasiler döneminde gelişmiş, Selçuklular döneminde bu gelişim devam etmiş, \
\ Osmanlı döneminde ise kurum ve kuruluşlarıyla en parlak devrini yaşamıştır. İslam medeniyetinin mimari, edebiyat, sanat, matematik, astronomi, tıp vb. \
\ alanlarda ortaya koyduğu örnekler oldukça fazladır. Farabi, İbn Sina, Biruni, Harezmî, İbn Rüşd, İbn Haldun gibi ilim adamları kendi dönemlerinde, felsefe, mantık, matematik,\
\ tıp, astronomi gibi alanlarda tüm dünyaya zengin ilmi ürünler sunmuşlardır. Bu parçanın ana konusu aşağıdakilerden hangisidir?\nA)\
\ Medeniyetin en önemli unsurları\nB) Medeniyete katkı sağlayan İslam âlimleri\nC)\
\ İslam medeniyetiyle ortaya çıkan kurumlar\nD) İslam medeniyetinin en parlak dönemleri\nE)\
\ İslam medeniyetinin oluşma süreci\nÇözüm: Adım adım düşünelim.\
\ Bu parçanın ana konusu, İslam medeniyetinin gelişimini ve etkisini tanımlayan bir açıklamadır.\
\ Parça, İslam medeniyetinin Emeviler, Abbasiler, Selçuklular ve Osmanlılar dönemlerindeki oluşumunu ve gelişimini kapsamlı bir şekilde ele alırken,\
\ İslam medeniyetinin farklı alanlardaki önemli katkılarını ve ilim adamlarının rollerini vurgular.\
\ Doğru cevap E şıkkıdır."
dataset_name: Religion_and_Ethics
num_fewshot: 0
include: _turkishmmlu_cot_default_yaml
task: turkishmmlu_cot_turkish_language_and_literature
description:
"Soru: Aşağıdakilerden hangisi edebiyat tarihinin konuları arasında yer almaz?\nA) Edebî dönemler\nB)\
\ Şair ve yazarların edebî kişiliği\nC) Şair ve yazarların hayatları\nD) Edebî eserler\nE)\
\ Arkeolojik eserler\nÇözüm: Adım adım düşünelim.\
\ Edebiyat tarihinin konularını gözden geçirelim:\
\ A) Edebî dönemler - Edebiyat tarihi, farklı edebi dönemleri ve bu dönemlerdeki edebi akımları inceler.\
\ B) Şair ve yazarların edebî kişiliği - Edebiyat tarihi, şair ve yazarların eserlerindeki temaları, tarzları ve edebi kişiliklerini de ele alır.\
\ C) Şair ve yazarların hayatları - Edebiyat tarihi, şair ve yazarların biyografilerini ve hayat hikayelerini de inceler.\
\ D) Edebî eserler - Edebiyat tarihi, farklı edebi eserleri, bu eserlerin türlerini, temalarını ve döneminin özelliklerini inceler.\
\ E) Arkeolojik eserler - Edebiyat tarihi, genellikle arkeolojik eserlerle ilgilenmez. Arkeolojik eserler,\
\ arkeoloji biliminin konusudur ve genellikle tarih ve kültürel antropoloji alanlarında incelenir.\
\ Sonuç olarak, edebiyat tarihinin konuları arasında yer almayan (farklı bir alana ait olan) seçenek E) Arkeolojik eserlerdir.\
\ Doğru cevap E şıkkıdır.\n\nSoru: Osmanlı Devleti'nin son döneminde ortaya çıkan düşünce akımlarının\
\ temsilcileri hangi seçenekte doğru verilmiştir?\nA) İslamcılık: Sait Halim Paşa, Mehmet Emin Yurdakul\nB)\
\ Türkçülük: Ziya Gökalp, Ömer Seyfettin\nC) Batıcılık: Tevfik Fikret, Eşref Edip\nD) Osmanlıcılık:\
\ Mehmet Akif Ersoy, Sait Halim Paşa\nE) Medeniyetçilik: Münif Paşa, Ali Canip Yöntem\nÇözüm: Adım adım düşünelim.\
\ Osmanlı Devleti'nin son döneminde ortaya çıkan düşünce akımlarının temsilcilerini inceleyelim:\
\ A) İslamcılık: Sait Halim Paşa, Mehmet Emin Yurdakul - İslamcılık akımının temsilcileri arasında Sait Halim Paşa ve Mehmet Emin Yurdakul yer almamaktadır.\
\ B) Türkçülük: Ziya Gökalp, Ömer Seyfettin - Türkçülük akımının önde gelen temsilcileri arasında Ziya Gökalp ve Ömer Seyfettin bulunmaktadır. Bu seçenek doğru görünmektedir.\
\ C) Batıcılık: Tevfik Fikret, Eşref Edip - Batıcılık akımının temsilcileri arasında Tevfik Fikret ve Eşref Edip bulunmamaktadır.\
\ D) Osmanlıcılık: Mehmet Akif Ersoy, Sait Halim Paşa - Osmanlıcılık akımının temsilcileri arasında Mehmet Akif Ersoy ve Sait Halim Paşa bulunmamaktadır.\
\ E) Medeniyetçilik: Münif Paşa, Ali Canip Yöntem - Medeniyetçilik akımının temsilcileri arasında Münif Paşa ve Ali Canip Yöntem bulunmamaktadır.\
\ Doğru cevap B şıkkıdır.\n\nSoru: Birçok edebiyatçı ve eleştirmene göre şairlik yeteneği Tevfik Fikret'ten bile daha ileridedir.\
\ Fakat siyasi görüşleri daima sanatının önünde yer almıştır.\
\ Millî Mücadele Dönemi'nde Anadolu hareketini eleştirmiş, saltanat yanlısı görüşler ortaya koymuştur. Cumhuriyet Dönemi'nde de siyasi fikirleri yüzünden çokça eleştirilmiştir.\
\ Parçada bahsedilen Servetifünun şairi aşağıdakilerden hangisidir?\nA) Süleyman Nazif\nB) Hüseyin Cahit Yalçın\nC) Mehmet Rauf\nD) Cenab\
\ Şahabettin\nE) Halit Ziya Uşaklıgil\nÇözüm: Adım adım düşünelim.\
\ Parçada bahsedilen şairin siyasi görüşlerinin sanatından daha önde olduğu ve Milli Mücadele Dönemi'nde Anadolu hareketini eleştirdiği,\
\ saltanat yanlısı görüşler ortaya koyduğu ve Cumhuriyet Dönemi'nde de siyasi fikirleri nedeniyle eleştirildiği belirtilmektedir.\
\ Bu özellikler ışığında, Servet-i Fünun döneminin önemli şairlerinden olan Cenab Şahabettin'i işaretlemek gerekir.\
\ Doğru cevap D şıkkıdır.\n\nSoru: Selime’nin odasında biraz kaldıktan sonra otelden çıktım ( ) kırlara doğru yürüdüm ( )\
\ Tozlu bir yol ( ) İki yanında fırınlar ( ) kahveler ( ) büyük ambarlar var ( )\
\ Bu parçada yay ayraçlarla gösterilen yerlere aşağıdaki noktalama işaretlerinden hangisinde\
\ verilenler getirilmelidir?\nA) (,) (.) (...) (,) (,) (.)\nB) (,) (!) (.) (,) (;) (...)\nC)\
\ (...) (.) (...) (,) (,) (.)\nD) (,) (.) (.) (,) (,) (.)\nE) (,) (.) (;) (,) (,) (.)\nÇözüm: Adım adım düşünelim.\
\ Parçada yay ayraçlarla gösterilen yerlere uygun noktalama işaretlerini belirlememiz gerekiyor.\
\ Parçada yer alan noktalama işaretlerini dikkate alarak, uygun noktalama işaretlerini belirleyelim:\
\ Selime’nin odasında biraz kaldıktan sonra otelden çıktım (,) kırlara doğru yürüdüm (.)\
\ Tozlu bir yol (...) İki yanında fırınlar (,) kahveler (,) büyük ambarlar var (.)\
\ Parçada yer alan noktalama işaretlerine göre, doğru sıralama şu şekildedir: (,) (.) (...) (,) (,) (.)\
\ Doğru cevap A şıkkıdır.\n\nSoru: HOROZLA İNCİ Bir horoz inci bulur, kuyumcuya gider: “Al, şuna bak, der, pırıl pırıl,\
\ ne özrü ne kusuru var. Fakat sen bana bir avuç mısır ver, benim işime o yarar.”\
\ Bir cahile bir kitap miras kalır. Adam kitabı alır, komşusu kitapçıya gider:\
\ “Bak, ne güzel kitap, der, fakat sen bana beş on kuruş ver, benim işime o yarar.”\
\ Nâzım Hikmet , La Fontaine’den Masallar Bu fablda; I. Teşhis ve intak sanatlarından yararlanıldığı,\
\ II. Fablın kahramanlarından birinin hayvan olduğu, III. Fablda zamanın belli olduğu bilgilerinden hangilerine\
\ ulaşılabilir?\nA) Yalnız I\nB) Yalnız II\nC) I ve II\nD) I ve III\nE) II ve III\nÇözüm: Adım adım düşünelim.
\ Verilen metinde, bir horoz ve bir cahil (insan) arasında bir benzetme yapılmıştır. Bu fabldan hangi bilgilere ulaşılabilir gözden geçirelim:\
\ I. Teşhis ve intak sanatlarından yararlanıldığı - Metinde, horozun inciyi bulduktan sonra kuyumcuya gidip onun değerini belirlemesi anlatılmaktadır.\
\ Bu, bir tür değerlendirme ve tanımlama sürecidir. Dolayısıyla, I doğrudur.\
\ II. Fablın kahramanlarından birinin hayvan olduğu - Metinde, horozun inci bulduğu ve cahilin bir kitap bulduğu anlatılmaktadır.\
\ Horoz bir hayvandır, dolayısıyla fablın bir hayvan karakterine sahip olduğunu söyleyebiliriz. II doğrudur.\
\ III. Fablda zamanın belli olduğu - Metinde, zaman belirtilmemiştir. Dolayısıyla, III hakkında bir bilgiye ulaşılamaz.\
\ Sonuç olarak, I ve II doğru yanıtlardır, ancak III hakkında bir bilgiye ulaşılamaz.\
\ Doğru cevap D şıkkıdır."
num_fewshot: 0
dataset_name: Turkish_Language_and_Literature
tag: turkishmmlu_cot
task: null
dataset_path: AYueksel/TurkishMMLU
dataset_name: TurkishMMLU
test_split: test
fewshot_split: dev
output_type: generate_until
doc_to_text: "\n\nSoru: {{ question.strip() }}\nA) {{ choices[0] }}\nB) {{ choices[1] }}\nC) {{ choices[2] }}\nD) {{ choices[3] }}\nE) {{ choices[4] }}\nÇözüm: Adım adım düşünelim."
doc_to_target: "{{ answer }}"
filter_list:
- name: "get-answer"
filter:
- function: "regex"
regex_pattern: "([A-E])(?= şıkkıdır| şıkkı)"
- function: "take_first"
- name: "get-choice"
filter:
- function: "regex"
regex_pattern: "([A-E])"
- function: "take_first"
generation_kwargs:
until:
- "</s>"
do_sample: false
temperature: 0.0
num_fewshot: 0
metric_list:
- metric: exact_match
aggregation: mean
higher_is_better: true
ignore_case: true
ignore_punctuation: true
metadata:
version: 0.0
# Unitxt
Unitxt is a library for customizable textual data preparation and evaluation tailored to generative language models. Unitxt natively integrates with common libraries like HuggingFace and LM-eval-harness and deconstructs processing flows into modular components, enabling easy customization and sharing between practitioners. These components encompass model-specific formats, task prompts, and many other comprehensive dataset processing definitions. These components are centralized in the Unitxt-Catalog, thus fostering collaboration and exploration in modern textual data workflows.
The full Unitxt catalog can be viewed in an [online explorer](https://unitxt.readthedocs.io/en/latest/docs/demo.html).
Read more about Unitxt at [www.unitxt.ai](https://www.unitxt.ai/).
### Paper
Title: `Unitxt: Flexible, Shareable and Reusable Data Preparation and Evaluation for Generative AI`
Abstract: `https://arxiv.org/abs/2401.14019`
Unitxt is a library for customizable textual data preparation and evaluation tailored to generative language models. Unitxt natively integrates with common libraries like HuggingFace and LM-eval-harness and deconstructs processing flows into modular components, enabling easy customization and sharing between practitioners. These components encompass model-specific formats, task prompts, and many other comprehensive dataset processing definitions. These components are centralized in the Unitxt-Catalog, thus fostering collaboration and exploration in modern textual data workflows.
Abstract: [link](https://arxiv.org/abs/2401.14019)
The full Unitxt catalog can be viewed in an online explorer. `https://unitxt.readthedocs.io/en/latest/docs/demo.html`
Homepage: https://unitxt.readthedocs.io/en/latest/index.html
### Citation
......@@ -36,42 +38,4 @@ The full list of Unitxt tasks currently supported can be seen under `tasks/unitx
### Adding tasks
You can add additional tasks from the Unitxt catalog by generating new LM-Eval yaml files for these datasets.
The Unitxt task yaml files are generated via the `generate_yamls.py` script in the `tasks/unitxt` directory.
To add a yaml file for an existing dataset Unitxt which is not yet in LM-Eval:
1. Add the card name to the `unitxt_datasets` file in the `tasks/unitxt` directory.
2. The generate_yaml.py contains the default Unitxt [template](https://unitxt.readthedocs.io/en/latest/docs/adding_template.html) used for each kind of NLP task in the `default_template_per_task` dictionary. If the dataset is of a Unitxt task type, previously not used in LM-Eval, you will need to add a default template for it in the dictionary.
```
default_template_per_task = {
"tasks.classification.multi_label" : "templates.classification.multi_label.title" ,
"tasks.classification.multi_class" : "templates.classification.multi_class.title" ,
"tasks.summarization.abstractive" : "templates.summarization.abstractive.full",
"tasks.regression.two_texts" : "templates.regression.two_texts.simple",
"tasks.qa.with_context.extractive" : "templates.qa.with_context.simple",
"tasks.grammatical_error_correction" : "templates.grammatical_error_correction.simple",
"tasks.span_labeling.extraction" : "templates.span_labeling.extraction.title"
}
```
3. Run `python generate_yaml.py` (this will generate all the datasets listed in the `unitxt_datasets`)
If you want to add a new dataset to the Unitxt catalog, see the Unitxt documentation:
https://unitxt.readthedocs.io/en/latest/docs/adding_dataset.html
### Checklist
For adding novel benchmarks/datasets to the library:
* [ ] Is the task an existing benchmark in the literature?
* [ ] Have you referenced the original paper that introduced the task?
* [ ] If yes, does the original paper provide a reference implementation? If so, have you checked against the reference implementation and documented how to run such a test?
If other tasks on this dataset are already supported:
* [ ] Is the "Main" variant of this task clearly denoted?
* [ ] Have you provided a short sentence in a README on what each new variant adds / evaluates?
* [ ] Have you noted which, if any, published evaluation setups are matched by this variant?
See the [adding tasks guide](https://www.unitxt.ai/en/latest/docs/lm_eval.html#).
task: doc_vqa
include: unitxt_multimodal
recipe: card=cards.doc_vqa.en,template=templates.qa.with_context.title
......@@ -4,9 +4,12 @@ In the dynamic landscape of generative NLP, traditional text processing pipeline
Addressing this need, we present Unitxt, an innovative library for customizable textual data preparation and evaluation tailored to generative language models. Unitxt natively integrates with common libraries like HuggingFace and LM-eval-harness and deconstructs processing flows into modular components, enabling easy customization and sharing between practitioners. These components encompass model-specific formats, task prompts, and many other comprehensive dataset processing definitions. The Unitxt-Catalog centralizes these components, fostering collaboration and exploration in modern textual data workflows. Beyond being a tool, Unitxt is a community-driven platform, empowering users to build, share, and advance their pipelines collaboratively.
"""
import importlib.util
import re
from functools import partial
from typing import Optional
from typing import Any, Dict, Optional
import datasets
import evaluate
from lm_eval.api.instance import Instance
......@@ -25,6 +28,10 @@ _CITATION = """
"""
def is_unitxt_installed() -> bool:
return importlib.util.find_spec("unitxt") is not None
def score(items, metric):
predictions, references = zip(*items)
evaluator = evaluate.load("unitxt/metric")
......@@ -41,17 +48,30 @@ class Unitxt(ConfigurableTask):
self,
config: Optional[dict] = None,
) -> None:
if config is None:
config = {}
assert "recipe" in config, "Unitxt task must have a 'recipe' string."
super().__init__(
config={
"metadata": {"version": self.VERSION},
"dataset_kwargs": {"trust_remote_code": True},
"dataset_name": config["recipe"],
"dataset_path": "unitxt/data",
}
)
self.image_decoder = datasets.Image()
self.metrics = self.dataset["test"][0]["metrics"]
def download(self, dataset_kwargs: Optional[Dict[str, Any]] = None) -> None:
if is_unitxt_installed():
from unitxt import load_dataset
self.dataset = load_dataset(self.DATASET_NAME)
else:
self.dataset = datasets.load_dataset(
name=self.DATASET_NAME,
path="unitxt/data",
trust_remote_code=True,
)
def has_training_docs(self):
return "train" in self.dataset
......@@ -79,6 +99,9 @@ class Unitxt(ConfigurableTask):
def doc_to_target(self, doc):
doc["target"]
def get_arguments(self, doc, ctx):
return (ctx, {"until": ["\n"]})
def construct_requests(self, doc, ctx, **kwargs):
"""Uses RequestFactory to construct Requests and returns an iterable of
Requests which will be sent to the LM.
......@@ -90,12 +113,11 @@ class Unitxt(ConfigurableTask):
language description, as well as the few shot examples, and the question
part of the document for `doc`.
"""
return [
Instance(
request_type="generate_until",
doc=doc,
arguments=(ctx, {"until": ["\n"]}),
arguments=self.get_arguments(doc, ctx),
idx=0,
**kwargs,
)
......@@ -140,3 +162,34 @@ class Unitxt(ConfigurableTask):
whether a higher value of the submetric is better
"""
return {metric.replace("metrics.", ""): True for metric in self.metrics}
images_regex = r'<img\s+src=["\'](.*?)["\']\s*/?>'
image_source_regex = r'<img\s+src=["\'](.*?)["\']'
def extract_images(text, instance):
image_sources = re.findall(image_source_regex, text)
images = []
for image_source in image_sources:
current = instance
for key in image_source.split("/"):
if key.isdigit():
key = int(key)
current = current[key]
images.append(current)
return images
class UnitxtMultiModal(Unitxt):
MULTIMODAL = True
def doc_to_text(self, doc):
return re.sub(images_regex, "<image>", doc["source"])
def doc_to_image(self, doc):
images = extract_images(doc["source"], doc)
return [self.image_decoder.decode_example(image) for image in images]
def get_arguments(self, doc, ctx):
return (ctx, {"until": ["\n"]}, {"visual": self.doc_to_image(doc)})
class: !function task.UnitxtMultiModal
......@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "lm_eval"
version = "0.4.4"
version = "0.4.5"
authors = [
{name="EleutherAI", email="contact@eleuther.ai"}
]
......
......@@ -5,6 +5,7 @@ import random
import numpy as np
from lm_eval import tasks
from lm_eval.evaluator_utils import get_task_list
from lm_eval.tasks import TaskManager
from lm_eval.utils import eval_logger, join_iters
......@@ -51,9 +52,8 @@ def main():
task_dict = tasks.get_task_dict(task_names, task_manager)
os.makedirs(args.output_base_path, exist_ok=True)
for task_name, task in task_dict.items():
if isinstance(task, tuple):
_, task = task
for task in [x.task for x in get_task_list(task_dict)]:
task_name = task.config.task
rnd = random.Random()
rnd.seed(args.seed)
......
......@@ -5,7 +5,9 @@ import sys
from pathlib import Path
import numpy as np
import tokenizers
import torch
from packaging.version import parse as parse_version
from lm_eval import tasks
from lm_eval.api.instance import Instance
......@@ -145,4 +147,7 @@ class Test_HFLM:
context = self.LM.tok_batch_encode([TEST_STRING])[0]
res = self.LM._model_generate(context, max_length=10, stop=["\n\n"])
res = self.LM.tok_decode(res[0])
assert res == "foo bar\n<bazhang>!info bar"
if parse_version(tokenizers.__version__) >= parse_version("0.20.0"):
assert res == "foo bar\n<bazhang> !info bar"
else:
assert res == "foo bar\n<bazhang>!info bar"
import pytest
import torch
from lm_eval.models.neuron_optimum import wrap_constant_batch_size
def test_wrap_constant_batch_size():
class Tester:
def __init__(self, batch_size):
self.batch_size = batch_size
@wrap_constant_batch_size
def test_constant_batch_size(self, inputs):
assert len(inputs) == self.batch_size
return inputs
batch_size_test = 8
for i in range(1, batch_size_test + 1):
tensor = torch.ones([i, 2, 2])
out = Tester(batch_size=batch_size_test).test_constant_batch_size(tensor)
torch.testing.assert_allclose(out, tensor)
with pytest.raises(ValueError):
Tester(batch_size=batch_size_test).test_constant_batch_size(
torch.ones([batch_size_test + 1, 2, 2])
)
import tempfile
from pathlib import Path
import pytest
from lm_eval.tasks import TaskManager
@pytest.fixture(scope="module")
def custom_task_name():
return "zzz_my_python_task"
@pytest.fixture(scope="module")
def custom_task_tag():
return "zzz-tag"
@pytest.fixture(scope="module")
def task_yaml(pytestconfig, custom_task_name, custom_task_tag):
yield f"""include: {pytestconfig.rootpath}/lm_eval/tasks/hellaswag/hellaswag.yaml
task: {custom_task_name}
class: !function {custom_task_name}.MockPythonTask
tag:
- {custom_task_tag}
"""
@pytest.fixture(scope="module")
def task_code():
return """
from lm_eval.tasks import ConfigurableTask
class MockPythonTask(ConfigurableTask):
def __init__(
self,
data_dir=None,
cache_dir=None,
download_mode=None,
config=None,
) -> None:
config.pop("class")
super().__init__(data_dir, cache_dir, download_mode, config)
"""
@pytest.fixture(scope="module")
def custom_task_files_dir(task_yaml, task_code, custom_task_name):
with tempfile.TemporaryDirectory() as temp_dir:
yaml_path = Path(temp_dir) / f"{custom_task_name}.yaml"
with open(yaml_path, "w") as f:
f.write(task_yaml)
pysource_path = Path(temp_dir) / f"{custom_task_name}.py"
with open(pysource_path, "w") as f:
f.write(task_code)
yield temp_dir
def test_python_task_inclusion(
custom_task_files_dir: Path, custom_task_name: str, custom_task_tag: str
):
task_manager = TaskManager(
verbosity="INFO", include_path=str(custom_task_files_dir)
)
# check if python tasks enters the global task_index
assert custom_task_name in task_manager.task_index
# check if subtask is present
assert custom_task_name in task_manager.all_subtasks
# check if tag is present
assert custom_task_tag in task_manager.all_tags
# check if it can be loaded by tag (custom_task_tag)
assert custom_task_name in task_manager.load_task_or_group(custom_task_tag)
......@@ -5,6 +5,7 @@ import pytest
import lm_eval.tasks as tasks
from lm_eval.api.task import ConfigurableTask
from lm_eval.evaluator_utils import get_task_list
from .utils import new_tasks
......@@ -20,10 +21,11 @@ def task_class():
# CI: new_tasks checks if any modifications have been made
task_classes = new_tasks()
# Check if task_classes is empty
if task_classes:
return list(task_manager.load_task_or_group(task_classes).values())
else:
return list(task_manager.load_task_or_group(TASKS).values())
task_classes = task_classes if task_classes else TASKS
res = tasks.get_task_dict(task_classes, task_manager)
res = [x.task for x in get_task_list(res)]
return res
@pytest.fixture()
......@@ -101,7 +103,11 @@ class TestNewTasks:
)
_array_target = [task.doc_to_target(doc) for doc in arr]
if task._config.output_type == "multiple_choice":
assert all(isinstance(label, int) for label in _array_target)
# TODO<baber>: label can be string or int; add better test conditions
assert all(
(isinstance(label, int) or isinstance(label, str))
for label in _array_target
)
def test_build_all_requests(self, task_class, limit):
task_class.build_all_requests(rank=1, limit=limit, world_size=1)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment