DSPy 优化器自动日志记录
一个 DSPy 优化器 是一种算法,用于调整 DSPy 程序的参数(即提示和/或语言模型权重),以最大化您指定的指标。然而,由于其黑箱性质,优化器面临以下挑战:
- 单个试验的参数和得分:优化期间每个试验的程序参数(例如建议的指令和选择的演示)和性能不会被保存。
- 中间工件:中间程序的提示和模型响应不可用。虽然其中一些会被打印出来,但没有简单的方法以结构化方式存储信息。
- 优化轨迹:很难从日志文本(例如得分随时间的进展)理解优化轨迹的概况。
MLflow DSPy 风格提供了一种便捷的方式来自动跟踪优化过程和结果。这使您能够更有效地分析优化过程和结果。
启用自动日志记录
要启用 DSPy 优化的自动日志记录,请在脚本或笔记本的开头调用 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
...
目标 | 默认值 | 参数 | 描述 |
---|---|---|---|
跟踪 | true | log_traces | 是否为程序生成和记录跟踪。有关跟踪功能的更多详细信息,请参见 MLflow 跟踪。 |
优化期间的跟踪 | false | log_traces_from_compile | MLflow 默认情况下不会为优化期间的程序调用生成跟踪。将此项设置为 True 可查看优化期间程序调用的跟踪。 |
评估期间的跟踪 | True | log_traces_from_eval | 如果设置为 True ,MLflow 会为评估期间的程序调用生成跟踪。 |
优化 | false | log_compiles | 如果设置为 True ,则为每个 Teleprompter.compile 调用创建一个 MLflow 运行 (run),并记录优化的指标和工件。 |
评估 | false | log_evals | 如果设置为 True ,则为每个 Evaluate.__call__ 调用创建一个 MLflow 运行 (run),并记录评估的指标和工件。 |
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("http://localhost:5000")
mlflow.set_experiment("DSPy")
lm = dspy.LM(model="openai/gpt-3.5-turbo", max_tokens=250)
dspy.configure(lm=lm)
gsm8k = GSM8K()
trainset, devset = gsm8k.train, gsm8k.dev[:50]
class CoT(dspy.Module):
def __init__(self):
super().__init__()
self.prog = dspy.ChainOfThought("question -> answer")
def forward(self, question):
return self.prog(question=question)
program = CoT()
# 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_compiles
和 log_evals
都设置为 True
时,MLflow 会为 Teleprompter.compile
创建一个父运行 (run),并为 Evaluate.__call__
调用创建子运行 (run)。在 MLflow UI 中,它们会以如下所示的层级结构显示:

在父运行(编译调用)的运行页面中,优化器参数显示为运行参数。程序性能的进展显示为模型指标,优化中使用的数据集显示为工件。当存在多种类型的评估调用(例如全数据集评估和 mini-batch 评估)时,评估结果会单独记录。

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

常见问题
如何将我的优化和评估记录到同一个运行中?
要将优化和评估都记录到同一个运行中,您可以使用 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)