AI 工具 101

使用 MLflow 跟踪大型语言模型(LLM):完整指南

mm
MLflow LLM Guide Evaluation
div]:bg-bg-300 [&_pre]:-mr-4 md:[&_pre]:-mr-9″>

随着大型语言模型(LLM)的复杂性和规模的增长,跟踪其性能、实验和部署变得越来越具有挑战性。这就是 MLflow 的用途——提供一个全面的平台来管理整个机器学习模型的生命周期,包括 LLM。

在这篇深入的指南中,我们将探讨如何利用 MLflow 来跟踪、评估和部署 LLM。我们将涵盖从设置环境到高级评估技术的所有内容,并提供大量的代码示例和最佳实践。

MLflow 在大型语言模型(LLM)中的功能

MLflow 已成为机器学习和数据科学社区中的一个关键工具,尤其是在管理机器学习模型的生命周期方面。当谈到大型语言模型(LLM)时,MLflow 提供了一套强大的工具,可以显著简化开发、跟踪、评估和部署这些模型的过程。以下是 MLflow 在 LLM 空间中的功能概述及其带来的好处。

了解 MLflow 的核心组件

跟踪和管理 LLM 交互

MLflow 的 LLM 跟踪系统是其现有跟踪功能的增强,专门针对 LLM 的独特需求。它允许对模型交互进行全面跟踪,包括以下关键方面:

  • 参数:记录详细的输入参数对,例如模型特定的参数,如 top_ktemperature。这为每次运行提供了上下文和配置,确保捕获模型配置的所有方面。
  • 指标:提供对 LLM 性能和准确性的洞察的量化措施。这些可以动态更新,因为运行进展,提供实时或后处理洞察。
  • 预测:捕获输入到 LLM 和相应输出,这些输出以 CSV 格式存储为结构化的工件,方便检索和分析。
  • 工件:除了预测,MLflow 还可以存储各种输出文件,例如可视化、序列化模型和结构化数据文件,允许对模型性能进行详细的文档和分析。

这种结构化的方法确保所有与 LLM 的交互都被精心记录,提供了针对文本生成模型的全面血统和质量跟踪。

LLM 的评估

评估 LLM 提出了独特的挑战,主要是由于其生成性质和缺乏单一的真实值。MLflow 通过为 LLM 设计的专用评估工具简化了这一过程。关键功能包括:

  • 多功能模型评估:支持评估各种类型的 LLM,包括 MLflow pyfunc 模型、指向注册的 MLflow 模型的 URI 或任何代表模型的 Python 可调用函数。
  • 全面指标:提供一系列针对 LLM 评估量身定制的指标,包括基于 SaaS 模型的指标(例如答案相关性)和基于函数的指标(例如 ROUGE、Flesch-Kincaid)。
  • 预定义的指标集合:根据用例(例如问答或文本摘要),MLflow 提供预定义的指标以简化评估过程。
  • 自定义指标创建:允许用户定义和实现自定义指标以满足特定的评估需求,增强了模型评估的灵活性和深度。
  • 静态数据集评估:允许在不指定模型的情况下评估静态数据集,对于不需要重新运行模型推理的快速评估很有用。

部署和集成

MLflow 还支持 LLM 的无缝部署和集成:

  • MLflow 部署服务器:作为与多个 LLM 提供商交互的统一接口。它简化了集成,安全地管理凭据,并提供了一致的 API 体验。该服务器支持来自流行的 SaaS 供应商和自托管模型的基础模型。
  • 统一端点:通过无需代码更改即可轻松在提供商之间切换,减少停机时间并增强灵活性。
  • 集成结果视图:提供全面评估结果,可以直接在代码中或通过 MLflow UI 进行详细分析访问。

MLflow 的全面工具和集成使其成为与高级 NLP 模型合作的工程师和数据科学家的宝贵资产。

设置您的环境

在我们深入探讨使用 MLflow 跟踪 LLM 之前,让我们设置我们的开发环境。我们需要安装 MLflow 和其他几个关键库:

pip install mlflow>=2.8.1
pip install openai
pip install chromadb==0.4.15
pip install langchain==0.0.348
pip install tiktoken
pip install 'mlflow[genai]'
pip install databricks-sdk --upgrade

安装后,重新启动 Python 环境以确保所有库都正确加载是一个好习惯。在 Jupyter 笔记本中,您可以使用:

import mlflow
import chromadb

<p>print(f"MLflow 版本:{mlflow.__version__}")
print(f"ChromaDB 版本:{chromadb.__version__}")

这将确认我们将要使用的关键库的版本。

了解 MLflow 的 LLM 跟踪功能

MLflow 的 LLM 跟踪系统建立在其现有的跟踪功能之上,添加了专门为 LLM 的独特方面设计的功能。让我们分解关键组件:

运行和实验

在 MLflow 中,一个“运行”代表一次模型代码的执行,而“实验”是相关运行的集合。对于 LLM,一个运行可能代表一个单独的查询或由模型处理的一批提示。

关键跟踪组件

  1. 参数:这些是您的 LLM 的输入配置,例如温度、top_k 或 max_tokens。您可以使用 mlflow.log_param()mlflow.log_params() 来记录这些参数。
  2. 指标:您的 LLM 的性能的量化措施,例如准确性、延迟或自定义评分。使用 mlflow.log_metric()mlflow.log_metrics() 来跟踪这些指标。
  3. 预测:对于 LLM,记录输入提示和模型输出至关重要。MLflow 将这些输出存储为 CSV 格式的工件,使用 mlflow.log_table()
  4. 工件:与运行相关的任何其他文件或数据,例如模型检查点、可视化或数据集样本。使用 mlflow.log_artifact() 来存储这些工件。

让我们看一个基本的示例,记录一个 LLM 运行:

此示例演示了记录参数、指标和输入/输出作为表格工件。


import mlflow
import openai

<p>def query_llm(prompt, max_tokens=100):
response = openai.Completion.create(
engine="text-davinci-002",
prompt=prompt,
max_tokens=max_tokens
)
return response.choices[0].text.strip()</p>

<p>with mlflow.start_run():
prompt = "用简单的术语解释机器学习的概念。"</p>

<p># 记录参数
mlflow.log_param("model", "text-davinci-002")
mlflow.log_param("max_tokens", 100)</p>

<p># 查询 LLM 并记录结果
result = query_llm(prompt)
mlflow.log_metric("response_length", len(result))</p>

<p># 记录提示和响应
mlflow.log_table("prompt_responses", {"prompt": [prompt], "response": [result]})</p>

<p>print(f"响应:{result}")

使用 MLflow 部署 LLM

MLflow 提供了强大的功能来部署 LLM,使得在生产环境中提供您的模型变得更加容易。让我们探索如何使用 MLflow 的部署功能来部署一个 LLM。

创建端点

首先,我们将使用 MLflow 的部署客户端创建一个 LLM 的端点:

import mlflow
from mlflow.deployments import get_deploy_client

<p># 初始化部署客户端
client = get_deploy_client("databricks")</p>

<p># 定义端点配置
endpoint_name = "llm-endpoint"
endpoint_config = {
"served_entities": [{
"name": "gpt-model",
"external_model": {
"name": "gpt-3.5-turbo",
"provider": "openai",
"task": "llm/v1/completions",
"openai_config": {
"openai_api_type": "azure",
"openai_api_key": "{{secrets/scope/openai_api_key}}",
"openai_api_base": "{{secrets/scope/openai_api_base}}",
"openai_deployment_name": "gpt-35-turbo",
"openai_api_version": "2023-05-15",
},
},
}],
}</p>

<p># 创建端点
client.create_endpoint(name=endpoint_name, config=endpoint_config)

此代码使用 Azure OpenAI 设置了一个 GPT-3.5-turbo 模型的端点。请注意使用 Databricks 秘密进行安全的 API 密钥管理。

测试端点

创建端点后,我们可以测试它:

&lt;div class="relative flex flex-col rounded-lg"&gt;

<p>response = client.predict(
endpoint=endpoint_name,
inputs={"prompt": "简要解释神经网络的概念。", "max_tokens": 100,},
)</p>

print(response)

这将向我们的部署模型发送一个提示并返回生成的响应。

使用 MLflow 评估 LLM

评估对于理解 LLM 的性能和行为至关重要。MLflow 提供了全面工具来评估 LLM,包括内置和自定义指标。

准备您的 LLM 进行评估

要使用 mlflow.evaluate() 评估您的 LLM,您的模型需要以以下形式之一存在:

  1. 一个 mlflow.pyfunc.PyFuncModel 实例或指向已记录的 MLflow 模型的 URI。
  2. 一个接受字符串输入并输出单个字符串的 Python 函数。
  3. 一个 MLflow Deployments 端点 URI。
  4. 设置 model=None 并在评估数据中包含模型输出。

让我们看一个使用已记录的 MLflow 模型的示例:

import mlflow
import openai

<p>with mlflow.start_run():
system_prompt = "简要回答以下问题。"
logged_model_info = mlflow.openai.log_model(
model="gpt-3.5-turbo",
task=openai.chat.completions,
artifact_path="model",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": "{question}"},
],
)</p>

<p># 准备评估数据
eval_data = pd.DataFrame({
"question": ["什么是机器学习?", "解释神经网络。"],
"ground_truth": [
"机器学习是人工智能的一个子集,能够让系统从经验中学习和改进,而无需显式编程。",
"神经网络是受生物神经网络启发的计算系统,由处理和传输信息的相互连接的节点组成。",
]
})</p>

<p># 评估模型
results = mlflow.evaluate(
logged_model_info.model_uri,
eval_data,
targets="ground_truth",
model_type="question-answering",
)</p>

<p>print(f"评估指标:{results.metrics}")

此示例记录一个 OpenAI 模型,准备评估数据,然后使用 MLflow 的内置指标评估模型,用于问答任务。

自定义评估指标

MLflow 允许您定义自定义指标来评估 LLM。以下是创建一个自定义指标的示例,用于评估响应的专业性:

from mlflow.metrics.genai import EvaluationExample, make_genai_metric

<p>professionalism = make_genai_metric(
name="professionalism",
definition="正式和适当的沟通风格的衡量标准。",
grading_prompt=(
"根据回答的正式和专业程度对其进行评分(0-4 分)。\n"
"0:非常随意或不恰当\n"
"1:随意但尊重\n"
"2:中度正式\n"
"3:专业和适当\n"
"4:非常正式和精心制作"
),
examples=[
EvaluationExample(
input="什么是 MLflow?",
output="MLflow 是一个用于管理机器学习项目的工具包。它非常酷!",
score=1,
justification="回答很随意,使用非正式语言。",
),
EvaluationExample(
input="什么是 MLflow?",
output="MLflow 是一个用于机器学习生命周期的开源平台,包括实验、可复现性和部署。",
score=4,
justification="回答正式、简洁、专业措辞。",
)
],
model="openai:/gpt-3.5-turbo-16k",
parameters={"temperature": 0.0},
aggregations=["mean", "variance"],
greater_is_better=True,
)</p>

<p># 在评估中使用自定义指标
results = mlflow.evaluate(
logged_model_info.model_uri,
eval_data,
targets="ground_truth",
model_type="question-answering",
extra_metrics=[professionalism]
)</p>

<p>print(f"专业性评分:{results.metrics['professionalism_mean']}")

此自定义指标使用 GPT-3.5-turbo 来评估响应的专业性,展示了如何利用 LLM 本身进行评估。

高级 LLM 评估技术

随着 LLM 的日益复杂,评估它们的技术也变得更加先进。让我们探索一些使用 MLflow 的高级评估方法。

检索增强生成(RAG)评估

RAG 系统结合了检索和生成模型的力量。评估 RAG 系统需要评估检索和生成组件。以下是如何设置 RAG 系统并使用 MLflow 进行评估:

from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

<p># 加载和预处理文档
loader = WebBaseLoader(["https://mlflow.org/docs/latest/index.html"])
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)</p>

<p># 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)</p>

<p># 创建 RAG 链
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(),
return_source_documents=True
)</p>

<p># 评估函数
def evaluate_rag(question):
result = qa_chain({"query": question})
return result["result"], [doc.page_content for doc in result["source_documents"]]</p>

<p># 准备评估数据
eval_questions = [
"什么是 MLflow?",
"MLflow 如何处理实验跟踪?",
"MLflow 的主要组件是什么?"
]</p>

<p># 使用 MLflow 进行评估
with mlflow.start_run():
for question in eval_questions:
answer, sources = evaluate_rag(question)</p>

<p>mlflow.log_param(f"question", question)
mlflow.log_metric("num_sources", len(sources))
mlflow.log_text(answer, f"answer_{question}.txt")</p>

<p>for i, source in enumerate(sources):
mlflow.log_text(source, f"source_{question}_{i}.txt")</p>

<p># 记录自定义指标
mlflow.log_metric("avg_sources_per_question", sum(len(evaluate_rag(q)[1]) for q in eval_questions) / len(eval_questions))

此示例设置了一个 RAG 系统,使用 LangChain 和 Chroma,然后使用 MLflow 进行评估,记录问题、答案、检索的源文件和自定义指标。

分块策略评估

文档的分块方式会显著影响 RAG 的性能。MLflow 可以帮助您评估不同的分块策略:

import mlflow
from langchain.text_splitter import CharacterTextSplitter, TokenTextSplitter

<p>def evaluate_chunking_strategy(documents, chunk_size, chunk_overlap, splitter_class):
splitter = splitter_class(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
chunks = splitter.split_documents(documents)</p>

<p>with mlflow.start_run():
mlflow.log_param("chunk_size", chunk_size)
mlflow.log_param("chunk_overlap", chunk_overlap)
mlflow.log_param("splitter_class", splitter_class.__name__)</p>

<p>mlflow.log_metric("num_chunks", len(chunks))
mlflow.log_metric("avg_chunk_length", sum(len(chunk.page_content) for chunk in chunks) / len(chunks))</p>

<p># 评估检索性能(简化)
correct_retrievals = sum(1 for _ in range(100) if simulate_retrieval(chunks))
mlflow.log_metric("retrieval_accuracy", correct_retrievals / 100)</p>

<p># 评估不同的策略
for chunk_size in [500, 1000, 1500]:
for chunk_overlap in [0, 50, 100]:
for splitter_class in [CharacterTextSplitter, TokenTextSplitter]:
evaluate_chunking_strategy(documents, chunk_size, chunk_overlap, splitter_class)</p>

<p># 比较结果
best_run = mlflow.search_runs(order_by=["metrics.retrieval_accuracy DESC"]).iloc[0]
print(f"最佳分块策略:{best_run['params.splitter_class']},大小 {best_run['params.chunk_size']},重叠 {best_run['params.chunk_overlap']}")

此脚本评估不同的分块大小、重叠和分割方法的组合,并将结果记录到 MLflow 中以便于比较。

可视化 LLM 评估结果

MLflow 提供了多种方法来可视化您的 LLM 评估结果。以下是一些技术:

使用 MLflow UI

运行评估后,您可以使用 MLflow UI 来可视化结果:

  1. 启动 MLflow UI:mlflow ui
  2. 在 Web 浏览器中打开 http://localhost:5000
  3. 选择您的实验和运行以查看指标、参数和工件

自定义可视化

您可以使用 Matplotlib 或 Plotly 等库创建评估结果的自定义可视化,然后将其记录为工件:

import matplotlib.pyplot as plt
import mlflow

<p>def plot_metric_comparison(metric_name, run_ids):
plt.figure(figsize=(10, 6))
for run_id in run_ids:
run = mlflow.get_run(run_id)
metric_values = mlflow.get_metric_history(run_id, metric_name)
plt.plot([m.step for m in metric_values], [m.value for m in metric_values], label=run.data.tags.get("mlflow.runName", run_id))</p>

<p>plt.title(f"{metric_name} 比较")
plt.xlabel("步骤")
plt.ylabel(metric_name)
plt.legend()</p>

<p># 保存和记录图表
plt.savefig(f"{metric_name}_comparison.png")
mlflow.log_artifact(f"{metric_name}_comparison.png")</p>

<p># 使用
with mlflow.start_run():
plot_metric_comparison("answer_relevance", ["run_id_1", "run_id_2", "run_id_3"])

此函数创建一个比较特定指标在多个运行中的线图,并将其记录为工件。

div]:bg-bg-300 [&_pre]:-mr-4 md:[&_pre]:-mr-9″>

开源 MLflow 的替代方案

有许多替代开源 MLflow 的选项来管理机器学习工作流,包括:

托管 MLflow

托管 MLflow 由 Databricks 提供,提供了开源 MLflow 的核心功能,并具有额外的好处,例如与 Databricks 生态系统的无缝集成、先进的安全功能和托管基础设施。这使其成为需要强大安全性和可扩展性的组织的绝佳选择。

Azure 机器学习

Azure 机器学习 提供了 Microsoft Azure 云平台上的端到端机器学习解决方案。它提供了与 MLflow 组件(如模型注册表和实验跟踪器)兼容的功能,尽管它不是基于 MLflow。

专用 ML 平台

几家公司提供具有多种功能的托管 ML 产品:

  • neptune.ai:专注于实验跟踪和模型管理。
  • Weights & Biases:提供广泛的实验跟踪、数据集版本控制和协作工具。
  • Comet ML:提供实验跟踪、模型生产监控和数据记录。
  • Valohai:专门从事机器学习管道和编排。

Metaflow

Metaflow 由 Netflix 开发,是一个开源框架,旨在编排数据工作流和 ML 管道。虽然它在大规模部署方面表现出色,但与 MLflow 相比,它缺乏全面实验跟踪和模型管理功能。

Amazon SageMaker 和 Google 的 Vertex AI

Amazon SageMaker 和 Google 的 Vertex AI 都提供了各自云平台上的端到端 MLOps 解决方案。这些服务提供了用于在大规模构建、训练和部署机器学习模型的强大工具。

详细比较

托管 MLflow 与开源 MLflow

托管 MLflow 由 Databricks 提供,相比开源版本具有多个优势,包括:

  • 设置和部署:与 Databricks 的集成减少了设置时间和工作量。
  • 可扩展性:能够轻松处理大规模的机器学习工作负载。
  • 安全和管理:具有内置的安全功能,例如基于角色的访问控制(RBAC)和数据加密。
  • 集成:与 Databricks 服务的深度集成,增强了互操作性和功能。
  • 数据存储和备份:自动备份策略确保数据安全和可靠性。
  • 成本:用户为平台、存储和计算资源付费。
  • 支持和维护:Databricks 提供专用支持和维护。

结论

使用 MLflow 跟踪大型语言模型提供了一个强大的框架来管理 LLM 开发、评估和部署的复杂性。通过遵循本指南中概述的最佳实践和高级功能,您可以创建更有组织、更可复现和更有见地的 LLM 实验。

请记住,LLM 的领域正在迅速发展,新的评估和跟踪技术不断涌现。请随时关注最新的 MLflow 版本和 LLM 研究,以不断完善您的跟踪和评估流程。

随着您在项目中应用这些技术,您将对 LLM 的行为和性能有更深入的了解,从而带来更有效、更可靠的语言模型。

我已经沉浸在了令人着迷的机器学习和深度学习世界中五年了。我的热情和专业知识让我为超过50个不同的软件工程项目做出了贡献,特别关注AI/ML。我的持续的好奇心也让我对自然语言处理产生了兴趣,这是一个我渴望进一步探索的领域。