关注我们.

人工智能工具 101

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

mm
MLflow LLM 指南评估

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

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

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

流量 MLflow 已成为机器学习和数据科学界的关键工具,尤其适用于管理机器学习模型的生命周期。对于大型语言模型 (LLM),MLflow 提供了一套强大的工具,可显著简化开发、跟踪、评估和部署这些模型的流程。以下概述了 MLflow 在 LLM 领域的功能以及它为工程师和数据科学家带来的优势。

了解 MLflow 的核心组件

跟踪和管理 LLM 交互

MLflow 的 LLM 跟踪系统是其现有跟踪功能的增强,针对 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 Notebook 中,你可以使用:

import mlflow
import chromadb

print(f"MLflow version: {mlflow.__version__}")
print(f"ChromaDB version: {chromadb.__version__}")

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

了解 MLflow 的 LLM 跟踪功能

MLflow 的 LLM 跟踪系统在其现有跟踪功能的基础上,添加了专门针对 LLM 独特方面设计的功能。让我们来分解一下关键组件:

运行和实验

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

关键追踪组件

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

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

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

import mlflow
import openai

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()

with mlflow.start_run():
    prompt = "Explain the concept of machine learning in simple terms."
    
    # Log parameters
    mlflow.log_param("model", "text-davinci-002")
    mlflow.log_param("max_tokens", 100)
    
    # Query the LLM and log the result
    result = query_llm(prompt)
    mlflow.log_metric("response_length", len(result))
    
    # Log the prompt and response
    mlflow.log_table("prompt_responses", {"prompt": [prompt], "response": [result]})
    
    print(f"Response: {result}")

使用 MLflow 部署 LLM

MLflow 提供了强大的 LLM 部署功能,让您能够更轻松地在生产环境中为模型提供服务。让我们探索如何使用 MLflow 的部署功能来部署 LLM。

创建端点

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

import mlflow
from mlflow.deployments import get_deploy_client

# Initialize the deployment client
client = get_deploy_client("databricks")

# Define the endpoint configuration
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",
            },
        },
    }],
}

# Create the endpoint
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">

response = client.predict(
endpoint=endpoint_name,
inputs={"prompt": "Explain the concept of neural networks briefly.","max_tokens": 100,},)

print(response)

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

使用 MLflow 评估 LLM

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

准备你的法学硕士 (LLM) 评估

评估你的法学硕士 mlflow.evaluate(),你的模型需要采用以下形式之一:

  1. An mlflow.pyfunc.PyFuncModel 实例或指向已记录的 MLflow 模型的 URI。
  2. 接受字符串输入并输出单个字符串的 Python 函数。
  3. MLflow 部署端点 URI。
  4. model=None 并将模型输出纳入评估数据中。

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

import mlflow
import openai

with mlflow.start_run():
    system_prompt = "Answer the following question concisely."
    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}"},
        ],
    )

# Prepare evaluation data
eval_data = pd.DataFrame({
    "question": ["What is machine learning?", "Explain neural networks."],
    "ground_truth": [
        "Machine learning is a subset of AI that enables systems to learn and improve from experience without explicit programming.",
        "Neural networks are computing systems inspired by biological neural networks, consisting of interconnected nodes that process and transmit information."
    ]
})

# Evaluate the model
results = mlflow.evaluate(
    logged_model_info.model_uri,
    eval_data,
    targets="ground_truth",
    model_type="question-answering",
)

print(f"Evaluation metrics: {results.metrics}")

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

自定义评估指标

MLflow 允许您定义 LLM 评估的自定义指标。以下是创建用于评估回复专业性的自定义指标的示例:

from mlflow.metrics.genai import EvaluationExample, make_genai_metric

professionalism = make_genai_metric(
    name="professionalism",
    definition="Measure of formal and appropriate communication style.",
    grading_prompt=(
        "Score the professionalism of the answer on a scale of 0-4:\n"
        "0: Extremely casual or inappropriate\n"
        "1: Casual but respectful\n"
        "2: Moderately formal\n"
        "3: Professional and appropriate\n"
        "4: Highly formal and expertly crafted"
    ),
    examples=[
        EvaluationExample(
            input="What is MLflow?",
            output="MLflow is like your friendly neighborhood toolkit for managing ML projects. It's super cool!",
            score=1,
            justification="The response is casual and uses informal language."
        ),
        EvaluationExample(
            input="What is MLflow?",
            output="MLflow is an open-source platform for the machine learning lifecycle, including experimentation, reproducibility, and deployment.",
            score=4,
            justification="The response is formal, concise, and professionally worded."
        )
    ],
    model="openai:/gpt-3.5-turbo-16k",
    parameters={"temperature": 0.0},
    aggregations=["mean", "variance"],
    greater_is_better=True,
)

# Use the custom metric in evaluation
results = mlflow.evaluate(
    logged_model_info.model_uri,
    eval_data,
    targets="ground_truth",
    model_type="question-answering",
    extra_metrics=[professionalism]
)

print(f"Professionalism score: {results.metrics['professionalism_mean']}")

该自定义指标使用 GPT-3.5-turbo 来评分响应的专业性,展示了如何利用 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

# Load and preprocess documents
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)

# Create vector store
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)

# Create RAG chain
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever(),
    return_source_documents=True
)

# Evaluation function
def evaluate_rag(question):
    result = qa_chain({"query": question})
    return result["result"], [doc.page_content for doc in result["source_documents"]]

# Prepare evaluation data
eval_questions = [
    "What is MLflow?",
    "How does MLflow handle experiment tracking?",
    "What are the main components of MLflow?"
]

# Evaluate using MLflow
with mlflow.start_run():
    for question in eval_questions:
        answer, sources = evaluate_rag(question)
        
        mlflow.log_param(f"question", question)
        mlflow.log_metric("num_sources", len(sources))
        mlflow.log_text(answer, f"answer_{question}.txt")
        
        for i, source in enumerate(sources):
            mlflow.log_text(source, f"source_{question}_{i}.txt")

    # Log custom metrics
    mlflow.log_metric("avg_sources_per_question", sum(len(evaluate_rag(q)[1]) for q in eval_questions) / len(eval_questions))

此示例使用 LangChain 和 Chroma 设置 RAG 系统,然后通过将问题、答案、检索到的源和自定义指标记录到 MLflow 对其进行评估。

分块策略评估

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

import mlflow
from langchain.text_splitter import CharacterTextSplitter, TokenTextSplitter

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)
    
    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__)
        
        mlflow.log_metric("num_chunks", len(chunks))
        mlflow.log_metric("avg_chunk_length", sum(len(chunk.page_content) for chunk in chunks) / len(chunks))
        
        # Evaluate retrieval performance (simplified)
        correct_retrievals = sum(1 for _ in range(100) if simulate_retrieval(chunks))
        mlflow.log_metric("retrieval_accuracy", correct_retrievals / 100)

# Evaluate different strategies
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)

# Compare results
best_run = mlflow.search_runs(order_by=["metrics.retrieval_accuracy DESC"]).iloc[0]
print(f"Best chunking strategy: {best_run['params.splitter_class']} with size {best_run['params.chunk_size']} and overlap {best_run['params.chunk_overlap']}")

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

可视化 LLM 评估结果

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

使用 MLflow UI

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

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

自定义可视化

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

 
import matplotlib.pyplot as plt
import mlflow

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))
    
    plt.title(f"Comparison of {metric_name}")
    plt.xlabel("Step")
    plt.ylabel(metric_name)
    plt.legend()
    
    # Save and log the plot
    plt.savefig(f"{metric_name}_comparison.png")
    mlflow.log_artifact(f"{metric_name}_comparison.png")

# Usage
with mlflow.start_run():
    plot_metric_comparison("answer_relevance", ["run_id_1", "run_id_2", "run_id_3"])

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

开源 MLflow 的替代品

开源有很多替代方案 流量 用于管理机器学习工作流程,每个流程都提供独特的功能和集成。

Databricks 管理的 MLflow

托管 MLflow,由 Databricks,提供开源 MLflow 的核心功能,并具有其他优势,例如与 Databricks 生态系统的无缝集成、高级安全功能以及托管基础架构。对于需要强大安全性和可扩展性的组织而言,这使其成为绝佳选择。

Azure机器学习

Azure机器学习 在微软 Azure 云平台上提供端到端机器学习解决方案。它兼容 MLflow 组件,例如模型注册表和实验跟踪器,但并非基于 MLflow。

专用机器学习平台

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

  • 海王星:专注于实验跟踪和模型管理。
  • 权重与偏见:提供广泛的实验跟踪、数据集版本控制和协作工具。
  • ML彗星:提供实验跟踪、模型生产监控和数据记录。
  • 瓦洛海:专门从事机器学习管道和编排。

元流

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

Amazon SageMaker 和 Google 的 Vertex AI

以上皆是 亚马逊SageMaker谷歌的 Vertex AI 提供集成到各自云平台的端到端 MLOps 解决方案。这些服务提供了用于大规模构建、训练和部署机器学习模型的强大工具。

详细比较

托管 MLflow 与开源 MLflow

Databricks 的托管 MLflow 与开源版本相比具有几个优势,包括:

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

结语

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

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

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

在过去的五年里,我一直沉浸在机器学习和深度学习的迷人世界中。 我的热情和专业知识使我为 50 多个不同的软件工程项目做出了贡献,特别关注人工智能/机器学习。 我持续的好奇心也吸引了我对自然语言处理的兴趣,这是我渴望进一步探索的领域。