在 AWS 上部署的文档

使用 Hugging Face Lighteval 在 Amazon SageMaker 上评估 LLM

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

使用 Hugging Face Lighteval 在 Amazon SageMaker 上评估 LLM

在此 SageMaker 示例中,我们将学习如何使用 Hugging Face lighteval 评估 LLM。LightEval 是一个轻量级的 LLM 评估套件,为 Hugging Face Open LLM Leaderboard 提供支持。

评估 LLM 对于了解其能力和局限性至关重要,但由于其复杂和不透明的性质,这带来了重大挑战。LightEval 通过使 LLM 能够在 MMLU 或 IFEval 等学术基准上进行评估,从而促进了这一评估过程,提供了衡量其在不同任务中性能的结构化方法。

您将详细了解如何

  1. 设置开发环境
  2. 准备评估配置
  3. 在 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 此处查找完整示例!

< > 在 GitHub 上更新