slm-eval 0.0.1__tar.gz

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 (158) hide show
  1. slm_eval-0.0.1/LICENSE.md +21 -0
  2. slm_eval-0.0.1/LICENSE_NOTES.md +118 -0
  3. slm_eval-0.0.1/MANIFEST.in +1 -0
  4. slm_eval-0.0.1/NOTICE +56 -0
  5. slm_eval-0.0.1/PKG-INFO +328 -0
  6. slm_eval-0.0.1/README.md +213 -0
  7. slm_eval-0.0.1/pyproject.toml +167 -0
  8. slm_eval-0.0.1/setup.cfg +4 -0
  9. slm_eval-0.0.1/slm_eval/__init__.py +29 -0
  10. slm_eval-0.0.1/slm_eval/__main__.py +14 -0
  11. slm_eval-0.0.1/slm_eval/_cli/__init__.py +8 -0
  12. slm_eval-0.0.1/slm_eval/_cli/harness.py +60 -0
  13. slm_eval-0.0.1/slm_eval/_cli/ls.py +81 -0
  14. slm_eval-0.0.1/slm_eval/_cli/run.py +518 -0
  15. slm_eval-0.0.1/slm_eval/_cli/subcommand.py +19 -0
  16. slm_eval-0.0.1/slm_eval/_cli/utils.py +209 -0
  17. slm_eval-0.0.1/slm_eval/_cli/validate.py +112 -0
  18. slm_eval-0.0.1/slm_eval/api/__init__.py +0 -0
  19. slm_eval-0.0.1/slm_eval/api/filter.py +56 -0
  20. slm_eval-0.0.1/slm_eval/api/group.py +407 -0
  21. slm_eval-0.0.1/slm_eval/api/instance.py +38 -0
  22. slm_eval-0.0.1/slm_eval/api/metrics.py +695 -0
  23. slm_eval-0.0.1/slm_eval/api/model.py +571 -0
  24. slm_eval-0.0.1/slm_eval/api/registry.py +884 -0
  25. slm_eval-0.0.1/slm_eval/api/samplers.py +144 -0
  26. slm_eval-0.0.1/slm_eval/api/task.py +1808 -0
  27. slm_eval-0.0.1/slm_eval/api/utils.py +100 -0
  28. slm_eval-0.0.1/slm_eval/caching/__init__.py +0 -0
  29. slm_eval-0.0.1/slm_eval/caching/cache.py +88 -0
  30. slm_eval-0.0.1/slm_eval/config/__init__.py +6 -0
  31. slm_eval-0.0.1/slm_eval/config/evaluate_config.py +505 -0
  32. slm_eval-0.0.1/slm_eval/config/group.py +123 -0
  33. slm_eval-0.0.1/slm_eval/config/task.py +218 -0
  34. slm_eval-0.0.1/slm_eval/decontamination/__init__.py +0 -0
  35. slm_eval-0.0.1/slm_eval/decontamination/archiver.py +174 -0
  36. slm_eval-0.0.1/slm_eval/decontamination/decontaminate.py +166 -0
  37. slm_eval-0.0.1/slm_eval/decontamination/janitor.py +329 -0
  38. slm_eval-0.0.1/slm_eval/defaults.py +51 -0
  39. slm_eval-0.0.1/slm_eval/eval_avg.py +228 -0
  40. slm_eval-0.0.1/slm_eval/evaluator.py +714 -0
  41. slm_eval-0.0.1/slm_eval/evaluator_utils.py +540 -0
  42. slm_eval-0.0.1/slm_eval/filters/__init__.py +33 -0
  43. slm_eval-0.0.1/slm_eval/filters/custom.py +17 -0
  44. slm_eval-0.0.1/slm_eval/filters/decontamination.py +25 -0
  45. slm_eval-0.0.1/slm_eval/filters/extraction.py +247 -0
  46. slm_eval-0.0.1/slm_eval/filters/selection.py +61 -0
  47. slm_eval-0.0.1/slm_eval/filters/transformation.py +123 -0
  48. slm_eval-0.0.1/slm_eval/int_index.py +330 -0
  49. slm_eval-0.0.1/slm_eval/loggers/__init__.py +3 -0
  50. slm_eval-0.0.1/slm_eval/loggers/evaluation_tracker.py +586 -0
  51. slm_eval-0.0.1/slm_eval/loggers/trackio_logger.py +200 -0
  52. slm_eval-0.0.1/slm_eval/loggers/utils.py +172 -0
  53. slm_eval-0.0.1/slm_eval/loggers/wandb_logger.py +360 -0
  54. slm_eval-0.0.1/slm_eval/models/__init__.py +83 -0
  55. slm_eval-0.0.1/slm_eval/models/_onnx_base.py +311 -0
  56. slm_eval-0.0.1/slm_eval/models/anthropic_llms.py +385 -0
  57. slm_eval-0.0.1/slm_eval/models/api_models.py +880 -0
  58. slm_eval-0.0.1/slm_eval/models/dummy.py +67 -0
  59. slm_eval-0.0.1/slm_eval/models/gguf.py +307 -0
  60. slm_eval-0.0.1/slm_eval/models/hf_audiolm.py +301 -0
  61. slm_eval-0.0.1/slm_eval/models/hf_steered.py +280 -0
  62. slm_eval-0.0.1/slm_eval/models/hf_vlms.py +750 -0
  63. slm_eval-0.0.1/slm_eval/models/huggingface.py +1782 -0
  64. slm_eval-0.0.1/slm_eval/models/ibm_watsonx_ai.py +477 -0
  65. slm_eval-0.0.1/slm_eval/models/litellm_llms.py +157 -0
  66. slm_eval-0.0.1/slm_eval/models/mamba_lm.py +164 -0
  67. slm_eval-0.0.1/slm_eval/models/megatron_lm.py +1350 -0
  68. slm_eval-0.0.1/slm_eval/models/mistral3.py +96 -0
  69. slm_eval-0.0.1/slm_eval/models/nemo_lm.py +548 -0
  70. slm_eval-0.0.1/slm_eval/models/neuron_optimum.py +685 -0
  71. slm_eval-0.0.1/slm_eval/models/onnxruntime_genai.py +151 -0
  72. slm_eval-0.0.1/slm_eval/models/onnxruntime_ort.py +303 -0
  73. slm_eval-0.0.1/slm_eval/models/openai_completions.py +402 -0
  74. slm_eval-0.0.1/slm_eval/models/optimum_habana.py +187 -0
  75. slm_eval-0.0.1/slm_eval/models/optimum_ipex.py +79 -0
  76. slm_eval-0.0.1/slm_eval/models/optimum_lm.py +88 -0
  77. slm_eval-0.0.1/slm_eval/models/sglang_causallms.py +533 -0
  78. slm_eval-0.0.1/slm_eval/models/sglang_generate_API.py +100 -0
  79. slm_eval-0.0.1/slm_eval/models/textsynth.py +172 -0
  80. slm_eval-0.0.1/slm_eval/models/trtllm_causallms.py +631 -0
  81. slm_eval-0.0.1/slm_eval/models/utils.py +987 -0
  82. slm_eval-0.0.1/slm_eval/models/utils_hf.py +129 -0
  83. slm_eval-0.0.1/slm_eval/models/vllm_causallms.py +824 -0
  84. slm_eval-0.0.1/slm_eval/models/vllm_vlms.py +318 -0
  85. slm_eval-0.0.1/slm_eval/models/winml.py +152 -0
  86. slm_eval-0.0.1/slm_eval/prompts/__init__.py +130 -0
  87. slm_eval-0.0.1/slm_eval/result_schema.py +217 -0
  88. slm_eval-0.0.1/slm_eval/tasks/README.md +32 -0
  89. slm_eval-0.0.1/slm_eval/tasks/__init__.py +177 -0
  90. slm_eval-0.0.1/slm_eval/tasks/__pycache__/__init__.cpython-312.pyc +0 -0
  91. slm_eval-0.0.1/slm_eval/tasks/__pycache__/_factory.cpython-312.pyc +0 -0
  92. slm_eval-0.0.1/slm_eval/tasks/__pycache__/_index.cpython-312.pyc +0 -0
  93. slm_eval-0.0.1/slm_eval/tasks/__pycache__/_yaml_loader.cpython-312.pyc +0 -0
  94. slm_eval-0.0.1/slm_eval/tasks/__pycache__/manager.cpython-312.pyc +0 -0
  95. slm_eval-0.0.1/slm_eval/tasks/_factory.py +285 -0
  96. slm_eval-0.0.1/slm_eval/tasks/_index.py +199 -0
  97. slm_eval-0.0.1/slm_eval/tasks/_yaml_loader.py +208 -0
  98. slm_eval-0.0.1/slm_eval/tasks/manager.py +367 -0
  99. slm_eval-0.0.1/slm_eval/tasks/slm/CONVENTIONS.md +136 -0
  100. slm_eval-0.0.1/slm_eval/tasks/slm/__init__.py +5 -0
  101. slm_eval-0.0.1/slm_eval/tasks/slm/__pycache__/__init__.cpython-312.pyc +0 -0
  102. slm_eval-0.0.1/slm_eval/tasks/slm/__pycache__/_shared.cpython-312.pyc +0 -0
  103. slm_eval-0.0.1/slm_eval/tasks/slm/_shared.py +67 -0
  104. slm_eval-0.0.1/slm_eval/tasks/slm/arc_challenge/README.md +112 -0
  105. slm_eval-0.0.1/slm_eval/tasks/slm/arc_challenge/__pycache__/utils.cpython-312.pyc +0 -0
  106. slm_eval-0.0.1/slm_eval/tasks/slm/arc_challenge/arc_challenge.yaml +42 -0
  107. slm_eval-0.0.1/slm_eval/tasks/slm/arc_challenge/utils.py +74 -0
  108. slm_eval-0.0.1/slm_eval/tasks/slm/arc_easy/README.md +116 -0
  109. slm_eval-0.0.1/slm_eval/tasks/slm/arc_easy/__pycache__/utils.cpython-312.pyc +0 -0
  110. slm_eval-0.0.1/slm_eval/tasks/slm/arc_easy/arc_easy.yaml +42 -0
  111. slm_eval-0.0.1/slm_eval/tasks/slm/arc_easy/utils.py +73 -0
  112. slm_eval-0.0.1/slm_eval/tasks/slm/arithmark_2/README.md +42 -0
  113. slm_eval-0.0.1/slm_eval/tasks/slm/arithmark_2/__pycache__/utils.cpython-312.pyc +0 -0
  114. slm_eval-0.0.1/slm_eval/tasks/slm/arithmark_2/arithmark_2.yaml +30 -0
  115. slm_eval-0.0.1/slm_eval/tasks/slm/arithmark_2/utils.py +56 -0
  116. slm_eval-0.0.1/slm_eval/tasks/slm/arithmark_3_0/README.md +83 -0
  117. slm_eval-0.0.1/slm_eval/tasks/slm/arithmark_3_0/__pycache__/utils.cpython-312.pyc +0 -0
  118. slm_eval-0.0.1/slm_eval/tasks/slm/arithmark_3_0/arithmark_3_0.yaml +27 -0
  119. slm_eval-0.0.1/slm_eval/tasks/slm/arithmark_3_0/utils.py +53 -0
  120. slm_eval-0.0.1/slm_eval/tasks/slm/bfcl_v4/README.md +179 -0
  121. slm_eval-0.0.1/slm_eval/tasks/slm/bfcl_v4/__pycache__/utils.cpython-312.pyc +0 -0
  122. slm_eval-0.0.1/slm_eval/tasks/slm/bfcl_v4/bfcl_v4.yaml +43 -0
  123. slm_eval-0.0.1/slm_eval/tasks/slm/bfcl_v4/bfcl_v4_irrelevance.yaml +49 -0
  124. slm_eval-0.0.1/slm_eval/tasks/slm/bfcl_v4/bfcl_v4_multi_turn_base.yaml +50 -0
  125. slm_eval-0.0.1/slm_eval/tasks/slm/bfcl_v4/bfcl_v4_multi_turn_long_context.yaml +49 -0
  126. slm_eval-0.0.1/slm_eval/tasks/slm/bfcl_v4/bfcl_v4_multi_turn_miss_func.yaml +49 -0
  127. slm_eval-0.0.1/slm_eval/tasks/slm/bfcl_v4/bfcl_v4_multi_turn_miss_param.yaml +49 -0
  128. slm_eval-0.0.1/slm_eval/tasks/slm/bfcl_v4/bfcl_v4_multiple.yaml +49 -0
  129. slm_eval-0.0.1/slm_eval/tasks/slm/bfcl_v4/bfcl_v4_parallel.yaml +49 -0
  130. slm_eval-0.0.1/slm_eval/tasks/slm/bfcl_v4/bfcl_v4_parallel_multiple.yaml +49 -0
  131. slm_eval-0.0.1/slm_eval/tasks/slm/bfcl_v4/bfcl_v4_simple_java.yaml +50 -0
  132. slm_eval-0.0.1/slm_eval/tasks/slm/bfcl_v4/bfcl_v4_simple_javascript.yaml +50 -0
  133. slm_eval-0.0.1/slm_eval/tasks/slm/bfcl_v4/bfcl_v4_simple_python.yaml +48 -0
  134. slm_eval-0.0.1/slm_eval/tasks/slm/bfcl_v4/utils.py +713 -0
  135. slm_eval-0.0.1/slm_eval/tasks/slm/gpqa_diamond/README.md +120 -0
  136. slm_eval-0.0.1/slm_eval/tasks/slm/gpqa_diamond/__pycache__/utils.cpython-312.pyc +0 -0
  137. slm_eval-0.0.1/slm_eval/tasks/slm/gpqa_diamond/gpqa_diamond.yaml +37 -0
  138. slm_eval-0.0.1/slm_eval/tasks/slm/gpqa_diamond/utils.py +320 -0
  139. slm_eval-0.0.1/slm_eval/tasks/slm/hellaswag/README.md +104 -0
  140. slm_eval-0.0.1/slm_eval/tasks/slm/hellaswag/__pycache__/utils.cpython-312.pyc +0 -0
  141. slm_eval-0.0.1/slm_eval/tasks/slm/hellaswag/hellaswag.yaml +36 -0
  142. slm_eval-0.0.1/slm_eval/tasks/slm/hellaswag/utils.py +69 -0
  143. slm_eval-0.0.1/slm_eval/tasks/slm/int_index/README.md +82 -0
  144. slm_eval-0.0.1/slm_eval/tasks/slm/int_index/int_index.yaml +36 -0
  145. slm_eval-0.0.1/slm_eval/tasks/slm/math_500/README.md +79 -0
  146. slm_eval-0.0.1/slm_eval/tasks/slm/math_500/__pycache__/utils.cpython-312.pyc +0 -0
  147. slm_eval-0.0.1/slm_eval/tasks/slm/math_500/math_500.yaml +40 -0
  148. slm_eval-0.0.1/slm_eval/tasks/slm/math_500/utils.py +160 -0
  149. slm_eval-0.0.1/slm_eval/utils.py +927 -0
  150. slm_eval-0.0.1/slm_eval.egg-info/PKG-INFO +328 -0
  151. slm_eval-0.0.1/slm_eval.egg-info/SOURCES.txt +156 -0
  152. slm_eval-0.0.1/slm_eval.egg-info/dependency_links.txt +1 -0
  153. slm_eval-0.0.1/slm_eval.egg-info/entry_points.txt +3 -0
  154. slm_eval-0.0.1/slm_eval.egg-info/requires.txt +115 -0
  155. slm_eval-0.0.1/slm_eval.egg-info/top_level.txt +1 -0
  156. slm_eval-0.0.1/tests/test_eval_avg.py +136 -0
  157. slm_eval-0.0.1/tests/test_scoring.py +483 -0
  158. slm_eval-0.0.1/tests/test_task_registry.py +155 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020 EleutherAI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,118 @@
1
+ # Licence notes for the supported benchmarks
2
+
3
+ `slm_eval` ships **task definitions and scoring code only**. It does not vendor
4
+ any benchmark dataset. Each task downloads its dataset at run time from the
5
+ publisher's own distribution point, so the publisher's licence applies to the
6
+ data and this project's MIT licence applies to the code.
7
+
8
+ Read this file before you use `slm_eval` for anything beyond internal research.
9
+
10
+ Metadata below was read from `https://huggingface.co/api/datasets/<id>` on
11
+ **2026-09-20**.
12
+
13
+ ## Rule for this project
14
+
15
+ A benchmark is only supported if it is 100% usable commercially. That means: no
16
+ NonCommercial clause, no NoDerivatives clause. Attribution requirements and
17
+ ShareAlike requirements are accepted, and this repository meets them. If a
18
+ benchmark's licence cannot be verified, the benchmark is not shipped.
19
+
20
+ ## Summary
21
+
22
+ | Benchmark | Task name | Dataset licence | Safe for commercial use? |
23
+ |---|---|---|---|
24
+ | HellaSwag | `hellaswag` | MIT (see note 1) | Yes |
25
+ | ARC Easy / ARC Challenge | `arc_easy`, `arc_challenge` | CC-BY-SA-4.0 | Yes, with attribution (note 2) |
26
+ | ArithMark 3.0 | `arithmark_3_0` | Apache-2.0 | Yes |
27
+ | ArithMark 2.0 | `arithmark_2` | Apache-2.0 | Yes |
28
+ | MATH-500 | `math_500` | MIT (see note 3) | Yes |
29
+ | GPQA Diamond | `gpqa_diamond` | CC-BY-4.0 | Yes, with attribution (note 4) |
30
+ | BFCL v4 | `bfcl_v4` | Apache-2.0 | Yes (note 6) |
31
+ | Int Index | `int_index` | derived from the above | Yes |
32
+
33
+ ## Notes
34
+
35
+ **1. HellaSwag.** The dataset metadata field is empty, which is why it usually
36
+ shows up as "unknown". The dataset card body states "Licensing Information: MIT",
37
+ and the accompanying GitHub repository (`rowanz/hellaswag`) carries an MIT
38
+ licence file. Treated as MIT. No attribution is required, but the source is
39
+ credited in `NOTICE` anyway.
40
+
41
+ **2. ARC (AI2 Reasoning Challenge).** The card metadata is
42
+ `['cc-by-sa-4.0']`. CC-BY-SA-4.0 permits commercial use. Two obligations apply
43
+ to the *data*: attribution, and ShareAlike on redistribution of a modified copy.
44
+ This project redistributes nothing: the task downloads `allenai/ai2_arc` at run
45
+ time and stores it in the HuggingFace cache. If you republish the ARC rows
46
+ yourself, you must carry the attribution and the same licence forward. The
47
+ attribution line is in `NOTICE`.
48
+
49
+ **3. MATH-500.** The dataset card metadata field is empty. The dataset is
50
+ published by HuggingFace under an MIT licence, and it is a 500-problem subset of
51
+ the MATH dataset (`hendrycks/competition_math`, MIT). Treated as MIT.
52
+
53
+ **4. GPQA Diamond.** Card metadata is `cc-by-4.0`, and the repository is gated
54
+ (`gated: auto`). CC-BY-4.0 permits commercial use and requires attribution. The
55
+ gating is about access, not about commercial terms: you must accept the terms on
56
+ Hugging Face and authenticate to load it. This task therefore tries the gated
57
+ source first and falls back to the open mirror `fingertap/GPQA-Diamond`, logging
58
+ which source it used. Attribution is in `NOTICE`.
59
+
60
+ **5. BFCL v4.** The task reads the data that the `bfcl-eval` Python package
61
+ ships, which comes from the `ShishirPatil/gorilla` repository under
62
+ Apache-2.0. The Apache-2.0 licence covers the Berkeley Function Calling
63
+ Leaderboard data and code.
64
+
65
+ ## Benchmarks that were removed
66
+
67
+ Each of these was checked and then removed, either because the licence fails the
68
+ rule above or because the benchmark is impractical for a CPU-only SLM suite.
69
+
70
+ **GSM-Symbolic (`apple/ml-gsm-symbolic`) — CC-BY-NC-ND-4.0.** NonCommercial and
71
+ NoDerivatives. Disqualified under every licence bar. Removed.
72
+
73
+ **AgentIF (`THU-KEG/AgentIF`) — CC-BY-NC-4.0.** NonCommercial. Removed.
74
+
75
+ **WildBench (`allenai/WildBench`).** Two problems. The benchmark is scored by an
76
+ LLM judge, so results are subjective, judge-biased, and billed per sample. The
77
+ underlying WildChat conversations are also released under AI2's ImpACT License
78
+ (Low Risk Artifacts), which is not an OSI licence and adds use restrictions.
79
+ Removed as too subjective and licence-encumbered.
80
+
81
+ **BrowseComp (`openai/BrowseCompLongContext`).** MIT licensed, but the benchmark
82
+ needs a live browsing agent and multi-step web search, which this suite cannot
83
+ provide. Removed as too complex.
84
+
85
+ **SWE-bench Lite (`princeton-nlp/SWE-bench_Lite`).** MIT licensed, but every
86
+ sample needs a full repository checkout and a Docker sandbox. Removed as too
87
+ heavy for a CPU-only suite.
88
+
89
+ **PIQA (`ybisk/piqa`) — licence unverifiable.** The card metadata is
90
+ `['unknown']`, and the card body states no licence. Commercial use therefore
91
+ cannot be verified, so PIQA is not shipped. This has one visible consequence:
92
+ PIQA is a published component of the Int Index. The published method drops an
93
+ unavailable component from both the numerator and the denominator, so the Int
94
+ Index here is computed as `(HellaSwag + ARC + 0.65 x ArithMark-3) / 2.65`.
95
+
96
+ **LiveCodeBench (`livecodebench/code_generation_lite`) — licence
97
+ unverifiable.** The dataset card metadata is the incomplete SPDX value `cc`,
98
+ which names no licence variant, so it covers CC-BY, CC-BY-NC and CC-BY-ND
99
+ alike. The repository that publishes the data
100
+ (`LiveCodeBench/LiveCodeBench`) is MIT, but that licence covers the software, and
101
+ the problems themselves are collected from LeetCode, AtCoder and Codeforces. No
102
+ grant that names a commercial-use-safe licence therefore covers the problem
103
+ data. Removed under the suite rule. This is the one removal that costs a whole
104
+ capability: the suite no longer ships a coding benchmark. To restore it, ask the
105
+ LiveCodeBench maintainers to state the dataset licence explicitly.
106
+
107
+ **BananaMind Base Bench 1.1
108
+ (`BananaMind/BananaMind-Base-Bench-1.1`) — licence unverifiable.** The card
109
+ metadata declares no licence and the repository is gated. Excluded until the
110
+ authors declare a licence. (The author's Hugging Face account is `Monster-Code`,
111
+ the same person who maintains this suite, so the exclusion can be lifted from
112
+ this side at any time by declaring a licence on the dataset card.)
113
+
114
+ ## Engine licence
115
+
116
+ The evaluation engine is the MIT-licensed LM Evaluation Harness by EleutherAI.
117
+ `LICENSE.md` retains that copyright notice, as the MIT licence requires.
118
+ `NOTICE` records the attribution.
@@ -0,0 +1 @@
1
+ recursive-include tests
slm_eval-0.0.1/NOTICE ADDED
@@ -0,0 +1,56 @@
1
+ slm_eval
2
+ ========
3
+
4
+ An evaluation suite for small language models, maintained by TheLimeDev
5
+ (GitHub: https://github.com/TheLimeDev, Hugging Face: https://huggingface.co/Monster-Code)
6
+
7
+ This product includes software developed by EleutherAI
8
+ (https://www.eleuther.ai/): the evaluation engine is derived from the
9
+ MIT-licensed LM Evaluation Harness. The MIT copyright notice is retained in
10
+ LICENSE.md. The task definitions for that engine were removed and replaced by
11
+ the benchmark tasks shipped here.
12
+
13
+
14
+ Benchmark data attribution
15
+ --------------------------
16
+
17
+ slm_eval ships task definitions and scoring code only. No benchmark dataset is
18
+ redistributed with this product: each task downloads its dataset at run time
19
+ from the publisher's own distribution point.
20
+
21
+ The following benchmark datasets require attribution, and are used under the
22
+ licence stated:
23
+
24
+ * ARC (AI2 Reasoning Challenge) -- tasks `arc_easy`, `arc_challenge`
25
+ Dataset: allenai/ai2_arc
26
+ Copyright Allen Institute for AI. Licensed under CC-BY-SA-4.0.
27
+ License text: https://creativecommons.org/licenses/by-sa/4.0/
28
+ Citation: Clark et al., "Think you have Solved Question Answering? Try ARC,
29
+ the AI2 Reasoning Challenge", arXiv:1803.05457.
30
+
31
+ * GPQA Diamond -- task `gpqa_diamond`
32
+ Dataset: Idavidrein/gpqa, with open mirror fingertap/GPQA-Diamond
33
+ Copyright the GPQA authors. Licensed under CC-BY-4.0.
34
+ License text: https://creativecommons.org/licenses/by/4.0/
35
+ Citation: Rein et al., "GPQA: A Graduate-Level Google-Proof Q&A Benchmark",
36
+ arXiv:2311.12022.
37
+
38
+ The remaining datasets are used under permissive licences and are credited here
39
+ for completeness:
40
+
41
+ * HellaSwag -- task `hellaswag` (MIT). Dataset: Rowan/hellaswag.
42
+ Citation: Zellers et al., "HellaSwag: Can a Machine Really Finish Your
43
+ Sentence?", arXiv:1905.07830.
44
+ * ArithMark 3.0 / ArithMark 2.0 -- tasks `arithmark_3_0`, `arithmark_2`
45
+ (Apache-2.0). Datasets: AxiomicLabs/Arithmark-3.0,
46
+ AxiomicLabs/ArithMark-2.0. Copyright Axiomic Labs.
47
+ * MATH-500 -- task `math_500` (MIT). Dataset: HuggingFaceH4/MATH-500.
48
+ A 500-problem subset of the MATH dataset by Hendrycks et al.,
49
+ "Measuring Mathematical Problem Solving With the MATH Dataset",
50
+ arXiv:2103.03874.
51
+ * BFCL v4 -- task `bfcl_v4` (Apache-2.0). Data shipped by the `bfcl-eval`
52
+ package, from the ShishirPatil/gorilla repository. Copyright the Gorilla
53
+ project authors.
54
+ * Int Index -- task group `int_index`. Not a dataset. The composite formula is
55
+ published by Axiomic Labs on the Open SLM Leaderboard:
56
+ https://huggingface.co/spaces/AxiomicLabs/Open_SLM_Leaderboard
@@ -0,0 +1,328 @@
1
+ Metadata-Version: 2.4
2
+ Name: slm_eval
3
+ Version: 0.0.1
4
+ Summary: An evaluation suite for small language models (SLMs) with objective, reproducible benchmarks
5
+ Author: TheLimeDev (@Monster-Code)
6
+ Maintainer: TheLimeDev (@Monster-Code)
7
+ License: MIT
8
+ Project-URL: Homepage, https://github.com/TheLimeDev/SLM-Eval
9
+ Project-URL: Repository, https://github.com/TheLimeDev/SLM-Eval
10
+ Project-URL: Author, https://github.com/TheLimeDev
11
+ Project-URL: Hugging-Face, https://huggingface.co/Monster-Code
12
+ Project-URL: Documentation, https://github.com/TheLimeDev/SLM-Eval/blob/main/docs/README.md
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Operating System :: OS Independent
16
+ Requires-Python: >=3.10
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE.md
19
+ License-File: LICENSE_NOTES.md
20
+ License-File: NOTICE
21
+ Requires-Dist: datasets>=2.16.0
22
+ Requires-Dist: numpy
23
+ Requires-Dist: evaluate>=0.4.0
24
+ Requires-Dist: jinja2
25
+ Requires-Dist: pytablewriter
26
+ Requires-Dist: rouge-score>=0.0.4
27
+ Requires-Dist: sacrebleu>=1.5.0
28
+ Requires-Dist: scikit-learn>=0.24.1
29
+ Requires-Dist: sqlitedict
30
+ Requires-Dist: dill
31
+ Requires-Dist: word2number
32
+ Requires-Dist: more_itertools
33
+ Requires-Dist: typing_extensions
34
+ Requires-Dist: tqdm>=4.59.0
35
+ Provides-Extra: api
36
+ Requires-Dist: requests; extra == "api"
37
+ Requires-Dist: aiohttp; extra == "api"
38
+ Requires-Dist: tenacity; extra == "api"
39
+ Requires-Dist: tqdm; extra == "api"
40
+ Requires-Dist: tiktoken; extra == "api"
41
+ Provides-Extra: archiver
42
+ Requires-Dist: jsonlines; extra == "archiver"
43
+ Requires-Dist: zstandard; extra == "archiver"
44
+ Provides-Extra: hf
45
+ Requires-Dist: transformers>=4.1; extra == "hf"
46
+ Requires-Dist: torch>=1.8; extra == "hf"
47
+ Requires-Dist: accelerate>=0.26.0; extra == "hf"
48
+ Requires-Dist: peft>=0.2.0; extra == "hf"
49
+ Provides-Extra: vllm
50
+ Requires-Dist: vllm>=0.18; extra == "vllm"
51
+ Provides-Extra: gptq
52
+ Requires-Dist: auto-gptq[triton]>=0.6.0; extra == "gptq"
53
+ Provides-Extra: gptqmodel
54
+ Requires-Dist: gptqmodel>=1.0.9; extra == "gptqmodel"
55
+ Provides-Extra: ipex
56
+ Requires-Dist: optimum-intel; extra == "ipex"
57
+ Provides-Extra: ibm-watsonx-ai
58
+ Requires-Dist: ibm_watsonx_ai>=1.1.22; extra == "ibm-watsonx-ai"
59
+ Requires-Dist: python-dotenv; extra == "ibm-watsonx-ai"
60
+ Provides-Extra: onnxruntime-genai
61
+ Requires-Dist: onnxruntime-genai; extra == "onnxruntime-genai"
62
+ Requires-Dist: transformers; extra == "onnxruntime-genai"
63
+ Requires-Dist: numpy; extra == "onnxruntime-genai"
64
+ Provides-Extra: onnxruntime
65
+ Requires-Dist: onnxruntime>=1.23; extra == "onnxruntime"
66
+ Requires-Dist: transformers; extra == "onnxruntime"
67
+ Requires-Dist: numpy; extra == "onnxruntime"
68
+ Provides-Extra: litellm
69
+ Requires-Dist: litellm<1.85,>=1.60; extra == "litellm"
70
+ Requires-Dist: aiohttp; extra == "litellm"
71
+ Requires-Dist: requests; extra == "litellm"
72
+ Requires-Dist: tenacity; extra == "litellm"
73
+ Requires-Dist: tqdm; extra == "litellm"
74
+ Provides-Extra: optimum
75
+ Requires-Dist: optimum[openvino]; extra == "optimum"
76
+ Provides-Extra: habana
77
+ Requires-Dist: optimum-habana; extra == "habana"
78
+ Provides-Extra: sparsify
79
+ Requires-Dist: sparsify; extra == "sparsify"
80
+ Provides-Extra: dev
81
+ Requires-Dist: pytest>=9.0; extra == "dev"
82
+ Requires-Dist: pytest-cov; extra == "dev"
83
+ Requires-Dist: pytest-xdist; extra == "dev"
84
+ Requires-Dist: requests; extra == "dev"
85
+ Requires-Dist: aiohttp; extra == "dev"
86
+ Requires-Dist: tenacity; extra == "dev"
87
+ Requires-Dist: tqdm; extra == "dev"
88
+ Requires-Dist: tiktoken; extra == "dev"
89
+ Requires-Dist: sentencepiece; extra == "dev"
90
+ Requires-Dist: pillow; extra == "dev"
91
+ Provides-Extra: ifeval
92
+ Requires-Dist: langdetect; extra == "ifeval"
93
+ Requires-Dist: immutabledict; extra == "ifeval"
94
+ Requires-Dist: nltk>=3.9.1; extra == "ifeval"
95
+ Provides-Extra: math
96
+ Requires-Dist: sympy>=1.12; extra == "math"
97
+ Requires-Dist: antlr4-python3-runtime==4.11; extra == "math"
98
+ Requires-Dist: math_verify[antlr4_11_0]; extra == "math"
99
+ Provides-Extra: benchmarks
100
+ Requires-Dist: slm_eval[math]; extra == "benchmarks"
101
+ Requires-Dist: slm_eval[ifeval]; extra == "benchmarks"
102
+ Requires-Dist: slm_eval[api]; extra == "benchmarks"
103
+ Provides-Extra: sentencepiece
104
+ Requires-Dist: sentencepiece>=0.1.98; extra == "sentencepiece"
105
+ Provides-Extra: trackio
106
+ Requires-Dist: trackio>=0.23.0; extra == "trackio"
107
+ Provides-Extra: wandb
108
+ Requires-Dist: wandb>=0.16.3; extra == "wandb"
109
+ Requires-Dist: pandas; extra == "wandb"
110
+ Requires-Dist: numpy; extra == "wandb"
111
+ Provides-Extra: zeno
112
+ Requires-Dist: pandas; extra == "zeno"
113
+ Requires-Dist: zeno-client; extra == "zeno"
114
+ Dynamic: license-file
115
+
116
+ # slm_eval
117
+
118
+ An evaluation suite for **small language models (SLMs)**. It ships a small,
119
+ hand-picked set of benchmarks, each chosen because it can be scored objectively,
120
+ reproducibly, and on a single CPU machine.
121
+
122
+ Maintained by [TheLimeDev](https://github.com/TheLimeDev)
123
+ (Hugging Face: [@Monster-Code](https://huggingface.co/Monster-Code)).
124
+
125
+ The evaluation engine, model backends, filters and metrics come from the
126
+ MIT-licensed LM Evaluation Harness by EleutherAI. All ~14,000 of its task
127
+ definitions were removed. Only the benchmarks below remain, so anything you
128
+ already know about running the engine still applies — the task registry is
129
+ different.
130
+
131
+ ## The supported benchmarks
132
+
133
+ | Task name | Benchmark | What it measures | Data source | Licence |
134
+ |---|---|---|---|---|
135
+ | `hellaswag` | HellaSwag | Commonsense continuation of a described activity | `Rowan/hellaswag` | MIT |
136
+ | `arc_easy` | ARC Easy | Grade-school science questions | `allenai/ai2_arc` (`ARC-Easy`) | CC-BY-SA-4.0 |
137
+ | `arc_challenge` | ARC Challenge | Harder science questions that retrieval alone does not solve | `allenai/ai2_arc` (`ARC-Challenge`) | CC-BY-SA-4.0 |
138
+ | `arithmark_3_0` | ArithMark 3.0 | Arithmetic continuation, resistant to memorisation | `AxiomicLabs/Arithmark-3.0` | Apache-2.0 |
139
+ | `arithmark_2` | ArithMark 2.0 | The predecessor of ArithMark 3.0 | `AxiomicLabs/ArithMark-2.0` | Apache-2.0 |
140
+ | `math_500` | MATH-500 | Competition mathematics needing multi-step reasoning | `HuggingFaceH4/MATH-500` | MIT |
141
+ | `gpqa_diamond` | GPQA Diamond | Graduate-level "Google-proof" science questions | `Idavidrein/gpqa`, mirror `fingertap/GPQA-Diamond` | CC-BY-4.0 |
142
+ | `bfcl_v4` | BFCL v4 | Function calling and JSON-schema adherence | `bfcl-eval` package data | Apache-2.0 |
143
+ | `int_index` | Int Index | A composite score over HellaSwag, ARC and ArithMark-3 | derived, not a dataset | n/a |
144
+
145
+ `int_index` is a group, not a dataset: it evaluates its component benchmarks and
146
+ then combines them with the published formula. See
147
+ `slm_eval/tasks/slm/int_index/README.md`.
148
+
149
+ ### Every licence here is usable commercially
150
+
151
+ No benchmark in this suite is NonCommercial (`NC`) or NoDerivatives (`ND`), and
152
+ every benchmark rests on a licence value that names a specific
153
+ commercial-use-safe licence. Two benchmarks carry obligations, and both are met
154
+ by this repository:
155
+
156
+ - **ARC** is CC-BY-SA-4.0. Attribution is required, and redistributing a
157
+ modified copy of the ARC data must stay under CC-BY-SA-4.0. This repository
158
+ never redistributes the data: the task downloads it from Hugging Face at run
159
+ time. The attribution is in `NOTICE` and in the task README.
160
+ - **GPQA** is CC-BY-4.0. Attribution is required. The public GPQA repository is
161
+ gated, so a Hugging Face token helps; without one the task falls back to an
162
+ open mirror and says so in the log. Attribution is in `NOTICE`.
163
+
164
+ Full research, with sources checked against the live dataset metadata, is in
165
+ `LICENSE_NOTES.md`.
166
+
167
+ ### Benchmarks that were removed, and why
168
+
169
+ | Benchmark | Reason |
170
+ |---|---|
171
+ | GSM-Symbolic | CC-BY-NC-ND-4.0: NonCommercial and NoDerivatives |
172
+ | AgentIF | CC-BY-NC-4.0: NonCommercial |
173
+ | WildBench | Subjective: needs an LLM judge, so results are biased and costly |
174
+ | BrowseComp | Too complex: needs a live browsing agent |
175
+ | SWE-bench Lite | Too heavy: needs a full Docker sandbox per sample |
176
+ | PIQA | The dataset card declares no licence, so commercial use cannot be verified |
177
+ | LiveCodeBench | The card declares only the unversioned `cc` tag, and the problems come from third-party contest sites |
178
+ | BananaMind Base Bench 1.1 | The dataset card declares no licence, and the repository is gated |
179
+
180
+ PIQA is a published component of the Int Index. Because it is not shipped here,
181
+ the Int Index is computed from HellaSwag, ARC and ArithMark-3 with a denominator
182
+ of 2.65, which is what the published method prescribes for a missing component.
183
+
184
+ LiveCodeBench is the only removal that costs a whole capability: the suite no
185
+ longer ships a coding benchmark. `LICENSE_NOTES.md` records the full reasoning.
186
+
187
+ ## Install
188
+
189
+ ```bash
190
+ pip install -e ".[hf,api,benchmarks]"
191
+ ```
192
+
193
+ `hf` provides the HuggingFace `transformers` backend. `benchmarks` adds the
194
+ scoring dependencies the tasks need (`math_verify`, `langdetect`, and friends).
195
+
196
+ ## Run
197
+
198
+ ```bash
199
+ # Everything at once. `slm` is a tag group: every task tagged `slm` runs.
200
+ python3 -m slm_eval \
201
+ --model hf --model_args pretrained=HuggingFaceTB/SmolLM2-135M \
202
+ --tasks slm --device cpu --batch_size 8
203
+
204
+ # One benchmark.
205
+ python3 -m slm_eval \
206
+ --model hf --model_args pretrained=HuggingFaceTB/SmolLM2-135M \
207
+ --tasks arithmark_3_0 --device cpu
208
+
209
+ # A quick wiring check on a few examples.
210
+ python3 -m slm_eval \
211
+ --model hf --model_args pretrained=HuggingFaceTB/SmolLM2-135M \
212
+ --tasks hellaswag --limit 16 --device cpu
213
+ ```
214
+
215
+ List the available tasks:
216
+
217
+ ```bash
218
+ python3 -m slm_eval ls tasks
219
+ ```
220
+
221
+ ## The Int Index
222
+
223
+ The Int Index is the composite score published on the Open SLM Leaderboard:
224
+
225
+ ```
226
+ N(score, chance) = 100 x (score - chance) / (100 - chance)
227
+
228
+ Int Index = (HellaSwag + ARC + PIQA + 0.65 x ArithMark-3) / 3.65
229
+ ```
230
+
231
+ Run the components in one pass, then compute the index from the saved results:
232
+
233
+ ```bash
234
+ python3 -m slm_eval --model hf \
235
+ --model_args pretrained=HuggingFaceTB/SmolLM2-135M \
236
+ --tasks int_index --device cpu --output_path logs/tiny-run
237
+
238
+ # The tracker writes logs/tiny-run/<model name>/results_<timestamp>.json,
239
+ # so let the shell expand the path.
240
+ python3 -m slm_eval.int_index --results logs/tiny-run/*/results_*.json
241
+ ```
242
+
243
+ The scale is small: chance level scores about 0, and the strongest reported
244
+ sub-10B models reach roughly 5. It is not a percentage. Each component is
245
+ rescaled so that guessing maps to 0 and a perfect score maps to 100.
246
+
247
+ ## Average percentage (`eval_avg`)
248
+
249
+ `eval_avg` is the plain number: the average of the per-benchmark percentages in
250
+ a result file, with no weighting and no chance correction.
251
+
252
+ ```bash
253
+ python3 -m slm_eval.eval_avg --results logs/tiny-run/*/results_*.json
254
+ ```
255
+
256
+ It picks exactly one metric per benchmark, in this order of preference:
257
+ `acc_norm`, `acc`, `exact_match`, `function_name_match`, `ast_match`,
258
+ `valid_json`. If a benchmark reports none of those, it uses its alphabetically
259
+ first scored metric. `acc_norm` is preferred because raw `acc` carries a
260
+ token-length bias.
261
+
262
+ Diagnostics such as `unparseable` and `output_emitted` measure the harness, not
263
+ the model, so they are never chosen. A benchmark with no usable metric is
264
+ reported as skipped and leaves the average, instead of counting as zero. The
265
+ printed table names the metric used for every benchmark, so the number stays
266
+ auditable.
267
+
268
+ `eval_avg` is a plain mean, so it is comparable only between runs over the same
269
+ benchmark set. It is not the Int Index, which is chance-corrected, weighted and
270
+ published.
271
+
272
+ ## Scoring tiers
273
+
274
+ `bfcl_v4` is built in two tiers:
275
+
276
+ - **Tier 1** always works. It builds the real prompt, generates a real response,
277
+ and computes a deterministic format or rule-based metric.
278
+ - **Tier 2** is the official metric. It is implemented, but gated behind an
279
+ explicit prerequisite. If you request it without the prerequisite, the task
280
+ raises a `RuntimeError` that names exactly what is missing. It never silently
281
+ returns zero.
282
+
283
+ | Task | Tier 1 | Tier 2 |
284
+ |---|---|---|
285
+ | `bfcl_v4` | `valid_json`, `function_name_match` | `ast_match`, needs `--metadata enable_tier2_metric=True` |
286
+
287
+ No shipped benchmark executes generated code: BFCL Tier 2 runs the official AST
288
+ checker over the predicted call. The engine still enforces
289
+ `--confirm_run_unsafe_code` for any task that marks itself unsafe, so a task added
290
+ later cannot execute code without that confirmation. Per-task limits and
291
+ prerequisites are documented in each task's `README.md`.
292
+
293
+ ## A note on the inherited documentation
294
+
295
+ `docs/`, `scripts/` and `examples/` document the engine, the CLI and the model
296
+ backends, which this suite does not change. Some examples inside them name
297
+ benchmarks that were removed here. For the tasks that do exist,
298
+ `slm_eval/tasks/slm/CONVENTIONS.md` and the per-task `README.md` files are
299
+ authoritative.
300
+
301
+ ## Layout
302
+
303
+ ```
304
+ slm_eval/ evaluation engine
305
+ int_index.py the Int Index composite calculator
306
+ eval_avg.py the plain average-percentage calculator
307
+ tasks/
308
+ CONVENTIONS.md the task authoring contract
309
+ slm/ the supported benchmarks live here
310
+ hellaswag/ arc_easy/ arc_challenge/
311
+ arithmark_2/ arithmark_3_0/
312
+ math_500/ gpqa_diamond/ bfcl_v4/
313
+ int_index/ composite group (not a dataset)
314
+ tests/ tests for this suite
315
+ LICENSE_NOTES.md licence research for every benchmark
316
+ NOTICE attribution for the CCPL benchmarks and the engine
317
+ ```
318
+
319
+ ## Add or change a task
320
+
321
+ Read `slm_eval/tasks/slm/CONVENTIONS.md`. Task discovery globs
322
+ `slm_eval/tasks/**/*.yaml`, so a new directory with a YAML file is enough.
323
+
324
+ ## Licence
325
+
326
+ The engine is MIT, from EleutherAI. `LICENSE.md` keeps that notice. See `NOTICE`
327
+ for the attribution required by the CC-BY-4.0 and CC-BY-SA-4.0 datasets, and
328
+ `LICENSE_NOTES.md` for the per-benchmark research.