LLMs之benchmark之lm-evaluation-harness:lm-evaluation-harness(语言模型评估工具)的简介、安装和使用方法、案例应用之详细攻略
目录
使用Hugging Face accelerate进行多GPU评估
Tensor + Data Parallel与vLLM的优化推理
lm-evaluation-harness的简介
2023年12月,lm-evaluation-harness项目提供了一个统一的框架,用于在大量不同的评估任务上测试生成型语言模型。
Github地址:https://github.com/EleutherAI/lm-evaluation-harness
1、功能特点
为LLMs提供60多个标准学术基准测试,包含数百个子任务和变体。
>> 支持通过transformers加载的模型(包括通过AutoGPTQ进行量化)、GPT-NeoX和Megatron-DeepSpeed,具有灵活的无关标记接口。
>> 支持使用vLLM进行快速和内存高效的推理。
>> 支持商业API,包括OpenAI和TextSynth。
>> 支持评估HuggingFace的PEFT库中支持的适配器(如LoRA)。
>> 支持本地模型和基准测试。
>> 使用公开可用的提示进行评估,确保论文之间的可重复性和可比性。
>> 轻松支持自定义提示和评估指标。
语言模型评估工具是Hugging Face的Open LLM Leaderboard的后台,已在数百篇论文中使用,并被包括NVIDIA、Cohere、BigScience、BigCode、Nous Research和Mosaic ML在内的几十个组织内部使用。
2、公告
lm-evaluation-harness的新版本v0.4.0已发布!
新更新和功能包括:
>> 内部重构
>> 基于配置的任务创建和配置
>> 更简单的外部定义任务配置YAML的导入和共享
>> 支持Jinja2提示设计,方便修改提示+从Promptsource导入提示
>> 更高级的配置选项,包括输出后处理、答案提取、每个文档的多个LM生成、可配置的少样本设置等
>> 支持更快的新建模库,包括:更快的数据并行HF模型使用、vLLM支持、HuggingFace的MPS支持等
>> 日志记录和可用性改进
>> 新任务包括CoT BIG-Bench-Hard、Belebele、用户定义的任务分组等
请查看我们更新的文档页面以获取更多详细信息。开发将继续在主分支上进行,欢迎大家在GitHub上的问题或PR中,或者在EleutherAI的Discord中反馈所需功能和改进建议或提问!
lm-evaluation-harness的安装和使用方法
1、安装
从GitHub仓库安装lm-eval包,请运行:
git clone https://github.com/EleutherAI/lm-evaluation-harness
cd lm-evaluation-harness
pip install -e .
我们还提供了许多可选依赖项以扩展功能。在本文件末尾有一个详细的表格。
2、基本使用
用户指南
提供了一个用户指南,详细列出了支持的所有参数,可以在此处和终端中通过调用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上存储部分训练检查点的常见做法,或指定运行模型的数据类型:
lm_eval --model hf \
--model_args pretrained=EleutherAI/pythia-160m,revision=step100000,dtype="float" \
--tasks lambada_openai,hellaswag \
--device cuda:0 \
--batch_size 8
通过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向lm_eval提供本地路径,方法是设置pretrained=/path/to/model
使用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
在模型可以放入单个GPU的情况下,这允许你在K个GPU上以K倍于单GPU的速度进行评估。
警告:此设置不支持FSDP模型分片,因此在accelerate配置中必须禁用FSDP,或使用NO_ARD 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:在需要时模型权重将卸载到磁盘的文件夹。
这两种选项(accelerate launch和parallelize=True)是互斥的。
注意:我们目前不支持原生的多节点评估,建议使用外部托管的服务器运行推理请求,或创建与分布式框架的自定义集成,如GPT-NeoX库所做。
NVIDIA NeMo模型
NVIDIA NeMo Framework是一个为研究人员和使用PyTorch开发语言模型的开发人员设计的生成性AI框架。
要评估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
使用NVIDIA nemo模型进行多GPU评估
默认情况下,只使用一个GPU。但我们支持在一个节点上进行评估时,使用数据复制或张量/管道并行。
要启用数据复制,请将devices的model_args设置为要运行的数据副本数量。例如,运行8个数据副本覆盖8个GPU的命令如下:
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
请注意,建议将python命令替换为torchrun --nproc-per-node=<设备数> --no-python,以便更轻松地将模型加载到GPU中。这对于加载到多个GPU的大型检查点特别重要。
尚不支持的功能:多节点评估以及数据复制与张量或管道并行的组合。
Tensor + Data Parallel与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视为参考实现,并提供一个脚本来检查vllm结果与HF的有效性。
提示:为了获得最快的性能,请尽可能使用--batch_size auto,以利用其连续批处理功能!
提示:通过在模型参数args中传递max_model_len=4096或其他合理的默认值到vLLM,可能会加快速度或防止尝试使用自动批量大小时出现内存不足错误,例如Mistral-7B-v0.1,默认最大长度为32k。
模型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-chat-completions --tasks gsm8k --model_args model=facebook/opt-125m,base_url=http://{yourip}:8000/v1
请注意,对于外部托管模型,不应使用--device和--batch_size等配置,并且不起作用。就像您可以使用--model_args为本地模型的模型构造函数传递任意参数一样,您可以使用它为托管模型的API传递任意参数。有关他们支持的参数的信息,请参阅托管服务的文档。
API or Inference Server | Implemented? | --model <xxx> name | Models supported: | Request Types: |
---|---|---|---|---|
OpenAI Completions | ✔️ | openai-completions , local-completions | All OpenAI Completions API models | generate_until , loglikelihood , loglikelihood_rolling |
OpenAI ChatCompletions | ✔️ | openai-chat-completions , local-chat-completions | All ChatCompletions API models | generate_until (no logprobs) |
Anthropic | ✔️ | anthropic | Supported Anthropic Engines | generate_until (no logprobs) |
Anthropic Chat | ✔️ | anthropic-chat , anthropic-chat-completions | Supported Anthropic Engines | generate_until (no logprobs) |
Textsynth | ✔️ | textsynth | All supported engines | generate_until , loglikelihood , loglikelihood_rolling |
Cohere | ⌛ - blocked on Cohere API bug | N/A | All cohere.generate() engines | generate_until , loglikelihood , loglikelihood_rolling |
Llama.cpp (via llama-cpp-python) | ✔️ | gguf , ggml | All models supported by llama.cpp | generate_until , loglikelihood , (perplexity evaluation not yet implemented) |
vLLM | ✔️ | vllm | Most HF Causal Language Models | generate_until , loglikelihood , loglikelihood_rolling |
Mamba | ✔️ | mamba_ssm | Mamba architecture Language Models via the mamba_ssm package | generate_until , loglikelihood , loglikelihood_rolling |
Huggingface Optimum (Causal LMs) | ✔️ | openvino | Any decoder-only AutoModelForCausalLM converted with Huggingface Optimum into OpenVINO™ Intermediate Representation (IR) format | generate_until , loglikelihood , loglikelihood_rolling |
Neuron via AWS Inf2 (Causal LMs) | ✔️ | neuronx | Any decoder-only AutoModelForCausalLM supported to run on huggingface-ami image for inferentia2 | generate_until , loglikelihood , loglikelihood_rolling |
Neural Magic DeepSparse | ✔️ | deepsparse | Any LM from SparseZoo or on HF Hub with the "deepsparse" tag | generate_until , loglikelihood |
Neural Magic SparseML | ✔️ | sparseml | Any decoder-only AutoModelForCausalLM from SparseZoo or on HF Hub. Especially useful for models with quantization like zoo:llama2-7b-gsm8k_llama2_pretrain-pruned60_quantized | generate_until , loglikelihood , loglikelihood_rolling |
Your local inference server! | ✔️ | local-completions or local-chat-completions (using openai-chat-completions model type) | Any server address that accepts GET requests using HF models and mirror's OpenAI's Completions or ChatCompletions interface | generate_until |
不提供logits或logprobs的模型只能与类型为generate_until的任务一起使用,而本地模型或提供其提示的logits/logprobs的API可以在所有任务类型上运行:generate_until、loglikelihood、loglikelihood_rolling和multiple_choice。
有关不同任务输出类型和模型请求类型的更多信息,请参阅我们的文档。
注意:对于闭环聊天模型API(如Anthropic Claude 3和GPT-4),我们建议首先仔细查看使用--limit 10的几个样本输出,以确认在生成任务上的答案提取和评分表现符合预期。对于anthropic-chat-completions,通过在--model_args中提供system="<some system prompt here>",指导模型如何响应可能很有用。
其他框架
许多其他库中都包含调用评估挑战的脚本。这些包括GPT-NeoX、Megatron-DeepSpeed和mesh-transformer-jax。
要创建自己的自定义集成,可以按照此教程的说明进行操作。
附加功能
注意:对于不适合直接评估的任务 —— 无论是由于执行不受信任代码的风险还是由于评估过程中的复杂性 —— 可以使用--predict_only标志获取解码生成,以进行事后评估。
如果您有兼容Metal的Mac,可以通过将--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
3、高级使用技巧
对于使用HuggingFace transformers库加载的模型,通过--model_args提供的任何参数将直接传递给相关的构造函数。这意味着您可以像使用AutoModel一样使用我们的库。例如,您可以通过在model_args参数中添加local path通过pretrained=或使用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任务。
4、保存结果
要保存评估结果,请提供一个--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")
有关支持的参数的完整列表,请查阅我们文档中的接口指南!
5、可视化结果
您可以无缝地使用Weights & Biases(W&B)和Zeno分析和可视化评估挑战运行的结果。
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将用作前缀,并将为每个任务创建一个项目。
您可以在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
在stdout中,您将找到指向W&B运行页面和生成报告的链接。您可以在examples/visualize-wandb.ipynb中找到此工作流程的示例,以及如何在CLI之外集成它的示例。
lm-evaluation-harness的案例应用
持续更新中……