语言模型评估工具
最新消息 📣
- [2024/07] API模型支持已更新和重构,引入了批处理和异步请求支持,并使其更易于自定义和使用。要运行Llama 405B,我们建议使用VLLM的OpenAI兼容API来托管模型,并使用
local-completions
模型类型来评估模型。 - [2024/07] 新增了Open LLM排行榜任务!您可以在leaderboard任务组中找到它们。
公告
lm-evaluation-harness的新版本v0.4.0现已发布!
新的更新和功能包括:
- 新增了Open LLM排行榜任务!您可以在leaderboard任务组中找到它们。
- 内部重构
- 基于配置的任务创建和配置
- 更容易导入和共享外部定义的任务配置YAML
- 支持Jinja2提示设计,轻松修改提示和从Promptsource导入提示
- 更高级的配置选项,包括输出后处理、答案提取、每个文档的多个LM生成、可配置的少样本设置等
- 加速和支持新的建模库,包括:更快的数据并行HF模型使用、vLLM支持、HuggingFace的MPS支持等
- 日志记录和可用性更改
- 新任务包括CoT BIG-Bench-Hard、Belebele、用户自定义任务分组等
请查看docs/
中更新的文档页面了解更多详情。
开发将继续在main
分支进行,我们鼓励您就所需功能和如何进一步改进库提供反馈,或在GitHub上的问题或PR中提出问题,或在EleutherAI discord中提问!
概述
该项目提供了一个统一的框架,用于在大量不同的评估任务上测试生成式语言模型。
特点:
- 超过60个针对LLM的标准学术基准测试,实现了数百个子任务和变体。
- 支持通过transformers(包括通过AutoGPTQ进行量化)、GPT-NeoX和Megatron-DeepSpeed加载的模型,具有灵活的分词无关接口。
- 支持使用vLLM进行快速和内存高效的推理。
- 支持商业API,包括OpenAI和TextSynth。
- 支持评估HuggingFace的PEFT库支持的适配器(如LoRA)。
- 支持本地模型和基准测试。
- 使用公开可用的提示进行评估,确保论文之间的可复现性和可比性。
- 轻松支持自定义提示和评估指标。
语言模型评估工具是🤗 Hugging Face流行的Open LLM排行榜的后端,已在数百篇论文中使用,并被NVIDIA、Cohere、BigScience、BigCode、Nous Research和Mosaic ML等数十个组织内部使用。
安装
要从GitHub仓库安装lm-eval
包,请运行:
git clone https://github.com/EleutherAI/lm-evaluation-harness
cd lm-evaluation-harness
pip install -e .
我们还提供了一些可选依赖项以扩展功能。详细表格可在本文档末尾查看。
基本用法
用户指南
此处提供了详细列出所有支持参数的用户指南,也可以在终端通过调用lm_eval -h
查看。或者,您可以使用lm-eval
代替lm_eval
。
可以通过lm-eval --tasks list
查看支持的任务(或任务分组)列表。此处提供了任务描述和相应子文件夹的链接。
Hugging Face transformers
要评估HuggingFace Hub上托管的模型(例如GPT-J-6B)在hellaswag
上的表现,可以使用以下命令(假设您正在使用兼容CUDA的GPU):
lm_eval --model hf \
--model_args pretrained=EleutherAI/gpt-j-6B \
--tasks hellaswag \
--device cuda:0 \
--batch_size 8
可以使用--model_args
标志向模型构造函数提供额外参数。最值得注意的是,这支持使用Hub上的revisions
功能来存储部分训练的检查点,或指定运行模型的数据类型:
lm_eval --model hf \
--model_args pretrained=EleutherAI/pythia-160m,revision=step100000,dtype="float" \
--tasks lambada_openai,hellaswag \
--device cuda:0 \
--batch_size 8
支持通过Huggingface的transformers.AutoModelForCausalLM
(自回归、仅解码器的GPT风格模型)和transformers.AutoModelForSeq2SeqLM
(如T5等编码器-解码器模型)加载的模型。
可以通过将--batch_size
标志设置为auto
来自动选择批量大小。这将自动检测适合您设备的最大批量大小。对于最长和最短示例之间存在很大差异的任务,定期重新计算最大批量大小可能会有所帮助,以获得进一步的加速。要做到这一点,请在上述标志后附加:N
以自动重新计算最大批量大小N
次。例如,要重新计算批量大小4次,命令应为:
lm_eval --model hf \
--model_args pretrained=EleutherAI/pythia-160m,revision=step100000,dtype="float" \
--tasks lambada_openai,hellaswag \
--device cuda:0 \
--batch_size auto:4
[!注意] 就像您可以为
transformers.AutoModel
提供本地路径一样,您也可以通过--model_args pretrained=/path/to/model
为lm_eval
提供本地路径
使用Hugging Face accelerate
进行多GPU评估
我们支持三种主要方式使用Hugging Face的accelerate 🚀库进行多GPU评估。
要执行数据并行评估(每个GPU加载模型的单独完整副本),我们利用accelerate
启动器如下:
accelerate launch -m lm_eval --model hf \
--tasks lambada_openai,arc_easy \
--batch_size 16
(或通过accelerate launch --no-python lm_eval
)。
对于模型可以适应单个GPU的情况,这允许您在K个GPU上的评估速度比在一个GPU上快K倍。
警告:此设置不适用于FSDP模型分片,因此在accelerate config
中必须禁用FSDP,或者必须使用NO_SHARD FSDP选项。
使用accelerate
进行多GPU评估的第二种方式是当您的模型太大而无法适应单个GPU时。
在这种情况下,在accelerate
启动器外运行库,但通过--model_args
传递parallelize=True
,如下所示:
lm_eval --model hf \
--tasks lambada_openai,arc_easy \
--model_args parallelize=True \
--batch_size 16
这意味着您的模型权重将在所有可用的GPU之间拆分。
对于更高级的用户或更大的模型,当parallelize=True
时,我们还允许以下参数:
device_map_option
:如何在可用的GPU之间拆分模型权重。默认为"auto"。max_memory_per_gpu
:加载模型时每个GPU使用的最大GPU内存。max_cpu_memory
:将模型权重卸载到RAM时使用的最大CPU内存量。offload_folder
:如果需要,模型权重将卸载到磁盘的文件夹。
第三个选项是同时使用这两种方式。这将允许您同时利用数据并行和模型分片,对于太大而无法适应单个GPU的模型特别有用。
accelerate launch --multi_gpu --num_processes {nb_of_copies_of_your_model} \
-m lm_eval --model hf \
--tasks lambada_openai,arc_easy \
--model_args parallelize=True \
--batch_size 16
要了解更多关于模型并行性以及如何与accelerate
库一起使用它的信息,请参阅accelerate文档
警告:我们不原生支持使用hf
模型类型进行多节点评估!请参考我们的GPT-NeoX库集成以获取编写自定义多机评估脚本的示例。
注意:我们目前不原生支持多节点评估,建议使用外部托管服务器运行推理请求,或创建与您的分布式框架的自定义集成如GPT-NeoX库所做的那样。
NVIDIA nemo
模型
NVIDIA NeMo框架是为从事语言模型研究的研究人员和pytorch开发人员构建的生成式AI框架。
要评估nemo
模型,首先按照文档安装NeMo。我们强烈建议使用NVIDIA PyTorch或NeMo容器,特别是如果在安装Apex或任何其他依赖项时遇到问题(请参阅最新发布的容器)。请按照安装部分的说明安装lm evaluation harness库。
可以通过NVIDIA NGC目录或NVIDIA的Hugging Face页面获取NeMo模型。在NVIDIA NeMo框架中有转换脚本,可以将流行模型如llama、falcon、mixtral或mpt的hf
检查点转换为nemo
。
在一个GPU上运行nemo
模型:
lm_eval --model nemo_lm \
--model_args path=<path_to_nemo_model> \
--tasks hellaswag \
--batch_size 32
建议解压nemo
模型,以避免在docker容器内解压导致磁盘空间溢出。为此,您可以运行:
mkdir MY_MODEL
tar -xvf MY_MODEL.nemo -c MY_MODEL
使用NVIDIA nemo
模型进行多GPU评估
默认情况下,只使用一个GPU。但我们确实支持在一个节点上进行数据复制或张量/流水线并行评估。
- 要启用数据复制,将
model_args
中的devices
设置为要运行的数据副本数量。例如,在8个GPU上运行8个数据副本的命令是:
torchrun --nproc-per-node=8 --no-python lm_eval \
--model nemo_lm \
--model_args path=<path_to_nemo_model>,devices=8 \
--tasks hellaswag \
--batch_size 32
- 要启用张量和/或流水线并行,设置
model_args
中的tensor_model_parallel_size
和/或pipeline_model_parallel_size
。此外,您还必须将devices
设置为tensor_model_parallel_size
和/或pipeline_model_parallel_size
的乘积。例如,使用4个GPU的一个节点,张量并行度为2,流水线并行度为2的命令是:
[!提示] 为获得最快性能,我们建议在可能的情况下对vLLM使用
--batch_size auto
,以利用其连续批处理功能!
[!提示] 通过模型参数向vLLM传递
max_model_len=4096
或其他合理的默认值,可能会在尝试使用自动批处理大小时带来加速或防止内存不足错误,例如对于默认最大长度为32k的Mistral-7B-v0.1。
模型API和推理服务器
我们的库还支持评估通过多个商业API提供服务的模型,我们希望实现对最常用的高性能本地/自托管推理服务器的支持。
要调用托管模型,请使用:
export OPENAI_API_KEY=YOUR_KEY_HERE
lm_eval --model openai-completions \
--model_args model=davinci \
--tasks lambada_openai,hellaswag
我们还支持使用您自己的本地推理服务器,这些服务器模仿OpenAI Completions和ChatCompletions API。
lm_eval --model local-completions --tasks gsm8k --model_args model=facebook/opt-125m,base_url=http://{yourip}:8000/v1/completions,num_concurrent=1,max_retries=3,tokenized_requests=False,batch_size=16
请注意,对于外部托管的模型,不应使用与放置本地模型位置相关的配置(如--device
),这些配置也不起作用。就像您可以使用--model_args
为本地模型的构造函数传递任意参数一样,您也可以使用它为托管模型的API传递任意参数。有关他们支持的参数信息,请参阅托管服务的文档。
API或推理服务器 | 是否已实现? | --model <xxx> 名称 | 支持的模型: | 请求类型: |
---|---|---|---|---|
OpenAI Completions | :heavy_check_mark: | openai-completions , local-completions | 所有OpenAI Completions API模型 | generate_until , loglikelihood , loglikelihood_rolling |
OpenAI ChatCompletions | :heavy_check_mark: | openai-chat-completions , local-chat-completions | 所有ChatCompletions API模型 | generate_until (无logprobs) |
Anthropic | :heavy_check_mark: | anthropic | 支持的Anthropic引擎 | generate_until (无logprobs) |
Anthropic Chat | :heavy_check_mark: | anthropic-chat , anthropic-chat-completions | 支持的Anthropic引擎 | generate_until (无logprobs) |
Textsynth | :heavy_check_mark: | textsynth | 所有支持的引擎 | generate_until , loglikelihood , loglikelihood_rolling |
Cohere | :hourglass: - 由于Cohere API bug而阻塞 | N/A | 所有 cohere.generate() 引擎 | generate_until , loglikelihood , loglikelihood_rolling |
Llama.cpp (通过 llama-cpp-python) | :heavy_check_mark: | gguf , ggml | llama.cpp支持的所有模型 | generate_until , loglikelihood , (困惑度评估尚未实现) |
vLLM | :heavy_check_mark: | vllm | 大多数HF因果语言模型 | generate_until , loglikelihood , loglikelihood_rolling |
Mamba | :heavy_check_mark: | mamba_ssm | 通过mamba_ssm 包的Mamba架构语言模型 | generate_until , loglikelihood , loglikelihood_rolling |
Huggingface Optimum (因果LM) | ✔️ | openvino | 任何使用Huggingface Optimum转换为OpenVINO™中间表示(IR)格式的仅解码器AutoModelForCausalLM | generate_until , loglikelihood , loglikelihood_rolling |
通过AWS Inf2的Neuron (因果LM) | ✔️ | neuronx | 任何支持在huggingface-ami image for inferentia2上运行的仅解码器AutoModelForCausalLM | generate_until , loglikelihood , loglikelihood_rolling |
Neural Magic DeepSparse | ✔️ | deepsparse | 来自SparseZoo的任何LM或带有"deepsparse"标签的HF Hub上的模型 | generate_until , loglikelihood |
Neural Magic SparseML | ✔️ | sparseml | 来自SparseZoo或HF Hub的任何仅解码器AutoModelForCausalLM。特别适用于带有量化的模型,如zoo:llama2-7b-gsm8k_llama2_pretrain-pruned60_quantized | generate_until , loglikelihood , loglikelihood_rolling |
您的本地推理服务器! | :heavy_check_mark: | local-completions 或 local-chat-completions | 支持兼容OpenAI API的服务器,可轻松自定义其他API。 | generate_until , loglikelihood , loglikelihood_rolling |
不提供logits或logprobs的模型只能用于generate_until
类型的任务,而本地模型或提供其提示logprobs/logits的API可以运行所有任务类型:generate_until
, loglikelihood
, loglikelihood_rolling
和multiple_choice
。
有关不同任务output_types
和模型请求类型的更多信息,请参阅我们的文档。
[!注意] 对于像Anthropic Claude 3和GPT-4这样的封闭聊天模型API,我们建议首先使用
--limit 10
仔细查看一些样本输出,以确认生成任务的答案提取和评分按预期执行。在--model_args
中为anthropic-chat-completions提供system="<某些系统提示>"
,以指示模型以何种格式回应,可能会有帮助。
其他框架
许多其他库包含通过其库调用评估工具的脚本。这些包括GPT-NeoX、Megatron-DeepSpeed和mesh-transformer-jax。
要创建您自己的自定义集成,您可以按照本教程中的说明进行操作。
附加功能
[!注意] 对于不适合直接评估的任务 - 由于执行不受信任代码的风险或评估过程的复杂性 - 可以使用
--predict_only
标志来获取解码后的生成结果,以进行事后评估。
如果您有一台兼容Metal的Mac,您可以通过将--device cuda:0
替换为--device mps
来使用MPS后端运行评估工具(需要PyTorch 2.1或更高版本)。请注意,PyTorch MPS后端仍处于早期开发阶段,因此可能存在正确性问题或不支持的操作。如果您在MPS后端上观察到模型性能异常,我们建议首先检查模型在--device cpu
和--device mps
上的前向传递是否匹配。
[!注意] 您可以通过运行以下命令来检查LM输入的样子:
python write_out.py \ --tasks <task1,task2,...> \ --num_fewshot 5 \ --num_examples 10 \ --output_base_path /path/to/output/folder
这将为每个任务写出一个文本文件。
除了运行任务本身,您还可以使用--check_integrity
标志来验证您正在执行的任务的数据完整性:
lm_eval --model openai \
--model_args engine=davinci \
--tasks lambada_openai,hellaswag \
--check_integrity
高级使用技巧
对于使用HuggingFace transformers
库加载的模型,通过--model_args
提供的任何参数都直接传递给相关的构造函数。这意味着您可以使用AutoModel
能做的任何事情。例如,您可以通过pretrained=
传递本地路径,或者通过在model_args
参数中添加,peft=PATH
来使用用PEFT微调的模型:
lm_eval --model hf \
--model_args pretrained=EleutherAI/gpt-j-6b,parallelize=True,load_in_4bit=True,peft=nomic-ai/gpt4all-j-lora \
--tasks openbookqa,arc_easy,winogrande,hellaswag,arc_challenge,piqa,boolq \
--device cuda:0
作为增量权重提供的模型可以使用Hugging Face transformers库轻松加载。在--model_args中,设置delta参数以指定增量权重,并使用pretrained参数指定将应用这些权重的相对基础模型:
lm_eval --model hf \
--model_args pretrained=Ejafa/llama_7B,delta=lmsys/vicuna-7b-delta-v1.1 \
--tasks hellaswag
GPTQ量化模型可以通过在model_args
参数中指定其文件名,autogptq=NAME
(或默认名称使用,autogptq=True
)来加载:
lm_eval --model hf \
--model_args pretrained=model-name-or-path,autogptq=model.safetensors,gptq_use_triton=True \
--tasks hellaswag
我们支持任务名称中的通配符,例如您可以通过--task lambada_openai_mt_*
运行所有机器翻译的lambada任务。
保存结果
要保存评估结果,请提供一个--output_path
。我们还支持使用--log_samples
标志记录模型响应,以进行事后分析。
此外,您可以使用--use_cache
提供一个目录来缓存先前运行的结果。这允许您避免重复执行相同的(模型,任务)对以进行重新评分。
要将结果和样本推送到Hugging Face Hub,首先确保在HF_TOKEN
环境变量中设置了具有写入访问权限的访问令牌。然后,使用--hf_hub_log_args
标志指定组织、存储库名称、存储库可见性以及是否将结果和样本推送到Hub - HF Hub上的示例数据集。例如:
lm_eval --model hf \
--model_args pretrained=model-name-or-path,autogptq=model.safetensors,gptq_use_triton=True \
--tasks hellaswag \
--log_samples \
--output_path results \
--hf_hub_log_args hub_results_org=EleutherAI,hub_repo_name=lm-eval-results,push_results_to_hub=True,push_samples_to_hub=True,public_repo=False \
这允许您轻松地从Hub下载结果和样本,使用:
from datasets import load_dataset
load_dataset("EleutherAI/lm-eval-results-private", "hellaswag", "latest")
有关支持的参数的完整列表,请查看我们文档中的接口指南!
可视化结果
您可以使用Weights & Biases (W&B)和Zeno无缝地可视化和分析评估工具运行的结果。
Zeno
您可以使用Zeno 您可以在 examples/visualize-zeno.ipynb 中找到此工作流程的示例。
Weights and Biases
通过 Weights and Biases 集成,您现在可以花更多时间深入分析评估结果。该集成旨在简化使用 Weights & Biases (W&B) 平台记录和可视化实验结果的过程。
该集成提供以下功能:
- 自动记录评估结果,
- 将样本记录为 W&B 表格以便于可视化,
- 将
results.json
文件记录为工件以进行版本控制, - 如果记录了样本,则记录
<task_name>_eval_samples.json
文件, - 生成包含所有重要指标的综合报告用于分析和可视化,
- 记录任务和 CLI 特定的配置,
- 以及更多开箱即用的功能,如用于运行评估的命令、GPU/CPU 数量、时间戳等。
首先,您需要安装 lm_eval[wandb] 包的额外功能。执行 pip install lm_eval[wandb]
。
使用您的唯一 W&B 令牌对您的机器进行身份验证。访问 https://wandb.ai/authorize 获取令牌。在命令行终端中执行 wandb login
。
像往常一样运行评估工具,并加上 wandb_args
标志。使用此标志提供初始化 wandb 运行的参数(wandb.init),以逗号分隔的字符串参数形式。
lm_eval \
--model hf \
--model_args pretrained=microsoft/phi-2,trust_remote_code=True \
--tasks hellaswag,mmlu_abstract_algebra \
--device cuda:0 \
--batch_size 8 \
--output_path output/phi-2 \
--limit 10 \
--wandb_args project=lm-eval-harness-integration \
--log_samples
在标准输出中,您将找到 W&B 运行页面的链接以及生成的报告链接。您可以在 examples/visualize-wandb.ipynb 中找到此工作流程的示例,以及如何在 CLI 之外集成它的示例。
如何贡献或了解更多?
有关库及其各个部分如何组合在一起的更多信息,请查看我们所有的文档页面!我们计划很快发布一个更大的路线图,详细说明所需的和计划中的库改进,以及有关贡献者如何提供帮助的更多信息。
实现新任务
要在评估工具中实现新任务,请参阅此指南。
总的来说,我们遵循以下优先顺序来解决有关提示和其他评估细节的问题:
- 如果训练 LLM 的人们之间达成广泛共识,请使用商定的程序。
- 如果有明确且明确的官方实现,请使用该程序。
- 如果评估 LLM 的人们之间达成广泛共识,请使用商定的程序。
- 如果有多个常见实现但没有普遍或广泛的共识,请使用我们在常见实现中首选的选项。与之前一样,优先选择 LLM 训练论文中的实现。
这些是指导原则而非规则,在特殊情况下可以被推翻。
我们尽量优先与其他团体使用的程序保持一致,以减少当人们不可避免地比较不同论文中的运行结果时造成的危害,尽管我们不鼓励这种做法。从历史上看,我们也优先考虑Language Models are Few Shot Learners中的实现,因为我们最初的目标是专门与该论文进行结果比较。
支持
获得支持的最佳方式是在此仓库中开启一个 issue 或加入 EleutherAI Discord 服务器。#lm-thunderdome
频道专门用于开发这个项目,而 #release-discussion
频道用于为我们的发布提供支持。如果您使用过该库并有积极(或消极)的体验,我们很乐意听取您的反馈!
可选额外功能
可以通过 pip install -e ".[NAME]"
安装额外依赖
名称 | 用途 |
---|---|
api | 用于使用 API 模型(Anthropic、OpenAI API) |
deepsparse | 用于运行 NM 的 DeepSparse 模型 |
dev | 用于 PR 和贡献的代码检查 |
gptq | 用于加载 GPTQ 模型 |
hf_transfer | 用于加速 HF Hub 文件下载 |
ifeval | 用于运行 IFEval 任务 |
neuronx | 用于在 AWS inf2 实例上运行 |
mamba | 用于加载 Mamba SSM 模型 |
math | 用于运行数学任务答案检查 |
multilingual | 用于多语言分词器 |
optimum | 用于运行 Intel OpenVINO 模型 |
promptsource | 用于使用 PromptSource 提示 |
sentencepiece | 用于使用 sentencepiece 分词器 |
sparseml | 用于使用 NM 的 SparseML 模型 |
testing | 用于运行库测试套件 |
vllm | 用于使用 vLLM 加载模型 |
zeno | 用于使用 Zeno 可视化结果 |
--------------- | --------------------------------------- |
all | 加载所有额外功能(不推荐) |
引用方式
@misc{eval-harness,
author = {Gao, Leo and Tow, Jonathan and Abbasi, Baber and Biderman, Stella and Black, Sid and DiPofi, Anthony and Foster, Charles and Golding, Laurence and Hsu, Jeffrey and Le Noac'h, Alain and Li, Haonan and McDonell, Kyle and Muennighoff, Niklas and Ociepa, Chris and Phang, Jason and Reynolds, Laria and Schoelkopf, Hailey and Skowron, Aviya and Sutawika, Lintang and Tang, Eric and Thite, Anish and Wang, Ben and Wang, Kevin and Zou, Andy},
title = {A framework for few-shot language model evaluation},
month = 12,
year = 2023,
publisher = {Zenodo},
version = {v0.4.0},
doi = {10.5281/zenodo.10256836},
url = {https://zenodo.org/records/10256836}
}