在 AWS 上部署的文档
使用 Hugging Face Lighteval 在 Amazon SageMaker 上评估 LLM
并获得增强的文档体验
开始使用
使用 Hugging Face Lighteval 在 Amazon SageMaker 上评估 LLM
在此 SageMaker 示例中,我们将学习如何使用 Hugging Face lighteval 评估 LLM。LightEval 是一个轻量级的 LLM 评估套件,为 Hugging Face Open LLM Leaderboard 提供支持。
评估 LLM 对于了解其能力和局限性至关重要,但由于其复杂和不透明的性质,这带来了重大挑战。LightEval 通过使 LLM 能够在 MMLU 或 IFEval 等学术基准上进行评估,从而促进了这一评估过程,提供了衡量其在不同任务中性能的结构化方法。
您将详细了解如何
- 设置开发环境
- 准备评估配置
- 在 Amazon SageMaker 上评估 TruthfulQA 上的 Zephyr 7B
!pip install sagemaker --upgrade --quiet
如果您要在本地环境中使用 SageMaker。您需要访问具有 SageMaker 所需权限的 IAM 角色。您可以在此处了解更多信息。
import sagemaker
import boto3
sess = sagemaker.Session()
# sagemaker session bucket -> used for uploading data, models and logs
# sagemaker will automatically create this bucket if it not exists
sagemaker_session_bucket = None
if sagemaker_session_bucket is None and sess is not None:
# set to default bucket if a bucket name is not given
sagemaker_session_bucket = sess.default_bucket()
try:
role = sagemaker.get_execution_role()
except ValueError:
iam = boto3.client("iam")
role = iam.get_role(RoleName="sagemaker_execution_role")["Role"]["Arn"]
sess = sagemaker.Session(default_bucket=sagemaker_session_bucket)
print(f"sagemaker role arn: {role}")
print(f"sagemaker bucket: {sess.default_bucket()}")
print(f"sagemaker session region: {sess.boto_region_name}")
2. 准备评估配置
LightEval 包含用于在 MMLU、Truthfulqa、IFEval 等常见基准上评估 LLM 的脚本。它用于在 Hugging Face Open LLM Leaderboard 上评估模型。lighteval 建立在出色的 Eleuther AI Harness 之上,并具有一些附加功能和改进。
您可以在此处找到所有可用的基准。
我们将使用 Amazon SageMaker 托管训练来评估模型。因此,我们将利用 lighteval 中可用的脚本。Hugging Face DLC 没有安装 lighteval。这意味着需要提供一个 `requirements.txt` 文件来安装所需的依赖项。
首先,让我们加载 `run_evals_accelerate.py` 脚本并创建一个包含所需依赖项的 `requirements.txt` 文件。
import os
import requests as r
lighteval_version = "0.2.0"
# create scripts directory if not exists
os.makedirs("scripts", exist_ok=True)
# load custom scripts from git
raw_github_url = (
f"https://raw.githubusercontent.com/huggingface/lighteval/v{lighteval_version}/run_evals_accelerate.py"
)
res = r.get(raw_github_url)
with open("scripts/run_evals_accelerate.py", "w") as f:
f.write(res.text)
# write requirements.txt
with open("scripts/requirements.txt", "w") as f:
f.write(f"lighteval=={lighteval_version}")
在 lighteval 中,评估是通过运行 `run_evals_accelerate.py` 脚本完成的。该脚本接受一个 `task` 参数,该参数定义为 `suite|task|num_few_shot|{0 or 1 to automatically reduce num_few_shot if prompt is too long}`。或者,您也可以提供一个包含要评估模型的任务的 txt 文件路径,我们将这样做。这使得您可以更容易地将评估扩展到其他基准。
我们将在 Truthfulqa 基准上评估模型,使用 0 个少样本示例。TruthfulQA 是一个旨在衡量语言模型是否对问题生成真实答案的基准,涵盖健康、法律、金融和政治等 38 个类别的 817 个问题。
with open("scripts/tasks.txt", "w") as f:
f.write(f"lighteval|truthfulqa:mc|0|0")
要在 Open LLM Leaderboard 的所有基准上评估模型,您可以复制此文件
3. 在 Amazon SageMaker 上评估 TruthfulQA 上的 Zephyr 7B
在此示例中,我们将评估 HuggingFaceH4/zephyr-7b-beta 在 MMLU 基准上的表现,该基准是 Open LLM Leaderboard 的一部分。
除了 `task` 参数,我们还需要定义
- `model_args`:Hugging Face 模型 ID 或路径,定义为 `pretrained=HuggingFaceH4/zephyr-7b-beta`
- `model_dtype`:模型数据类型,定义为 `bfloat16`、`float16` 或 `float32`
- `output_dir`:评估结果将保存的目录,例如 `/opt/ml/model`
Lighteval 还可以评估 peft 模型或使用 `chat_templates`,您可以在此处了解更多信息。
from sagemaker.huggingface import HuggingFace
# hyperparameters, which are passed into the training job
hyperparameters = {
"model_args": "pretrained=HuggingFaceH4/zephyr-7b-beta", # Hugging Face Model ID
"task": "tasks.txt", # 'lighteval|truthfulqa:mc|0|0',
"model_dtype": "bfloat16", # Torch dtype to load model weights
"output_dir": "/opt/ml/model", # Directory, which sagemaker uploads to s3 after training
}
# create the Estimator
huggingface_estimator = HuggingFace(
entry_point="run_evals_accelerate.py", # train script
source_dir="scripts", # directory which includes all the files needed for training
instance_type="ml.g5.4xlarge", # instances type used for the training job
instance_count=1, # the number of instances used for training
base_job_name="lighteval", # the name of the training job
role=role, # Iam role used in training job to access AWS ressources, e.g. S3
volume_size=300, # the size of the EBS volume in GB
transformers_version="4.36", # the transformers version used in the training job
pytorch_version="2.1", # the pytorch_version version used in the training job
py_version="py310", # the python version used in the training job
hyperparameters=hyperparameters,
environment={
"HUGGINGFACE_HUB_CACHE": "/tmp/.cache",
# "HF_TOKEN": "REPALCE_WITH_YOUR_TOKEN" # needed for private models
}, # set env variable to cache models in /tmp
)
我们现在可以使用 `.fit()` 开始评估作业。
# starting the train job with our uploaded datasets as input
huggingface_estimator.fit()
评估作业完成后,我们可以从 S3 存储桶下载评估结果。Lighteval 会将结果和生成内容保存到 `output_dir` 中。结果以 json 格式保存,包含有关每个任务和模型性能的详细信息。结果可在 `results` 键中获取。
import tarfile
import json
import io
import os
from sagemaker.s3 import S3Downloader
# download results from s3
results_tar = S3Downloader.read_bytes(huggingface_estimator.model_data)
model_id = hyperparameters["model_args"].split("=")[1]
result = {}
# Use tarfile to open the tar content directly from bytes
with tarfile.open(fileobj=io.BytesIO(results_tar), mode="r:gz") as tar:
# Iterate over items in tar archive to find your json file by its path
for member in tar.getmembers():
# get path of results based on model id used to evaluate
if os.path.join("details", model_id) in member.name and member.name.endswith(".json"):
# Extract the file content
f = tar.extractfile(member)
if f is not None:
content = f.read()
result = json.loads(content)
break
# print results
print(result["results"])
# {'lighteval|truthfulqa:mc|0': {'truthfulqa_mc1': 0.40636474908200737, 'truthfulqa_mc1_stderr': 0.017193835812093897, 'truthfulqa_mc2': 0.5747003398184238, 'truthfulqa_mc2_stderr': 0.015742356478301463}}
在我们的测试中,我们获得了 40.6% 的 `mc1` 分数和 57.47% 的 `mc2` 分数。`mc2` 是 Open LLM Leaderboard 中使用的分数。Zephyr 7B 在 TruthfulQA 基准上获得了 57.47% 的 `mc2` 分数,这与 Open LLM Leaderboard 上的分数相同。Truthfulqa 上的评估耗时 `999 秒`。我们使用的 ml.g5.4xlarge 实例按需使用成本为 `每小时 2.03 美元`。因此,评估 Truthfulqa 上的 Zephyr 7B 的总成本为 `0.56 美元`。
📍 在 GitHub 此处查找完整示例!