Skip to content

Commit 6cc3c04

Browse files
committed
enable extended tasks as well
1 parent 0d42edf commit 6cc3c04

12 files changed

Lines changed: 72 additions & 58 deletions

File tree

src/lighteval/tasks/__init__.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,12 @@ def _load_all_task_configs():
4343
"""Load all LightevalTaskConfig objects from all Python files in the tasks/ directory."""
4444
loaded_configs = {}
4545

46-
# Get all Python files in the tasks directory (excluding __init__.py and subdirectories)
46+
# Get all Python files in the tasks directory (excluding __init__.py)
4747
task_files = [f for f in TASKS_DIR.glob("*.py") if f.name != "__init__.py"]
4848

49+
# Also get all subdirectories with main.py files
50+
task_subdirs = [d for d in TASKS_DIR.iterdir() if d.is_dir() and (d / "main.py").exists()]
51+
4952
for task_file in task_files:
5053
module_name = task_file.stem
5154
# Import the module
@@ -57,6 +60,18 @@ def _load_all_task_configs():
5760
if isinstance(attr, LightevalTaskConfig):
5861
loaded_configs[attr_name] = attr
5962

63+
# Load from subdirectories' main.py files
64+
for task_dir in task_subdirs:
65+
module_name = task_dir.name
66+
# Import the main.py from the subdirectory
67+
module = importlib.import_module(f"lighteval.tasks.tasks.{module_name}.main")
68+
69+
# Find all LightevalTaskConfig objects in the module
70+
for attr_name in dir(module):
71+
attr = getattr(module, attr_name)
72+
if isinstance(attr, LightevalTaskConfig):
73+
loaded_configs[attr_name] = attr
74+
6075
return loaded_configs
6176

6277

src/lighteval/tasks/tasks/ifbench/evaluation_lib.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import json
2121
from typing import Dict, Optional, Union
2222

23-
import lighteval.tasks.extended.ifbench.instructions_registry as instructions_registry
23+
import lighteval.tasks.tasks.ifbench.instructions_registry as instructions_registry
2424

2525

2626
@dataclasses.dataclass

src/lighteval/tasks/tasks/ifbench/instructions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
if is_package_available("spacy"):
3636
import spacy
3737

38-
import lighteval.tasks.extended.ifeval.instructions_utils as instructions_util
38+
import lighteval.tasks.tasks.ifeval.instructions_utils as instructions_util
3939

4040

4141
logger = logging.getLogger(__name__)

src/lighteval/tasks/tasks/ifbench/instructions_registry.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
"""Registry of all instructions."""
1616

17-
import lighteval.tasks.extended.ifbench.instructions as instructions
17+
import lighteval.tasks.tasks.ifbench.instructions as instructions
1818

1919

2020
INSTRUCTION_DICT = {

src/lighteval/tasks/tasks/ifbench/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@
3030
SampleLevelMetricGrouping,
3131
)
3232
from lighteval.models.model_output import ModelResponse
33-
from lighteval.tasks.extended.ifbench import evaluation_lib
3433
from lighteval.tasks.lighteval_task import LightevalTaskConfig
3534
from lighteval.tasks.requests import Doc, SamplingMethod
35+
from lighteval.tasks.tasks.ifbench import evaluation_lib
3636

3737

3838
def ifbench_prompt(line, task_name: str = ""):

src/lighteval/tasks/tasks/ifeval/instructions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
if is_package_available("langdetect"):
2828
import langdetect
2929

30-
import lighteval.tasks.extended.ifeval.instructions_utils as instructions_util
30+
import lighteval.tasks.tasks.ifeval.instructions_utils as instructions_util
3131

3232

3333
logger = logging.getLogger(__name__)

src/lighteval/tasks/tasks/ifeval/instructions_registry.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
"""Registry of all instructions."""
1616

17-
import lighteval.tasks.extended.ifeval.instructions as instructions
17+
import lighteval.tasks.tasks.ifeval.instructions as instructions
1818

1919

2020
_KEYWORD = "keywords:"

src/lighteval/tasks/tasks/ifeval/main.py

Lines changed: 41 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,12 @@
2222

2323

2424
import numpy as np
25-
from inspect_ai.dataset import Sample
26-
from inspect_ai.scorer import Score, Target, accuracy, scorer, stderr
27-
from inspect_ai.solver import TaskState
2825

29-
import lighteval.tasks.extended.ifeval.instructions_registry as instructions_registry
26+
import lighteval.tasks.tasks.ifeval.instructions_registry as instructions_registry
3027
from lighteval.metrics.metrics_sample import SampleLevelComputation
31-
from lighteval.metrics.utils.metric_utils import SampleLevelMetricGrouping
28+
from lighteval.metrics.utils.metric_utils import (
29+
SampleLevelMetricGrouping,
30+
)
3231
from lighteval.models.model_output import ModelResponse
3332
from lighteval.tasks.lighteval_task import LightevalTaskConfig
3433
from lighteval.tasks.requests import Doc, SamplingMethod
@@ -37,35 +36,37 @@
3736

3837
# Very specific task where there are no precise outputs but instead we test if the format obeys rules
3938
@requires("langdetect")
40-
def ifeval_prompt(record):
41-
metadata = {"instruction_id_list": record["instruction_id_list"], "kwargs": record["kwargs"]}
42-
43-
return Sample(
44-
input=record["prompt"],
45-
metadata=metadata,
39+
def ifeval_prompt(line, task_name: str = ""):
40+
return Doc(
41+
task_name=task_name,
42+
query=line["prompt"],
43+
choices=[""],
44+
gold_index=0,
45+
instruction="",
46+
specific={"instructions_id_list": line["instruction_id_list"], "kwargs": line["kwargs"]},
4647
)
4748

4849

4950
submetric_names = [
5051
"prompt_level_strict_acc",
52+
"inst_level_strict_acc",
5153
"prompt_level_loose_acc",
54+
"inst_level_loose_acc",
55+
]
56+
57+
REASONING_TAG_PAIRS = [
58+
("<think>", "</think>"),
5259
]
5360

5461

55-
@scorer(
56-
metrics={
57-
"prompt_level_strict_acc": [accuracy(), stderr()],
58-
"prompt_level_loose_acc": [accuracy(), stderr()],
59-
}
60-
)
61-
def ifeval_scorer():
62-
async def score(state: TaskState, target: Target):
63-
response = state.output.completion
62+
class IFEvalMetrics(SampleLevelComputation):
63+
def compute(self, doc: Doc, model_response: ModelResponse, **kwargs) -> dict:
64+
response = model_response.final_text[0]
6465

6566
# Strict instructions
66-
instruction_list = state.metadata["instruction_id_list"]
67-
all_kwargs = state.metadata["kwargs"]
68-
prompt = state.input
67+
instruction_list = doc.specific["instructions_id_list"]
68+
all_kwargs = doc.specific["kwargs"]
69+
prompt = doc.query
6970

7071
# Loose instructions
7172
r = response.split("\n")
@@ -116,19 +117,12 @@ async def score(state: TaskState, target: Target):
116117

117118
is_following_list_loose.append(is_following)
118119

119-
return Score(
120-
value={
121-
"prompt_level_strict_acc": int(all(is_following_list_strict)),
122-
"prompt_level_loose_acc": int(all(is_following_list_loose)),
123-
}
124-
)
125-
126-
return score
127-
128-
129-
class IFEvalMetrics(SampleLevelComputation):
130-
def compute(self, doc: Doc, model_response: ModelResponse, **kwargs) -> dict:
131-
pass
120+
return {
121+
"prompt_level_strict_acc": int(all(is_following_list_strict)),
122+
"inst_level_strict_acc": is_following_list_strict,
123+
"prompt_level_loose_acc": int(all(is_following_list_loose)),
124+
"inst_level_loose_acc": is_following_list_loose,
125+
}
132126

133127

134128
@requires("langdetect")
@@ -155,12 +149,17 @@ def agg_inst_level_acc(items):
155149
ifeval = LightevalTaskConfig(
156150
name="ifeval",
157151
prompt_function=ifeval_prompt,
158-
dataset_repo="google/IFEval",
159-
dataset_subset="default",
160-
dataset_split="train",
161-
dataset_revision="main",
162-
metrics=[],
163-
system_prompt="FOLLOW THE INSTRUCTIONS STRICTLY.",
152+
suite=["extended"],
153+
hf_repo="google/IFEval",
154+
hf_subset="default",
155+
metrics=[ifeval_metrics],
156+
hf_avail_splits=["train"],
157+
evaluation_splits=["train"],
158+
few_shots_split="train",
159+
few_shots_select="random_sampling",
160+
generation_size=1280,
161+
stop_sequence=[], # no stop sequence, will use eot token
162+
version="0.1",
164163
)
165164

166165

src/lighteval/tasks/tasks/lcb/main.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@
3838
from lighteval.metrics.metrics import Metrics, SampleLevelMetric
3939
from lighteval.metrics.metrics_sample import SampleLevelComputation
4040
from lighteval.models.model_output import ModelResponse
41-
from lighteval.tasks.extended.lcb.codegen_metrics import (
41+
from lighteval.tasks.lighteval_task import Doc, LightevalTaskConfig
42+
from lighteval.tasks.requests import SamplingMethod
43+
from lighteval.tasks.tasks.lcb.codegen_metrics import (
4244
codegen_metrics,
4345
extract_code,
4446
translate_private_test_cases,
4547
)
46-
from lighteval.tasks.lighteval_task import Doc, LightevalTaskConfig
47-
from lighteval.tasks.requests import SamplingMethod
4848

4949

5050
def prepare_prompt(line: dict[str, Any]) -> str:

src/lighteval/tasks/tasks/mix_eval/judge_prompts.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2121
# SOFTWARE.
2222

23-
from lighteval.tasks.extended.mix_eval.prompts import parse_options
23+
from lighteval.tasks.tasks.mix_eval.prompts import parse_options
2424

2525

2626
def flow_judge_for_freeform_template(question, options, answer, gold):

0 commit comments

Comments
 (0)