نماذج ومنصات الذكاء الاصطناعي
تتبع نماذج اللغة الكبيرة مع MLflow: دليل كامل
随着大型语言模型(LLM)的复杂性和规模的增长,跟踪其性能、实验和部署变得越来越具有挑战性。这就是MLflow的用途——提供一个全面管理机器学习模型整个生命周期的平台,包括LLM。
在本深度指南中,我们将探讨如何利用MLflow进行LLM的跟踪、评估和部署。我们将涵盖从设置环境到高级评估技术的所有内容,并在此过程中提供大量代码示例和最佳实践。
设置您的环境
在我们深入探讨使用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,一个运行可能代表一个单独的查询或一批由模型处理的提示。
关键跟踪组件
- 参数:这些是LLM的输入配置,例如温度、top_k或max_tokens。您可以使用
mlflow.log_param()或mlflow.log_params()记录它们。 - 指标:LLM性能的量化衡量标准,例如准确性、延迟或自定义评分。使用
mlflow.log_metric()或mlflow.log_metrics()跟踪它们。 - 预测:对于LLM,记录输入到LLM的输入和相应的输出至关重要。MLflow将它们存储为CSV格式的工件,使用
mlflow.log_table()。 - 工件:与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密钥。
测试端点
端点创建后,我们可以测试它:
<div class="relative flex flex-col rounded-lg">
<p>response = client.predict(
endpoint=endpoint_name,
inputs={"prompt": "简要解释神经网络的概念。", "max_tokens": 100,},)</p>
print(response)
这将向我们的部署模型发送一个提示,并返回生成的响应。
使用MLflow评估LLM
评估对于理解LLM的性能和行为至关重要。MLflow提供了全面评估LLM的工具,包括内置和自定义指标。
准备LLM进行评估
要使用mlflow.evaluate()评估LLM,您的模型需要以以下形式之一存在:
- 一个
mlflow.pyfunc.PyFuncModel实例或指向已记录的MLflow模型的URI。 - 一个Python函数,它接受字符串输入并输出一个字符串。
- 一个MLflow Deployments端点URI。
- 设置
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可视化结果:
- 启动MLflow UI:
mlflow ui - 在Web浏览器中打开并导航到
http://localhost:5000 - 选择您的实验和运行以查看指标、参数和工件
自定义可视化
您可以使用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"])
此函数创建一个比较特定指标在多个运行中表现的线图,并将其记录为工件。
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的行为和性能有更深入的了解,从而带来更有效、更可靠的语言模型。














