slm-eval 0.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. slm_eval/__init__.py +29 -0
  2. slm_eval/__main__.py +14 -0
  3. slm_eval/_cli/__init__.py +8 -0
  4. slm_eval/_cli/harness.py +60 -0
  5. slm_eval/_cli/ls.py +81 -0
  6. slm_eval/_cli/run.py +518 -0
  7. slm_eval/_cli/subcommand.py +19 -0
  8. slm_eval/_cli/utils.py +209 -0
  9. slm_eval/_cli/validate.py +112 -0
  10. slm_eval/api/__init__.py +0 -0
  11. slm_eval/api/filter.py +56 -0
  12. slm_eval/api/group.py +407 -0
  13. slm_eval/api/instance.py +38 -0
  14. slm_eval/api/metrics.py +695 -0
  15. slm_eval/api/model.py +571 -0
  16. slm_eval/api/registry.py +884 -0
  17. slm_eval/api/samplers.py +144 -0
  18. slm_eval/api/task.py +1808 -0
  19. slm_eval/api/utils.py +100 -0
  20. slm_eval/caching/__init__.py +0 -0
  21. slm_eval/caching/cache.py +88 -0
  22. slm_eval/config/__init__.py +6 -0
  23. slm_eval/config/evaluate_config.py +505 -0
  24. slm_eval/config/group.py +123 -0
  25. slm_eval/config/task.py +218 -0
  26. slm_eval/decontamination/__init__.py +0 -0
  27. slm_eval/decontamination/archiver.py +174 -0
  28. slm_eval/decontamination/decontaminate.py +166 -0
  29. slm_eval/decontamination/janitor.py +329 -0
  30. slm_eval/defaults.py +51 -0
  31. slm_eval/eval_avg.py +228 -0
  32. slm_eval/evaluator.py +714 -0
  33. slm_eval/evaluator_utils.py +540 -0
  34. slm_eval/filters/__init__.py +33 -0
  35. slm_eval/filters/custom.py +17 -0
  36. slm_eval/filters/decontamination.py +25 -0
  37. slm_eval/filters/extraction.py +247 -0
  38. slm_eval/filters/selection.py +61 -0
  39. slm_eval/filters/transformation.py +123 -0
  40. slm_eval/int_index.py +330 -0
  41. slm_eval/loggers/__init__.py +3 -0
  42. slm_eval/loggers/evaluation_tracker.py +586 -0
  43. slm_eval/loggers/trackio_logger.py +200 -0
  44. slm_eval/loggers/utils.py +172 -0
  45. slm_eval/loggers/wandb_logger.py +360 -0
  46. slm_eval/models/__init__.py +83 -0
  47. slm_eval/models/_onnx_base.py +311 -0
  48. slm_eval/models/anthropic_llms.py +385 -0
  49. slm_eval/models/api_models.py +880 -0
  50. slm_eval/models/dummy.py +67 -0
  51. slm_eval/models/gguf.py +307 -0
  52. slm_eval/models/hf_audiolm.py +301 -0
  53. slm_eval/models/hf_steered.py +280 -0
  54. slm_eval/models/hf_vlms.py +750 -0
  55. slm_eval/models/huggingface.py +1782 -0
  56. slm_eval/models/ibm_watsonx_ai.py +477 -0
  57. slm_eval/models/litellm_llms.py +157 -0
  58. slm_eval/models/mamba_lm.py +164 -0
  59. slm_eval/models/megatron_lm.py +1350 -0
  60. slm_eval/models/mistral3.py +96 -0
  61. slm_eval/models/nemo_lm.py +548 -0
  62. slm_eval/models/neuron_optimum.py +685 -0
  63. slm_eval/models/onnxruntime_genai.py +151 -0
  64. slm_eval/models/onnxruntime_ort.py +303 -0
  65. slm_eval/models/openai_completions.py +402 -0
  66. slm_eval/models/optimum_habana.py +187 -0
  67. slm_eval/models/optimum_ipex.py +79 -0
  68. slm_eval/models/optimum_lm.py +88 -0
  69. slm_eval/models/sglang_causallms.py +533 -0
  70. slm_eval/models/sglang_generate_API.py +100 -0
  71. slm_eval/models/textsynth.py +172 -0
  72. slm_eval/models/trtllm_causallms.py +631 -0
  73. slm_eval/models/utils.py +987 -0
  74. slm_eval/models/utils_hf.py +129 -0
  75. slm_eval/models/vllm_causallms.py +824 -0
  76. slm_eval/models/vllm_vlms.py +318 -0
  77. slm_eval/models/winml.py +152 -0
  78. slm_eval/prompts/__init__.py +130 -0
  79. slm_eval/result_schema.py +217 -0
  80. slm_eval/tasks/README.md +32 -0
  81. slm_eval/tasks/__init__.py +177 -0
  82. slm_eval/tasks/__pycache__/__init__.cpython-312.pyc +0 -0
  83. slm_eval/tasks/__pycache__/_factory.cpython-312.pyc +0 -0
  84. slm_eval/tasks/__pycache__/_index.cpython-312.pyc +0 -0
  85. slm_eval/tasks/__pycache__/_yaml_loader.cpython-312.pyc +0 -0
  86. slm_eval/tasks/__pycache__/manager.cpython-312.pyc +0 -0
  87. slm_eval/tasks/_factory.py +285 -0
  88. slm_eval/tasks/_index.py +199 -0
  89. slm_eval/tasks/_yaml_loader.py +208 -0
  90. slm_eval/tasks/manager.py +367 -0
  91. slm_eval/tasks/slm/CONVENTIONS.md +136 -0
  92. slm_eval/tasks/slm/__init__.py +5 -0
  93. slm_eval/tasks/slm/__pycache__/__init__.cpython-312.pyc +0 -0
  94. slm_eval/tasks/slm/__pycache__/_shared.cpython-312.pyc +0 -0
  95. slm_eval/tasks/slm/_shared.py +67 -0
  96. slm_eval/tasks/slm/arc_challenge/README.md +112 -0
  97. slm_eval/tasks/slm/arc_challenge/__pycache__/utils.cpython-312.pyc +0 -0
  98. slm_eval/tasks/slm/arc_challenge/arc_challenge.yaml +42 -0
  99. slm_eval/tasks/slm/arc_challenge/utils.py +74 -0
  100. slm_eval/tasks/slm/arc_easy/README.md +116 -0
  101. slm_eval/tasks/slm/arc_easy/__pycache__/utils.cpython-312.pyc +0 -0
  102. slm_eval/tasks/slm/arc_easy/arc_easy.yaml +42 -0
  103. slm_eval/tasks/slm/arc_easy/utils.py +73 -0
  104. slm_eval/tasks/slm/arithmark_2/README.md +42 -0
  105. slm_eval/tasks/slm/arithmark_2/__pycache__/utils.cpython-312.pyc +0 -0
  106. slm_eval/tasks/slm/arithmark_2/arithmark_2.yaml +30 -0
  107. slm_eval/tasks/slm/arithmark_2/utils.py +56 -0
  108. slm_eval/tasks/slm/arithmark_3_0/README.md +83 -0
  109. slm_eval/tasks/slm/arithmark_3_0/__pycache__/utils.cpython-312.pyc +0 -0
  110. slm_eval/tasks/slm/arithmark_3_0/arithmark_3_0.yaml +27 -0
  111. slm_eval/tasks/slm/arithmark_3_0/utils.py +53 -0
  112. slm_eval/tasks/slm/bfcl_v4/README.md +179 -0
  113. slm_eval/tasks/slm/bfcl_v4/__pycache__/utils.cpython-312.pyc +0 -0
  114. slm_eval/tasks/slm/bfcl_v4/bfcl_v4.yaml +43 -0
  115. slm_eval/tasks/slm/bfcl_v4/bfcl_v4_irrelevance.yaml +49 -0
  116. slm_eval/tasks/slm/bfcl_v4/bfcl_v4_multi_turn_base.yaml +50 -0
  117. slm_eval/tasks/slm/bfcl_v4/bfcl_v4_multi_turn_long_context.yaml +49 -0
  118. slm_eval/tasks/slm/bfcl_v4/bfcl_v4_multi_turn_miss_func.yaml +49 -0
  119. slm_eval/tasks/slm/bfcl_v4/bfcl_v4_multi_turn_miss_param.yaml +49 -0
  120. slm_eval/tasks/slm/bfcl_v4/bfcl_v4_multiple.yaml +49 -0
  121. slm_eval/tasks/slm/bfcl_v4/bfcl_v4_parallel.yaml +49 -0
  122. slm_eval/tasks/slm/bfcl_v4/bfcl_v4_parallel_multiple.yaml +49 -0
  123. slm_eval/tasks/slm/bfcl_v4/bfcl_v4_simple_java.yaml +50 -0
  124. slm_eval/tasks/slm/bfcl_v4/bfcl_v4_simple_javascript.yaml +50 -0
  125. slm_eval/tasks/slm/bfcl_v4/bfcl_v4_simple_python.yaml +48 -0
  126. slm_eval/tasks/slm/bfcl_v4/utils.py +713 -0
  127. slm_eval/tasks/slm/gpqa_diamond/README.md +120 -0
  128. slm_eval/tasks/slm/gpqa_diamond/__pycache__/utils.cpython-312.pyc +0 -0
  129. slm_eval/tasks/slm/gpqa_diamond/gpqa_diamond.yaml +37 -0
  130. slm_eval/tasks/slm/gpqa_diamond/utils.py +320 -0
  131. slm_eval/tasks/slm/hellaswag/README.md +104 -0
  132. slm_eval/tasks/slm/hellaswag/__pycache__/utils.cpython-312.pyc +0 -0
  133. slm_eval/tasks/slm/hellaswag/hellaswag.yaml +36 -0
  134. slm_eval/tasks/slm/hellaswag/utils.py +69 -0
  135. slm_eval/tasks/slm/int_index/README.md +82 -0
  136. slm_eval/tasks/slm/int_index/int_index.yaml +36 -0
  137. slm_eval/tasks/slm/math_500/README.md +79 -0
  138. slm_eval/tasks/slm/math_500/__pycache__/utils.cpython-312.pyc +0 -0
  139. slm_eval/tasks/slm/math_500/math_500.yaml +40 -0
  140. slm_eval/tasks/slm/math_500/utils.py +160 -0
  141. slm_eval/utils.py +927 -0
  142. slm_eval-0.0.1.dist-info/METADATA +328 -0
  143. slm_eval-0.0.1.dist-info/RECORD +149 -0
  144. slm_eval-0.0.1.dist-info/WHEEL +5 -0
  145. slm_eval-0.0.1.dist-info/entry_points.txt +3 -0
  146. slm_eval-0.0.1.dist-info/licenses/LICENSE.md +21 -0
  147. slm_eval-0.0.1.dist-info/licenses/LICENSE_NOTES.md +118 -0
  148. slm_eval-0.0.1.dist-info/licenses/NOTICE +56 -0
  149. slm_eval-0.0.1.dist-info/top_level.txt +1 -0
slm_eval/__init__.py ADDED
@@ -0,0 +1,29 @@
1
+ import importlib.metadata
2
+ import logging
3
+ import os
4
+ from importlib.util import find_spec
5
+
6
+
7
+ __version__ = importlib.metadata.version("slm_eval")
8
+
9
+
10
+ # Enable high-performance transfers
11
+ os.environ.setdefault("HF_XET_HIGH_PERFORMANCE", "1") # huggingface_hub >= 0.32.0
12
+ if find_spec("hf_transfer") is not None:
13
+ os.environ.setdefault("HF_HUB_ENABLE_HF_TRANSFER", "1") # legacy hf_transfer
14
+
15
+
16
+ # Lazy-load .evaluator module to improve CLI startup
17
+ def __getattr__(name):
18
+ if name == "evaluate":
19
+ from .evaluator import evaluate
20
+
21
+ return evaluate
22
+ elif name == "simple_evaluate":
23
+ from .evaluator import simple_evaluate
24
+
25
+ return simple_evaluate
26
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
27
+
28
+
29
+ __all__ = ["evaluate", "simple_evaluate", "__version__"]
slm_eval/__main__.py ADDED
@@ -0,0 +1,14 @@
1
+ from slm_eval._cli import HarnessCLI
2
+ from slm_eval.utils import setup_logging
3
+
4
+
5
+ def cli_evaluate() -> None:
6
+ """Main CLI entry point."""
7
+ setup_logging()
8
+ parser = HarnessCLI()
9
+ args = parser.parse_args()
10
+ parser.execute(args)
11
+
12
+
13
+ if __name__ == "__main__":
14
+ cli_evaluate()
@@ -0,0 +1,8 @@
1
+ """
2
+ CLI subcommands to run from the terminal.
3
+ """
4
+
5
+ from .harness import HarnessCLI
6
+
7
+
8
+ __all__ = ["HarnessCLI"]
@@ -0,0 +1,60 @@
1
+ import argparse
2
+ import sys
3
+ import textwrap
4
+
5
+ from slm_eval._cli.ls import List
6
+ from slm_eval._cli.run import Run
7
+ from slm_eval._cli.validate import Validate
8
+
9
+
10
+ class HarnessCLI:
11
+ """Main CLI parser that manages all subcommands."""
12
+
13
+ def __init__(self):
14
+ self._parser = argparse.ArgumentParser(
15
+ prog="slm-eval",
16
+ description="slm_eval: an evaluation suite for small language models",
17
+ epilog=textwrap.dedent("""
18
+ quick start:
19
+ # Basic evaluation
20
+ slm-eval run --model hf --model_args pretrained=gpt2 --tasks hellaswag
21
+
22
+ # List available tasks
23
+ slm-eval ls tasks
24
+
25
+ # Validate task configurations
26
+ slm-eval validate --tasks hellaswag,arc_easy
27
+
28
+ legacy compatibility:
29
+ The harness maintains backward compatibility with the original interface.
30
+ If no command is specified, 'run' is automatically inserted:
31
+
32
+ slm-eval --model hf --tasks hellaswag # Equivalent to 'slm-eval run --model hf --tasks hellaswag'
33
+
34
+ For documentation, visit: docs/interface.md
35
+ """),
36
+ formatter_class=argparse.RawDescriptionHelpFormatter,
37
+ )
38
+ self._parser.set_defaults(func=lambda args: self._parser.print_help())
39
+ self._subparsers = self._parser.add_subparsers(
40
+ dest="command", help="Available commands", metavar="COMMAND"
41
+ )
42
+ Run.create(self._subparsers)
43
+ List.create(self._subparsers)
44
+ Validate.create(self._subparsers)
45
+
46
+ def parse_args(self) -> argparse.Namespace:
47
+ """Parse arguments using the main parser."""
48
+ if len(sys.argv) > 2 and sys.argv[1] not in self._subparsers.choices:
49
+ # Backward compatibility: arguments provided but no valid subcommand - insert 'run'
50
+ # TODO: add warning
51
+ sys.argv.insert(1, "run")
52
+ elif len(sys.argv) == 2 and "run" in sys.argv:
53
+ # if only 'run' is specified, ensure it is treated as a subcommand
54
+ self._subparsers.choices["run"].print_help()
55
+ sys.exit(0)
56
+ return self._parser.parse_args()
57
+
58
+ def execute(self, args: argparse.Namespace) -> None:
59
+ """Main execution method that handles subcommands and legacy support."""
60
+ args.func(args)
slm_eval/_cli/ls.py ADDED
@@ -0,0 +1,81 @@
1
+ import argparse
2
+ import textwrap
3
+
4
+ from slm_eval._cli.subcommand import SubCommand
5
+
6
+
7
+ class List(SubCommand):
8
+ """Command for listing available tasks."""
9
+
10
+ def __init__(self, subparsers: argparse._SubParsersAction, *args, **kwargs):
11
+ # Create and configure the parser
12
+ super().__init__(*args, **kwargs)
13
+ self._parser = subparsers.add_parser(
14
+ "ls",
15
+ help="List available tasks, groups, subtasks, or tags",
16
+ description="List available tasks, groups, subtasks, or tags from the evaluation harness.",
17
+ usage="slm-eval list [tasks|groups|subtasks|tags] [--include_path DIR]",
18
+ epilog=textwrap.dedent("""
19
+ examples:
20
+ # List all available tasks (includes groups, subtasks, and tags)
21
+ $ slm-eval ls tasks
22
+
23
+ # List only task groups (like 'bfcl_v4', 'int_index')
24
+ $ slm-eval ls groups
25
+
26
+ # List only individual subtasks (like 'bfcl_v4_simple_python')
27
+ $ slm-eval ls subtasks
28
+
29
+ # Include external task definitions
30
+ $ slm-eval ls tasks --include_path /path/to/external/tasks
31
+
32
+ # List tasks from multiple external paths
33
+ $ slm-eval ls tasks --include_path "/path/to/tasks1:/path/to/tasks2"
34
+
35
+ organization:
36
+ • Groups: Collections of tasks with aggregated metric across subtasks (e.g., 'bfcl_v4')
37
+ • Subtasks: Individual evaluation tasks (e.g., 'bfcl_v4_simple_python', 'hellaswag')
38
+ • Tags: Similar to groups but no aggregate metric (e.g., 'reasoning', 'knowledge', 'language')
39
+ • External Tasks: Custom tasks defined in external directories
40
+
41
+ evaluation usage:
42
+ After listing tasks, use them with the run command!
43
+
44
+ For more information, task configs are defined in slm_eval/tasks/slm
45
+ """),
46
+ formatter_class=argparse.RawDescriptionHelpFormatter,
47
+ )
48
+ self._add_args()
49
+ self._parser.set_defaults(func=self._execute)
50
+
51
+ def _add_args(self) -> None:
52
+ self._parser.add_argument(
53
+ "what",
54
+ choices=["tasks", "groups", "subtasks", "tags"],
55
+ nargs="?",
56
+ help="What to list: tasks (all), groups, subtasks, or tags",
57
+ )
58
+ self._parser.add_argument(
59
+ "--include_path",
60
+ type=str,
61
+ default=None,
62
+ metavar="DIR",
63
+ help="Additional path to include if there are external tasks.",
64
+ )
65
+
66
+ def _execute(self, args: argparse.Namespace) -> None:
67
+ """Execute the list command."""
68
+ from slm_eval.tasks import TaskManager
69
+
70
+ task_manager = TaskManager(include_path=args.include_path)
71
+
72
+ if args.what == "tasks":
73
+ print(task_manager.list_all_tasks())
74
+ elif args.what == "groups":
75
+ print(task_manager.list_all_tasks(list_subtasks=False, list_tags=False))
76
+ elif args.what == "subtasks":
77
+ print(task_manager.list_all_tasks(list_groups=False, list_tags=False))
78
+ elif args.what == "tags":
79
+ print(task_manager.list_all_tasks(list_groups=False, list_subtasks=False))
80
+ elif args.what is None:
81
+ self._parser.print_help()