最新消息
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}
}