最新消息
hf-multimodal
和vllm-vlm
模型类型以及mmmu
任务作为原型功能。我们欢迎用户尝试这个正在进行中的功能并亲自对其进行压力测试,并建议他们查看lmms-eval
,这是一个最初从 lm-evaluation-harness 分叉出来的精彩项目,用于更广泛的多模式任务,型号和功能。local-completions
模型类型来评估模型。lm-evaluation-harness 的新 v0.4.0 版本现已推出!
新的更新和功能包括:
请参阅docs/
中我们更新的文档页面以了解更多详细信息。
开发将在main
分支上继续进行,我们鼓励您向我们提供有关所需功能以及如何进一步改进库的反馈,或者在 GitHub 上的问题或 PR 中或在 EleutherAI 不和谐中提出问题!
该项目提供了一个统一的框架来测试大量不同评估任务的生成语言模型。
特征:
语言模型评估工具是 ? 的后端。 Hugging Face 广受欢迎的 Open LLM 排行榜已在数百篇论文中使用,并被 NVIDIA、Cohere、BigScience、BigCode、Nous Research 和 Mosaic ML 等数十个组织内部使用。
要从 github 存储库安装lm-eval
包,请运行:
git clone --depth 1 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
查看支持的任务列表(或任务分组)。此处提供了任务描述和相应子文件夹的链接。
transformers
要评估hellaswag
上 HuggingFace Hub(例如 GPT-J-6B)上托管的模型,您可以使用以下命令(假设您使用的是 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
的本地路径
accelerate
的多 GPU 评估我们支持使用 Hugging Face 加速库进行多 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
启动器外部运行库,但将parallelize=True
传递给--model_args
,如下所示:
lm_eval --model hf
--tasks lambada_openai,arc_easy
--model_args parallelize=True
--batch_size 16
这意味着模型的权重将分布在所有可用的 GPU 上。
对于更高级的用户甚至更大的模型,当parallelize=True
时我们也允许使用以下参数:
device_map_option
:如何在可用的 GPU 上分割模型权重。默认为“自动”。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
库一起使用的更多信息,请参阅加速文档
警告:我们本身不支持使用hf
模型类型进行多节点评估!请参考我们的 GPT-NeoX 库集成,获取编写自定义多机评估脚本的代码示例。
注意:我们目前本身不支持多节点评估,建议使用外部托管服务器来运行推理请求,或者像 GPT-NeoX 库那样创建与分布式框架的自定义集成。
nemo
型号NVIDIA NeMo Framework 是一个生成式 AI 框架,专为研究语言模型的研究人员和 PyTorch 开发人员而构建。
要评估nemo
模型,请首先按照文档安装 NeMo。我们强烈建议使用 NVIDIA PyTorch 或 NeMo 容器,特别是在安装 Apex 或任何其他依赖项时出现问题时(请参阅最新发布的容器)。另请按照“安装”部分中的说明安装 lm 评估工具库。
NeMo 模型可以通过 NVIDIA NGC Catalog 或 NVIDIA 的 Hugging Face 页面获取。在 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
nemo
模型进行多 GPU 评估默认情况下,仅使用一个 GPU。但我们确实支持在一个节点上评估期间的数据复制或张量/管道并行性。
devices
的model_args
设置为要运行的数据副本的数量。例如,在 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
tensor_model_parallel_size
和/或pipeline_model_parallel_size
的model_args
。此外,您还必须将devices
设置为等于tensor_model_parallel_size
和/或pipeline_model_parallel_size
的乘积。例如,使用 4 个 GPU 的一个节点,张量并行度为 2,管道并行度为 2 的命令是: torchrun --nproc-per-node=4 --no-python lm_eval
--model nemo_lm
--model_args path= < path_to_nemo_model > ,devices=4,tensor_model_parallel_size=2,pipeline_model_parallel_size=2
--tasks hellaswag
--batch_size 32
请注意,建议使用torchrun --nproc-per-node=<number of devices> --no-python
替换python
命令,以方便将模型加载到 GPU 中。这对于加载到多个 GPU 中的大型检查点尤其重要。
尚不支持:多节点评估以及数据复制与张量或管道并行性的组合。
vLLM
优化推理我们还支持 vLLM,以便更快地对支持的模型类型进行推理,尤其是在将模型拆分到多个 GPU 上时速度更快。对于单 GPU 或多 GPU(张量并行、数据并行或两者的组合)推理,例如:
lm_eval --model vllm
--model_args pretrained={model_name},tensor_parallel_size={GPUs_per_model},dtype=auto,gpu_memory_utilization=0.8,data_parallel_size={model_replicas}
--tasks lambada_openai
--batch_size auto
要使用 vllm,请执行pip install lm_eval[vllm]
。有关受支持的 vLLM 配置的完整列表,请参考我们的 vLLM 集成和 vLLM 文档。
vLLM 的输出有时与 Huggingface 不同。我们将 Huggingface 作为参考实现,并提供一个脚本来检查 HF 的 vllm 结果的有效性。
提示
为了获得最快的性能,我们建议尽可能对 vLLM 使用--batch_size auto
,以利用其连续批处理功能!
提示
在尝试使用自动批量大小时,通过模型参数将max_model_len=4096
或其他合理的默认值传递给 vLLM 可能会导致加速或防止内存不足错误,例如 Mistral-7B-v0.1,其默认最大长度为32k。
我们的库还支持对通过多个商业 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 完成情况 | ✔️ | openai-completions , local-completions | 所有 OpenAI Completions API 模型 | generate_until , loglikelihood , loglikelihood_rolling |
OpenAI 聊天完成 | ✔️ | openai-chat-completions , local-chat-completions | 所有 ChatCompletions API 模型 | generate_until (无日志概率) |
人择 | ✔️ | anthropic | 支持的人类引擎 | generate_until (无日志概率) |
人择聊天 | ✔️ | anthropic-chat , anthropic-chat-completions | 支持的人类引擎 | generate_until (无日志概率) |
文本合成器 | ✔️ | textsynth | 所有支持的引擎 | generate_until , loglikelihood , loglikelihood_rolling |
连贯 | ⌛ - 因 Cohere API 错误而被阻止 | 不适用 | 所有cohere.generate() 引擎 | generate_until , loglikelihood , loglikelihood_rolling |
Llama.cpp(通过 llama-cpp-python) | ✔️ | gguf , ggml | llama.cpp 支持的所有模型 | generate_until , loglikelihood ,(困惑度评估尚未实现) |
法学硕士 | ✔️ | vllm | 大多数 HF 因果语言模型 | generate_until , loglikelihood , loglikelihood_rolling |
曼巴 | ✔️ | mamba_ssm | 通过mamba_ssm 包的 Mamba 架构语言模型 | generate_until , loglikelihood , loglikelihood_rolling |
Huggingface 最优(因果 LM) | ✔️ | openvino | 任何仅解码器的 AutoModelForCausalLM 通过 Huggingface Optimum 转换为 OpenVINO™ 中间表示 (IR) 格式 | generate_until , loglikelihood , loglikelihood_rolling |
Neuron 通过 AWS Inf2(因果 LM) | ✔️ | neuronx | 支持任何仅解码器的 AutoModelForCausalLM 在 Huggingface-ami 图像上运行以进行 inferentia2 | generate_until , loglikelihood , loglikelihood_rolling |
神经魔法 DeepSparse | ✔️ | deepsparse | 来自 SparseZoo 或 HF Hub 上带有“deepsparse”标签的任何 LM | generate_until , loglikelihood |
神经魔法 SparseML | ✔️ | sparseml | 来自 SparseZoo 或 HF Hub 上的任何仅解码器 AutoModelForCausalLM。对于像zoo:llama2-7b-gsm8k_llama2_pretrain-pruned60_quantized | generate_until , loglikelihood , loglikelihood_rolling |
您的本地推理服务器! | ✔️ | 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="<some system prompt here>"
,以指示模型以什么格式进行响应,可能会很有用。
许多其他库包含用于通过其库调用评估工具的脚本。其中包括 GPT-NeoX、Megatron-DeepSpeed 和 mesh-transformer-jax。
要创建您自己的自定义集成,您可以按照本教程中的说明进行操作。
笔记
对于不适合直接评估的任务(无论是与执行不受信任的代码相关的风险还是评估过程中的复杂性), --predict_only
标志可用于获取解码后的生成以进行事后评估。
如果您有 Metal 兼容的 Mac,则可以使用 MPS 后端运行评估工具,方法是将--device cuda:0
替换为--device 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=
传递本地路径,或者通过执行要运行的调用来评估基本模型并将,peft=PATH
添加到model_args
参数,从而使用通过 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 转换器库轻松加载以增量权重形式提供的模型。在 --model_args 中,设置 delta 参数以指定 delta 权重,并使用预训练参数指定将应用它们的相对基础模型:
lm_eval --model hf
--model_args pretrained=Ejafa/llama_7B,delta=lmsys/vicuna-7b-delta-v1.1
--tasks hellaswag
可以使用 GPTQModel(更快)或 AutoGPTQ 加载 GPTQ 量化模型
GPTQModel:将,gptqmodel=True
添加到model_args
lm_eval --model hf
--model_args pretrained=model-name-or-path,gptqmodel=True
--tasks hellaswag
AutoGPTQ:将,autogptq=True
添加到model_args
:
lm_eval --model hf
--model_args pretrained=model-name-or-path,autogptq=model.safetensors,gptq_use_triton=True
--tasks hellaswag
我们支持任务名称中的通配符,例如,您可以通过--task lambada_openai_mt_*
运行所有机器翻译的 lambda 任务。
要保存评估结果,请提供--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" )
有关受支持参数的完整列表,请查看我们文档中的接口指南!
您可以使用权重与偏差 (W&B) 和 Zeno 无缝可视化和分析评估工具运行的结果。
您可以使用 Zeno 来可视化评估工具运行的结果。
首先,前往 hub.zenoml.com 创建帐户并在帐户页面上获取 API 密钥。将此键添加为环境变量:
export ZENO_API_KEY=[your api key]
您还需要额外安装lm_eval[zeno]
包。
要可视化结果,请使用log_samples
和output_path
标志运行评估工具。我们期望output_path
包含代表各个模型名称的多个文件夹。因此,您可以对任意数量的任务和模型进行评估,并将所有结果作为项目上传到 Zeno 上。
lm_eval
--model hf
--model_args pretrained=EleutherAI/gpt-j-6B
--tasks hellaswag
--device cuda:0
--batch_size 8
--log_samples
--output_path output/gpt-j-6B
然后,您可以使用zeno_visualize
脚本上传结果数据:
python scripts/zeno_visualize.py
--data_path output
--project_name " Eleuther Project "
这将使用data_path
中的所有子文件夹作为不同的模型,并将这些模型文件夹中的所有任务上传到 Zeno。如果您在多个任务上运行评估工具, project_name
将用作前缀,并且每个任务将创建一个项目。
您可以在 example/visualize-zeno.ipynb 中找到此工作流程的示例。
通过权重和偏差集成,您现在可以花更多时间对评估结果进行更深入的了解。该集成旨在简化使用权重和偏差 (W&B) 平台记录和可视化实验结果的过程。
集成提供功能
results.json
文件记录为版本控制的工件,<task_name>_eval_samples.json
文件,首先,您需要额外安装 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 运行页面的链接以及生成的报告的链接。您可以在 example/visualize-wandb.ipynb 中找到此工作流程的示例,以及如何将其集成到 CLI 之外的示例。
有关该库以及所有内容如何组合在一起的更多信息,请查看我们所有的文档页面!我们计划很快发布一个更大的路线图,其中包含所需的+计划的库改进,以及有关贡献者如何提供帮助的更多信息。
要在评估工具中实施新任务,请参阅本指南。
一般来说,我们遵循此优先级列表来解决有关提示和其他评估细节的问题:
这些是指导方针而不是规则,在特殊情况下可以被推翻。
尽管我们不鼓励这种做法,但当人们不可避免地比较不同论文的运行时,我们尝试优先考虑与其他团体使用的程序达成一致,以减少伤害。从历史上看,我们还优先考虑了 Language Models are Few Shot Learners 的实现,因为我们最初的目标是专门将结果与该论文进行比较。
获得支持的最佳方式是在此存储库上提出问题或加入 EleutherAI Discord 服务器。 #lm-thunderdome
频道致力于开发该项目, #release-discussion
频道用于接收对我们的版本的支持。如果您使用过图书馆并获得了积极(或消极)的体验,我们很乐意听取您的意见!
可以通过pip install -e ".[NAME]"
安装额外的依赖项
姓名 | 使用 |
---|---|
应用程序编程接口 | 用于使用 api 模型(Anthropic、OpenAI API) |
深度稀疏 | 用于运行 NM 的 DeepSparse 模型 |
开发者 | 用于 linting PR 和贡献 |
总表 | 用于使用 GPTQ 加载模型 |
高频传输 | 用于加快 HF Hub 文件下载速度 |
伊菲瓦尔 | 用于运行 IFEval 任务 |
神经元 | 用于在 AWS inf2 实例上运行 |
曼巴 | 用于加载 Mamba SSM 模型 |
数学 | 用于运行数学任务答案检查 |
多种语言 | 对于多语言分词器 |
最佳 | 用于运行 Intel OpenVINO 模型 |
提示源 | 对于使用 PromptSource 提示 |
句子 | 用于使用句子分词器 |
稀疏的 | 用于使用 NM 的 SparseML 模型 |
测试 | 用于运行库测试套件 |
弗洛姆 | 用于使用 vLLM 加载模型 |
芝诺 | 用于使用 Zeno 可视化结果 |
---------------- | --------------------------------------- |
全部 | 加载所有附加内容(不推荐) |
@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 = 07,
year = 2024,
publisher = {Zenodo},
version = {v0.4.3},
doi = {10.5281/zenodo.12608602},
url = {https://zenodo.org/records/12608602}
}