跳到主要内容

DSPy 优化器自动日志记录

A DSPy 优化器 是一个算法,用于调整 DSPy 程序的参数(即提示和/或 LM 权重)以最大化您指定的指标。然而,由于其黑盒性质,优化器存在以下挑战:

  1. 单个试运行的参数和分数:程序参数(例如,建议的指令和选定的演示)以及优化过程中每次试运行的性能均未保存。
  2. 中间件构件:中间程序的提示和模型响应不可用。虽然其中一些被打印出来,但没有简单的方法以结构化的方式存储信息。
  3. 优化轨迹:很难从日志文本中理解优化轨迹的概览(例如,分数随时间的变化)。

MLflow DSPy flavor 提供了一种便捷的方式来自动跟踪优化过程和结果。这使您可以更有效地分析优化过程和结果。

注意

截至 MLflow 3.4.0,MLflow 提供了实验类型来区分经典的 ML/DL 和 GenAI UI 功能。当您使用 DSPy 优化器自动日志记录时,强烈建议使用“机器学习”实验类型。

启用自动日志记录

要为 DSPy 优化启用自动日志记录,请在您的脚本或 notebook 的开头调用 mlflow.dspy.autolog(),并使用以下参数。这将自动记录程序执行的跟踪以及其他指标和构件,例如程序状态、训练数据集和评估结果(取决于配置)。请注意,自 MLflow 2.21.1 起即可使用优化器自动日志记录功能。

import mlflow

mlflow.dspy.autolog(log_compiles=True, log_evals=True, log_traces_from_compile=True)

# Your DSPy code here
...
Target默认值参数描述
跟踪truelog_traces是否为程序生成和记录跟踪。有关跟踪功能的更多详细信息,请参阅 MLflow 跟踪
优化过程中的跟踪falselog_traces_from_compileMLflow 默认不为优化过程中的程序调用生成跟踪。设置为 True 以查看优化过程中程序调用的跟踪。
评估过程中的跟踪Truelog_traces_from_eval如果设置为 True,MLflow 将为评估过程中的程序调用生成跟踪。
优化falselog_compiles如果设置为 True,将为每次 Teleprompter.compile 调用创建一个 MLflow 运行,并记录优化的指标和构件。
评估falselog_evals如果设置为 True,将为每次 Evaluate.__call__ 调用创建一个 MLflow 运行,并记录评估的指标和构件。

DSPy 优化器自动日志记录示例代码

import dspy
from dspy.datasets.gsm8k import GSM8K, gsm8k_metric
import mlflow

# Enabling tracing for DSPy
mlflow.dspy.autolog(log_compiles=True, log_evals=True, log_traces_from_compile=True)

# Optional: Set a tracking URI and an experiment
mlflow.set_tracking_uri("https://:5000")
mlflow.set_experiment("DSPy")

lm = dspy.LM(model="openai/gpt-3.5-turbo", max_tokens=250)
dspy.configure(lm=lm)

gsm8k = GSM8K()

trainset = gsm8k.train
devset = gsm8k.dev[:50]

program = dspy.ChainOfThought("question -> answer")

# define a teleprompter
teleprompter = dspy.teleprompt.MIPROv2(
metric=gsm8k_metric,
auto="light",
)
# run the optimizer
optimized_program = teleprompter.compile(
program,
trainset=trainset,
max_bootstrapped_demos=3,
max_labeled_demos=4,
requires_permission_to_run=False,
)

记录的内容?

MLflow 优化器自动日志记录会记录以下信息:

  • 优化器参数:优化器的超参数(例如,演示的数量)。
  • 优化后的程序:MLflow 会将优化后程序的 состояния(状态)自动保存为 JSON 构件。
  • 数据集:优化中使用的训练和评估数据集。
  • 指标的整体进展:指标随时间的进展被捕获为编译运行的分步指标。
  • 中间程序状态和指标:每次评估的程序状态和性能指标被捕获在评估运行中。
  • 跟踪:每次中间程序的跟踪都捕获在评估运行中。

log_compileslog_evals 都设置为 True 时,MLflow 会为 Teleprompter.compile 创建一个运行,并为 Evaluate.__call__ 调用创建子运行。在 MLflow UI 中,它们将以分层方式显示,如下所示:

Experiment Page

在父运行(编译调用)的运行页面中,优化器参数显示为运行参数。程序性能的进展显示为模型指标,优化中使用的数据集显示为构件。当存在多种类型的评估调用时(例如,完整数据集评估和迷你批处理评估),评估结果将被单独记录。

Parent Run

在子运行(评估调用)的运行页面中,中间程序状态显示为运行参数,性能指标显示为模型指标,程序跟踪可在跟踪选项卡中找到。

Child Run

常见问题

如何将我的优化和评估记录到同一个运行中?

要将优化和评估都记录到同一个运行中,您可以使用 mlflow.start_run 手动创建一个父运行,并在该运行中执行您的优化和评估。

with mlflow.start_run(run_name="My Optimization Run") as run:
optimized_program = teleprompter.compile(
program,
trainset=trainset,
)
evaluation = dspy.Evaluate(devset=devset, metric=metric)
evaluation(optimized_program)