نماذج ومنصات الذكاء الاصطناعي

تتبع نماذج اللغة الكبيرة مع MLflow: دليل كامل

mm
أضف Unite.AI إلى مصادرك المفضلة على Google
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的输入和相应的输出,并将其存储为结构化格式的工件,以便于检索和分析。
  • 工件:除了预测外,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,记录输入到LLM的输入和相应的输出至关重要。MLflow将它们存储为CSV格式的工件,使用mlflow.log_table()
  4. 工件:与LLM运行相关的任何其他文件或数据,例如模型检查点、可视化或数据集样本。使用mlflow.log_artifact()存储它们。

让我们看一个基本的LLM运行日志示例:

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


import mlflow
import openai

<p>def query_llm(prompt, max_tokens=100):</p>

<p>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():</p>

<p>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():</p>

<p>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就像您友好的邻居工具包,用于管理ML项目。它非常酷!",
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):</p>

<p>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():</p>

<p>for question in eval_questions:</p>

<p>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):</p>

<p>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):</p>

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

<p>with mlflow.start_run():</p>

<p>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]:</p>

<p>for chunk_overlap in [0, 50, 100]:</p>

<p>for splitter_class in [CharacterTextSplitter, TokenTextSplitter]:</p>

<p>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):</p>

<p>plt.figure(figsize=(10, 6))
for run_id in run_ids:</p>

<p>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():</p>

<p>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(由Databricks提供)

托管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 (AMZN ) SageMaker和Google的Vertex AI都提供了各自云平台上的端到端MLOps解决方案。这些服务提供了用于在规模上构建、训练和部署机器学习模型的强大工具。

详细比较

托管MLflow与开源MLflow

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

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

结论

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

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

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

لقد قمت بإنفاق الخمس سنوات الماضية في غمرة العالم المثير للاهتمام من التعلم الآلي والتعلم العميق. وقد أدت شغفي وخبرتي إلى المساهمة في أكثر من 50 مشروعًا متنوعًا في هندسة البرمجيات، مع التركيز بشكل خاص على الذكاء الاصطناعي والتعلم الآلي. كما أدت فضولي المستمر إلى جذبي نحو معالجة اللغة الطبيعية، وهو مجال أنا متحمس لاستكشافه بشكل أكبر.