使用 Amazon SageMaker 托管的 MLflow 和 FMEval 跟踪 LLM 模型评

使用 Amazon SageMaker 管理的 MLflow 和 FMEval 追踪 LLM 模型评估

由 Paolo Di Francesco 和 Alessandro Cerè 于 2025 年 1 月 28 日发布于

分享

关键要点

  • 大语言模型 (LLMs) 的评估至关重要,以了解其能力、限制和潜在偏见。
  • 完善的评估过程对模型使用的适应性评估、输入数据质量和提示模板质量等方面至关重要。
  • FMEval 是一个开源库,提供面向开发人员的一种代码优先的 LLM 评估方法,并与 Amazon SageMaker 和 MLflow 集成。
  • 使用 Amazon SageMaker 管理的 MLflow 可以简化试验跟踪和管理 ML 生命周期,促进灵活的工作流程。

评估大型语言模型(LLM)对于日益强大且在社会中变得重要的 LLM 基础系统至关重要。严格的测试使我们能够理解 LLM的能力、局限性以及潜在偏见,并提供可操作的反馈以识别和减轻风险。此外,评估过程不仅对 LLM至关重要,还日益成为评估提示模板质量、输入数据质量以及整个应用栈的重要因素。随着 LLM在医疗、教育和决策支持等领域的重要性提升,强大的评估框架对于建立信任并实现技术潜力至关重要,同时降低风险。

希望使用 LLM的开发人员应优先考虑全面的评估过程,原因如下:首先,它评估模型在特定用例中的适用性,因为在不同任务和领域中的性能可能有很大差异。评估在应用开发过程中也是一个基本工具,能够验证提示模板的质量。这一过程确保在将解决方案推向生产之前,它们与公司的质量标准和政策指引保持一致。定期的评估还使组织能够了解最新的进展,以便做出关于升级或更换模型的明智决定。此外,全面的评估框架帮助公司 ,如数据隐私问题、合规性问题以及不当输出造成的声誉风险。通过投资于强大的评估实践,公司能够最大化 LLM的好处,同时保持 实施,并最小化潜在缺点。

为了支持强大的生成 AI应用开发,跟踪整个过程中使用的模型、提示模板和数据集是至关重要的。记录保持使开发人员和研究人员能够保持一致性、有效地产生结果和迭代他们的工作。通过记录具体的模型版本、微调参数及提示工程技术,团队可以更好地理解影响其 AI系统性能的因素。同样,维护关于训练和评估所用数据集的详细信息有助于识别模型知识库中的潜在偏见和局限性。从全面的跟踪关键组件中,不仅促进团队成员之间的协作,还实现不同迭代间的更准确比较。最终,这种系统化的管理模型、提示和数据集的方法有助于开发出更可靠和透明的生成 AI 应用。

在这篇文章中,我们展示了如何使用 和 以编程方式评估 LLM。FMEval 是一个开源的 LLM评估库,旨在为数据科学家和机器学习 (ML) 工程师提供一种以代码为基础的体验,以评估 LLM在准确性、毒性、公平性、稳健性和效率等多个方面的表现。在这篇文章中,我们专注于模型评估的质量和负责任的方面,但同样的方法可以通过使用其他库来扩展,例如用于评估性能和成本的 和 ,或由 提供的更丰富的质量评估能力。

SageMaker 是一个数据、分析和 AI/ML 平台,我们将与 FMEval 一起使用,以简化评估过程。我们特别关注 。
是一个开源平台,用于管理整个 ML 生命周期,包括实验、可重复性和部署。SageMaker中的托管 MLflow 简化了跟踪服务器的部署和操作,并与其他 AWS 服务无缝集成,使实验跟踪、打包代码为可重现的运行、共享和部署模型变得简单。

通过将 FMEval 的评估能力与 SageMaker 和 MLflow 结合,您可以创建一个强大、可扩展且可重现的评估 LLM性能的工作流程。这种方法可以使您系统地评估模型、跟踪结果并在生成 AI 开发过程中做出数据驱动的决策。

使用 FMEval 进行模型评估

FMEval 是一个用于评估基础模型 (FMs) 的开源库。它由三个主要组件组成:

  • 数据配置 – 指定数据集位置和结构。
  • 模型运行器 – 组合输入并调用模型,提取输出。借助此结构,您可以根据模型配置模型运行器,从而评估任何 LLM。
  • 评估算法 – 计算模型输出的评估指标。不同算法有不同的指标需要指定。

您可以使用预构建的组件,因为它为 和 提供本地组件,或者通过从基础核心组件继承来创建自定义组件。该库支持多种评估场景,包括预计算的模型输出和实时推断。FMEval在数据集处理、模型集成和算法实现方面提供了灵活性。有关 FMEval 的更深入探索,请参阅 或 的论文,或查看官方 。

使用 SageMaker 与 MLflow 追踪实验

Amazon SageMaker 上 基于三个核心组件构建:

  • MLflow 跟踪服务器 – 该组件可以通过 或 进行快速设置。它作为独立的 HTTP 服务器,提供多种 REST API 端点来监控、记录和可视化实验运行,从而帮助您跟踪 ML 实验。
  • MLflow 元数据后端 – 该跟踪服务器的重要部分,负责存储与实验相关的所有关键信息。它记录实验名称、运行标识符、参数设置、性能指标、标签和工件位置。这种全面的数据存储确保您可以有效地管理和分析 ML 项目。
  • MLflow 工件库 – 该组件用于储存所有在 ML 实验中生成的文件和对象,包括训练后的模型、数据集、日志文件和可视化结果。该库使用您 AWS 账户下的 (Amazon S3) 存储桶,确保您的工件安全存储并保持在您的控制之下。

以下图示展示了不同组件及其在 AWS 中的运行位置。

![MLflow架构示意图](https://d2908q01vomqb2.cloudfront.net/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59/2025/01/16/mlflow- 删除)

代码 walkthrough

您可以从 获取完整的示例代码。

先决条件

您必须具备以下先决条件:

  • 在 中运行的 MLflow 跟踪服务器
  • 在同一 SageMaker Studio 域中的 JupyterLab 应用
  • 针对要评估的 的活动订阅和调用这些模型的权限
  • 通过 部署基础模型的权限

请参考关于 (IAM) 策略的最佳实践,了解如何设置 、 和 的权限,配置 。请务必遵循 。

评估模型并记录到 MLflow

我们提供了两个示例笔记本,用于评估托管在 Amazon Bedrock 上的模型 () 和使用 SageMaker Hosting 借助 SageMakerJumpStart 部署的模型 ()。这两个笔记本实现的工作流程基本相同,但有一些显著差异:

  • 托管在 Amazon Bedrock 上的模型可以直接通过 API 访问,提供一种“无服务”体验,而在 SageMaker JumpStart 中的模型则需要用户先进行模型的部署。尽管通过 SageMaker JumpStart 部署模型是一个简单的操作,但用户需要负责管理端点的生命周期。
  • ModelRunners 的实现有所不同。FMEval 为 Amazon Bedrock 提供了原生实现,使用 BedrockModelRunner 类,而 SageMaker JumpStart 则使用 JumpStartModelRunner 类。我们将在后面的部分讨论主要的差异。

ModelRunner 定义

对于 BedrockModelRunner,我们需要找到模型的 content_template。可以方便地在 Amazon Bedrock控制台的 API 请求 示例部分找到该信息,查看 body 的值。以下示例是 Anthropic 的 Claude 3 Haiku 的内容模板:

python output_jmespath = "content[0].text" content_template = """{ "anthropic_version": "bedrock-2023-05-31", "max_tokens": 512, "temperature": 0.5, "messages": [ { "role": "user", "content": [ { "type": "text", "text": $prompt } ] } ] }""" model_runner = BedrockModelRunner( model_id=model_id, output=output_jmespath, content_template=content_template, )

对于 JumpStartModelRunner,我们需要找到模型和 model_version。可以使用 SageMaker Python SDK提供的 get_model_info_from_endpoint(endpoint_name=endpoint_name) 工具直接检索此信息,其中 endpoint_name 是托管 SageMaker JumpStart 模型的 SageMaker 端点的名称。请参见以下代码示例:


model_id, model_version, , , _ =
get_model_info_from_endpoint(endpoint_name=endpoint_name)

model_runner = JumpStartModelRunner( endpoint_name=endpoint_name,
model_id=model_id, model_version=model_version, ) ```

### DataConfig 定义

对于每个模型运行器,我们希望评估三个类别:`Summarization`、`Factual Knowledge` 和
`Toxicity`。为每个类别,我们为适当数据集准备一个 `DataConfig` 对象。以下示例仅展示 `Summarization` 类别的数据:

```python dataset_path = Path("datasets")

dataset_uri_summarization = dataset_path / "gigaword_sample.jsonl" if notdataset_uri_summarization.is_file(): print("ERROR - 请确保文件
gigaword_sample.jsonl 存在。")

data_config_summarization = DataConfig( dataset_name="gigaword_sample",
dataset_uri=dataset_uri_summarization.as_posix(),
dataset_mime_type=MIME_TYPE_JSONLINES, model_input_location="document",
target_output_location="summary", ) ```

### 评估集定义

现在我们可以创建用于我们的测试的每个算法的评估集。对于 `Summarization` 评估集,根据之前识别的输入签名替换您自己的提示。`fmeval`
使用 `$model_input` 作为占位符,从您的评估数据集中获取输入。请参见以下代码:

```python summarization_prompt = "将以下文本总结为一句话:$model_input"

summarization_accuracy = SummarizationAccuracy()

evaluation_set_summarization = EvaluationSet( data_config_summarization,
summarization_accuracy, summarization_prompt, ) ```

我们现在准备将评估集分组:

`python evaluation_list =  中定义的
`run_evaluation_sets()` 运行评估。请参见以下代码:

```python run_name = f"{model_id}"

experiment_name = "fmeval-mlflow-simple-runs" experiment =
mlflow.set_experiment(experiment_name)

with mlflow.start_run(run_name=run_name) as run:
run_evaluation_sets(model_runner, evaluation_list) ```

由用户自行决定如何在 MLflow 中最佳组织结果。实际上,第二种可能的方式是使用 `nested`
运行。样本笔记本实现了两种方法,以帮助您决定哪一种最适合您的需求。

```python experiment_name = "fmeval-mlflow-nested-runs" experiment =
mlflow.set_experiment(experiment_name)

with mlflow.start_run(run_name=run_name, nested=True) as run:
run_evaluation_sets_nested(model_runner, evaluation_list) ```

## 运行评估

跟踪评估过程涉及存储关于三个方面的信息:

  * 输入数据集
  * 被评估模型的参数
  * 每个评估的得分

我们提供一个辅助库 (``) 来抽象将这些信息记录到 MLflow的过程,简化与跟踪服务器的交互。对于我们要存储的信息,可以参考以下三个函数:

  * `log_input_dataset(data_config: DataConfig | list[DataConfig])` – 将一个或多个输入数据集记录到 MLflow 以进行评估
  * `log_runner_parameters(model_runner: ModelRunner, custom_parameters_map: dict | None = None, model_id: str | None = None,)` – 将与给定 `ModelRunner` 实例相关的参数记录到 MLflow
  * `log_metrics(eval_output: list

  * Nested Runs 示例:  
![嵌套运行示例](https://d

Leave a Reply

Required fields are marked *