Install any skill in seconds. Free to start, no credit card required.
Get Started Free →LLM evaluation framework (EleutherAI lm-evaluation-harness). Unified benchmark evaluation for language models with 200+ tasks, support for HuggingFace transformers, vLLM, SGLang, OpenAI API, GGUF, and custom models. Used by HuggingFace Open LLM Leaderboard. Covers MMLU, HellaSwag, ARC, GSM8K, HumanEval, BBH, TruthfulQA, and more.
.claude/skills/mkurman-lm-evaluation-harness/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | -38% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 81% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 75% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 58% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 77% | 0% |
| | leaderboard | MMLU, ARC, HellaSwag, TruthfulQA, Winogrande, GSM8K | Open LLM Leaderboard suite | | mmlu | 57 subjects (STEM, humanities, social sciences) | World knowledge + reasoning | | gsm8k | Grade-school math word problems | Mathematical reasoning | | hellaswag | Commonsense NLI | Commonsense reasoning | | arc_challenge | Science exam questions | Scientific reasoning | | truthfulqa | Adversarial questions | Truthfulness/hallucination | | humaneval | Python code generation | Coding ability | | bigbench | 200+ BIG-Bench tasks | Broad capability assessment | | ifeval | Instruction-following | Instruction adherence |
Run leaderboard suite:
bashlm-eval run \ --model hf \ --model_args pretrained=your-model \ --tasks leaderboard \ --device cuda:0 \ --batch_size auto
pythonfrom lm_eval import simple_evaluate results = simple_evaluate( model="hf", model_args={"pretrained": "meta-llama/Llama-3.2-1B"}, tasks=["mmlu", "hellaswag", "gsm8k"], device="cuda:0", batch_size="auto", limit=100, # Optional: limit samples per task ) # Access results for task, metrics in results["results"].items(): print(f"{task}: {metrics}") # Formatted table print(results["configs"]) print(results["samples"]) # Per-sample outputs
bashlm-eval run \ --model hf \ --model_args pretrained=meta-llama/Llama-3.2-1B,peft=/path/to/lora_adapter \ --tasks mmlu \ --device cuda:0
In Python:
pythonfrom lm_eval import simple_evaluate results = simple_evaluate( model="hf", model_args={ "pretrained": "meta-llama/Llama-3.2-1B", "peft": "/path/to/lora_adapter", }, tasks=["mmlu"], )
Data-parallel (model fits on single GPU):
bashaccelerate launch -m lm_eval \ --model hf \ --model_args pretrained=model-name \ --tasks lambada_openai,arc_easy \ --batch_size 16
Model-parallel (model too large for one GPU):
bashlm-eval run \ --model hf \ --model_args pretrained=model-name,parallelize=True \ --tasks mmlu \ --batch_size 8
Both (data + model parallel):
bashaccelerate launch --multi_gpu --num_processes 4 \ -m lm_eval \ --model hf \ --model_args pretrained=model-name,parallelize=True \ --tasks mmlu \ --batch_size 8
OpenAI-compatible API:
bashexport OPENAI_API_KEY=your-key lm-eval run \ --model openai-completions \ --model_args model=gpt-4o,base_url=https://api.openai.com/v1/completions \ --tasks mmlu \ --batch_size 32
Local server (vLLM served):
bashlm-eval run \ --model local-completions \ --model_args model=local-model,base_url=http://localhost:8000/v1/completions \ --tasks mmlu
Create a custom task at lm_eval/tasks/my_task/my_task.yaml:
yamltask: my_custom_task dataset_path: my-dataset dataset_name: default output_type: multiple_choice training_split: train validation_split: validation doc_to_text: "Question: {{question}}\nA. {{choices[0]}}\nB. {{choices[1]}}\nC. {{choices[2]}}\nD. {{choices[3]}}\nAnswer:" doc_to_target: "{{answer}}" doc_to_choice: "{{choices}}" metric_list: - metric: acc
Run it:
bashlm-eval run --model hf --model_args pretrained=model-name --tasks my_custom_task
bashlm-eval run \ --model hf \ --model_args pretrained=model-name \ --tasks mmlu \ --num_fewshot 5 \ --fewshot_random_seed 42
bash# JSON output lm-eval run --model hf --model_args pretrained=model-name \ --tasks mmlu --output_path results/ # W&B logging lm-eval run --model hf --model_args pretrained=model-name \ --tasks mmlu --wandb_args project=eval-runs
--batch_size auto — automatic batch size detection maximizes throughput--seed for reproducibility across evaluation runs--limit 100 during development to test task setup quickly| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→fail | 10,404 | 8,044 | -23% | 1 | 1 | 0% | 1,987 | 3,165 | +59% | 0 | 0 | — |
case-01 | fail→fail | 12,333 | 13,279 | +8% | 1 | 1 | 0% | 2,331 | 4,148 | +78% | 0 | 0 | — |
case-02 | pass→pass | 8,340 | 6,100 | -27% | 1 | 1 | 0% | 1,583 | 2,799 | +77% | 0 | 0 | — |
case-03 | pass→pass | 7,179 | 4,621 | -36% | 1 | 1 | 0% | 1,371 | 2,507 | +83% | 0 | 0 | — |
case-04 | pass→pass | 11,468 | 5,404 | -53% | 1 | 1 | 0% | 2,173 | 2,718 | +25% | 0 | 0 | — |
case-06 | pass→pass | 3,107 | 2,699 | -13% | 1 | 1 | 0% | 505 | 2,069 | +310% | 0 | 0 | — |
case-07 | pass→pass | 5,630 | 3,597 | -36% | 1 | 1 | 0% | 951 | 2,180 | +129% | 0 | 0 | — |
case-08 | pass→pass | 3,694 | 3,298 | -11% | 1 | 1 | 0% | 545 | 2,150 | +294% | 0 | 0 | — |
case-09 | pass→pass | 9,125 | 5,745 | -37% | 1 | 1 | 0% | 1,765 | 2,666 | +51% | 0 | 0 | — |
case-10 | pass→pass | 10,576 | 3,144 | -70% | 1 | 1 | 0% | 1,824 | 2,182 | +20% | 0 | 0 | — |
case-11 | fail→pass | 19,799 | 3,090 | -84% | 1 | 1 | 0% | 3,486 | 2,144 | -38% | 0 | 0 | — |
case-12 | pass→pass | 4,292 | 3,751 | -13% | 1 | 1 | 0% | 751 | 2,274 | +203% | 0 | 0 | — |
case-13 | fail→pass | 6,995 | 3,318 | -53% | 1 | 1 | 0% | 1,235 | 2,231 | +81% | 0 | 0 | — |
case-14 | pass→pass | 4,447 | 2,090 | -53% | 1 | 1 | 0% | 732 | 1,961 | +168% | 0 | 0 | — |
case-15 | pass→pass | 5,034 | 5,198 | +3% | 1 | 1 | 0% | 897 | 2,615 | +192% | 0 | 0 | — |
case-16 | fail→pass | 7,238 | 4,596 | -37% | 1 | 1 | 0% | 1,427 | 2,494 | +75% | 0 | 0 | — |
case-17 | pass→pass | 4,947 | 3,962 | -20% | 1 | 1 | 0% | 822 | 2,308 | +181% | 0 | 0 | — |
case-18 | fail→pass | 10,216 | 8,415 | -18% | 1 | 1 | 0% | 2,040 | 3,222 | +58% | 0 | 0 | — |
case-19 | pass→pass | 10,444 | 6,566 | -37% | 1 | 1 | 0% | 1,897 | 2,862 | +51% | 0 | 0 | — |
case-20 | pass→pass | 4,431 | 3,950 | -11% | 1 | 1 | 0% | 670 | 2,323 | +247% | 0 | 0 | — |
case-21 | pass→pass | 4,156 | 2,412 | -42% | 1 | 1 | 0% | 681 | 2,005 | +194% | 0 | 0 | — |
case-22 | pass→pass | 9,233 | 9,892 | +7% | 1 | 1 | 0% | 1,873 | 3,671 | +96% | 0 | 0 | — |
case-23 | pass→pass | 7,336 | 4,501 | -39% | 1 | 1 | 0% | 1,480 | 2,505 | +69% | 0 | 0 | — |
case-24 | pass→pass | 9,592 | 10,389 | +8% | 1 | 1 | 0% | 1,930 | 3,809 | +97% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted. The headline lift of +17 percentage points is the difference between those two pass rates over the 24 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.