Følg os

AI-værktøjer 101

Sporing af store sprogmodeller (LLM) med MLflow: En komplet vejledning

mm
MLflow LLM Guide Evaluering

Efterhånden som store sprogmodeller (LLM'er) vokser i kompleksitet og skala, bliver det stadig mere udfordrende at spore deres ydeevne, eksperimenter og implementeringer. Det er her, MLflow kommer ind i billedet – og giver en omfattende platform til styring af hele livscyklussen af ​​maskinlæringsmodeller, inklusive LLM'er.

I denne dybdegående guide vil vi undersøge, hvordan man kan udnytte MLflow til at spore, evaluere og implementere LLM'er. Vi dækker alt fra opsætning af dit miljø til avancerede evalueringsteknikker, med masser af kodeeksempler og bedste praksis undervejs.

Funktionalitet af MLflow i store sprogmodeller (LLM'er)

MLflow er blevet et centralt værktøj inden for maskinlærings- og datavidenskabsmiljøet, især til at styre livscyklussen for maskinlæringsmodeller. Når det kommer til store sprogmodeller (LLM'er), tilbyder MLflow en robust pakke af værktøjer, der i høj grad strømliner processen med at udvikle, spore, evaluere og implementere disse modeller. Her er et overblik over, hvordan MLflow fungerer inden for LLM-området, og de fordele, det giver ingeniører og dataloger.

Lær om kernekomponenterne i MLflow

Sporing og styring af LLM-interaktioner

MLflows LLM-sporingssystem er en forbedring af dets eksisterende sporingsfunktioner, skræddersyet til LLM'ers unikke behov. Det giver mulighed for omfattende sporing af modelinteraktioner, herunder følgende nøgleaspekter:

  • Driftsparametre: Logning af nøgleværdi-par, der beskriver inputparametrene for LLM, såsom modelspecifikke parametre som f.eks. top_k og temperatureDette giver kontekst og konfiguration for hver kørsel, hvilket sikrer, at alle aspekter af modellens konfiguration registreres.
  • Metrics: Kvantitative mål, der giver indsigt i ydeevnen og nøjagtigheden af ​​LLM. Disse kan opdateres dynamisk, efterhånden som kørslen skrider frem, hvilket giver indsigt i realtid eller efter processen.
  • Forudsigelser: Indfangning af input sendt til LLM og de tilsvarende output, som gemmes som artefakter i et struktureret format for nem genfinding og analyse.
  • ArtifactsUd over forudsigelser kan MLflow gemme forskellige outputfiler såsom visualiseringer, serialiserede modeller og strukturerede datafiler, hvilket muliggør detaljeret dokumentation og analyse af modellens ydeevne.

Denne strukturerede tilgang sikrer, at alle interaktioner med LLM bliver omhyggeligt registreret, hvilket giver en omfattende afstamning og kvalitetssporing for tekstgenererende modeller.

Evaluering af LLM'er

Evaluering af LLM'er giver unikke udfordringer på grund af deres generative natur og manglen på en enkelt grundsandhed. MLflow forenkler dette med specialiserede evalueringsværktøjer designet til LLM'er. Nøglefunktioner omfatter:

  • Alsidig modelevaluering: Understøtter evaluering af forskellige typer LLM'er, uanset om det er en MLflow pyfunc-model, en URI, der peger på en registreret MLflow-model, eller en hvilken som helst Python-kaldbar, der repræsenterer din model.
  • Omfattende målinger: Tilbyder en række målinger, der er skræddersyet til LLM-evaluering, inklusive både SaaS-modelafhængige målinger (f.eks. svarrelevans) og funktionsbaserede metrikker (f.eks. ROUGE, Flesch Kincaid).
  • Foruddefinerede metriske samlinger: Afhængigt af brugssituationen, såsom besvarelse af spørgsmål eller tekstopsummering, giver MLflow foruddefinerede metrics for at forenkle evalueringsprocessen.
  • Oprettelse af brugerdefinerede metrics: Giver brugerne mulighed for at definere og implementere tilpassede metrics, der passer til specifikke evalueringsbehov, hvilket forbedrer fleksibiliteten og dybden af ​​modelevaluering.
  • Evaluering med statiske datasæt: Muliggør evaluering af statiske datasæt uden at angive en model, hvilket er nyttigt til hurtige vurderinger uden at køre modelslutning igen.

Implementering og integration

MLflow understøtter også problemfri implementering og integration af LLM'er:

  • MLflow Deployments Server: Fungerer som en samlet grænseflade til interaktion med flere LLM-udbydere. Det forenkler integrationer, administrerer legitimationsoplysninger sikkert og tilbyder en ensartet API-oplevelse. Denne server understøtter en række grundlæggende modeller fra populære SaaS-leverandører såvel som selv-hostede modeller.
  • Unified Endpoint: Letter skift mellem udbydere uden kodeændringer, minimerer nedetid og øger fleksibiliteten.
  • Integreret resultatvisning: Giver omfattende evalueringsresultater, som kan tilgås direkte i koden eller gennem MLflow UI for detaljeret analyse.

MLflow er en omfattende suite af værktøjer og integrationer, der gør det til et uvurderligt aktiv for ingeniører og dataforskere, der arbejder med avancerede NLP-modeller.

Opsætning af dit miljø

Før vi dykker ned i at spore LLM'er med MLflow, lad os konfigurere vores udviklingsmiljø. Vi skal installere MLflow og flere andre nøglebiblioteker:

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

Efter installationen er det en god idé at genstarte dit Python-miljø for at sikre, at alle biblioteker er korrekt indlæst. I en Jupyter-notesbog kan du bruge:

import mlflow
import chromadb

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

Dette vil bekræfte de versioner af nøglebiblioteker, vi vil bruge.

Forståelse af MLflows LLM-sporingsfunktioner

MLflows LLM-sporingssystem bygger videre på dets eksisterende sporingsfunktioner og tilføjer funktioner, der er specielt designet til de unikke aspekter af LLM'er. Lad os gennemgå nøglekomponenterne:

Kørsler og eksperimenter

I MLflow repræsenterer en "run" en enkelt udførelse af din modelkode, mens et "eksperiment" er en samling af relaterede kørsler. For LLM'er kan en kørsel repræsentere en enkelt forespørgsel eller en batch af prompter, der behandles af modellen.

Nøglesporingskomponenter

  1. Driftsparametre: Disse er inputkonfigurationer til din LLM, såsom temperatur, top_k eller max_tokens. Du kan logge disse vha mlflow.log_param() or mlflow.log_params().
  2. MetricsKvantitative målinger af din LLM's præstation, såsom nøjagtighed, latenstid eller brugerdefinerede scorer. Brug mlflow.log_metric() or mlflow.log_metrics() at spore disse.
  3. ForudsigelserFor LLM'er er det afgørende at logge både inputprompts og modellens output. MLflow gemmer disse som artefakter i CSV-format ved hjælp af mlflow.log_table().
  4. Artifacts: Eventuelle yderligere filer eller data relateret til din LLM-kørsel, såsom modelkontrolpunkter, visualiseringer eller datasætprøver. Brug mlflow.log_artifact() at opbevare disse.

Lad os se på et grundlæggende eksempel på logføring af en LLM-kørsel:

Dette eksempel viser logningsparametre, metrics og input/output som en tabelartefakt.

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}")

Implementering af LLM'er med MLflow

MLflow leverer effektive funktioner til implementering af LLM'er, hvilket gør det nemmere at betjene dine modeller i produktionsmiljøer. Lad os undersøge, hvordan du implementerer en LLM ved hjælp af MLflows implementeringsfunktioner.

Oprettelse af et slutpunkt

Først opretter vi et slutpunkt til vores LLM ved hjælp af MLflows implementeringsklient:

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)

Denne kode opsætter et slutpunkt for en GPT-3.5-turbomodel ved hjælp af Azure OpenAI. Bemærk brugen af ​​Databricks-hemmeligheder til sikker API-nøglestyring.

Test af slutpunktet

Når slutpunktet er oprettet, kan vi teste det:

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

Dette vil sende en prompt til vores implementerede model og returnere det genererede svar.

Evaluering af LLM'er med MLflow

Evaluering er afgørende for at forstå ydeevnen og adfærden af ​​dine LLM'er. MLflow leverer omfattende værktøjer til evaluering af LLM'er, herunder både indbyggede og tilpassede metrics.

Forberedelse af din LLM til evaluering

At evaluere din LLM med mlflow.evaluate(), skal din model være i en af ​​disse former:

  1. An mlflow.pyfunc.PyFuncModel instans eller en URI, der peger på en logget MLflow-model.
  2. En Python-funktion, der tager strenginput og udsender en enkelt streng.
  3. En MLflow Deployments-endepunkts-URI.
  4. sæt model=None og inkludere modeloutput i evalueringsdataene.

Lad os se på et eksempel ved hjælp af en logget MLflow-model:

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}")

Dette eksempel logger en OpenAI-model, forbereder evalueringsdata og evaluerer derefter modellen ved hjælp af MLflows indbyggede metrikker til besvarelse af spørgsmål.

Brugerdefinerede evalueringsmetrics

MLflow giver dig mulighed for at definere brugerdefinerede metrikker til LLM-evaluering. Her er et eksempel på oprettelse af en brugerdefineret metrik til evaluering af svarenes professionalisme:

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']}")

Denne brugerdefinerede metric bruger GPT-3.5-turbo til at score professionalismen i svarene og demonstrerer, hvordan du kan udnytte LLM'er selv til evaluering.

Avancerede LLM evalueringsteknikker

Efterhånden som LLM'er bliver mere sofistikerede, bliver teknikkerne til at evaluere dem også mere sofistikerede. Lad os udforske nogle avancerede evalueringsmetoder ved hjælp af MLflow.

Retrieval-Augmented Generation (RAG) evaluering

RAG-systemer kombinerer kraften i hentningsbaserede og generative modeller. Evaluering af RAG-systemer kræver vurdering af både hentnings- og genereringskomponenterne. Sådan kan du opsætte et RAG-system og evaluere det ved hjælp af 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))

Dette eksempel opsætter et RAG-system ved hjælp af LangChain og Chroma, og evaluerer det derefter ved at logge spørgsmål, svar, hentede kilder og tilpassede metrics til MLflow.

Chunking Strategi Evaluering

Den måde, du deler dine dokumenter på, kan påvirke RAG-ydelsen markant. MLflow kan hjælpe dig med at evaluere forskellige chunking-strategier:

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']}")

Dette script evaluerer forskellige kombinationer af chunkstørrelser, overlapninger og opdelingsmetoder og logger resultaterne til MLflow for nem sammenligning.

Visualisering af LLM-evalueringsresultater

MLflow giver forskellige måder at visualisere dine LLM-evalueringsresultater på. Her er nogle teknikker:

Brug af MLflow UI

Efter at have kørt dine evalueringer, kan du bruge MLflow UI til at visualisere resultater:

  1. Start MLflow UI: mlflow ui
  2. Åbn en webbrowser og naviger til http://localhost:5000
  3. Vælg dit eksperiment og kør for at se metrics, parametre og artefakter

Brugerdefinerede visualiseringer

Du kan oprette brugerdefinerede visualiseringer af dine evalueringsresultater ved hjælp af biblioteker som Matplotlib eller Plotly og derefter logge dem som artefakter:

 
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"])

Denne funktion opretter et linjeplot, der sammenligner en specifik metrik på tværs af flere kørsler og logger den som en artefakt.

Alternativer til Open Source MLflow

Der er mange alternativer til open source MLflow til styring af maskinlærings-workflows, der hver tilbyder unikke funktioner og integrationer.

Administreret MLflow af Databricks

Administreret MLflow, hostet af Databrikker, leverer kernefunktionerne i open source MLflow, men med yderligere fordele såsom problemfri integration med Databricks' økosystem, avancerede sikkerhedsfunktioner og administreret infrastruktur. Dette gør det til et fremragende valg for organisationer, der har brug for robust sikkerhed og skalerbarhed.

Azure maskinindlæring

Azure maskinindlæring tilbyder en end-to-end maskinlæringsløsning på Microsofts Azure-cloudplatform. Den giver kompatibilitet med MLflow-komponenter som modelregistret og eksperimenttrackeren, selvom den ikke er baseret på MLflow.

Dedikerede ML-platforme

Flere virksomheder leverer administrerede ML-produkter med forskellige funktioner:

  • neptune.ai: Fokuserer på eksperimentsporing og modelstyring.
  • Vægte og skævheder: Tilbyder omfattende eksperimentsporing, datasætversionering og samarbejdsværktøjer.
  • Komet ML: Giver eksperimentsporing, modelproduktionsovervågning og datalogning.
  • Valohai: Specialiseret i maskinlæringspipelines og orkestrering.

metaflow

metaflow, udviklet af Netflix, er en open source-ramme designet til at orkestrere data-workflows og ML-pipelines. Selvom det udmærker sig ved at administrere implementeringer i stor skala, mangler det omfattende eksperimentsporing og modelstyringsfunktioner sammenlignet med MLflow.

Amazon SageMaker og Googles Vertex AI

Både Amazon SageMaker og Googles Vertex AI levere end-to-end MLOps-løsninger integreret i deres respektive cloud-platforme. Disse tjenester tilbyder robuste værktøjer til at bygge, træne og implementere maskinlæringsmodeller i stor skala.

Detaljeret sammenligning

Administreret MLflow vs. Open Source MLflow

Administreret MLflow af Databricks tilbyder flere fordele i forhold til open source-versionen, herunder:

  • Opsætning og implementering: Sømløs integration med Databricks reducerer opsætningstid og indsats.
  • Skalerbarhed: I stand til at håndtere store maskinlærings-arbejdsbelastninger med lethed.
  • Sikkerhed og ledelse: Out-of-the-box sikkerhedsfunktioner som rollebaseret adgangskontrol (RBAC) og datakryptering.
  • Integration: Dyb integration med Databricks' tjenester, der forbedrer interoperabilitet og funktionalitet.
  • Datalagring og sikkerhedskopiering: Automatiserede sikkerhedskopieringsstrategier sikrer datasikkerhed og pålidelighed.
  • Koste: Brugere betaler for platformen, lagringen og computerressourcerne.
  • Support og vedligeholdelse: Dedikeret support og vedligeholdelse leveret af Databricks.

Konklusion

Sporing af store sprogmodeller med MLflow giver en robust ramme til styring af kompleksiteten af ​​LLM-udvikling, -evaluering og -implementering. Ved at følge den bedste praksis og udnytte de avancerede funktioner, der er beskrevet i denne vejledning, kan du skabe mere organiserede, reproducerbare og indsigtsfulde LLM-eksperimenter.

Husk, at området for LLM'er er i hastig udvikling, og nye teknikker til evaluering og sporing dukker konstant op. Hold dig opdateret med de seneste MLflow-udgivelser og LLM-forskning for løbende at forfine dine sporings- og evalueringsprocesser.

Når du anvender disse teknikker i dine projekter, vil du udvikle en dybere forståelse af dine LLM'ers adfærd og ydeevne, hvilket fører til mere effektive og pålidelige sprogmodeller.

Jeg har brugt de sidste fem år på at fordybe mig i den fascinerende verden af ​​Machine Learning og Deep Learning. Min passion og ekspertise har ført mig til at bidrage til over 50 forskellige software engineering projekter, med særligt fokus på AI/ML. Min vedvarende nysgerrighed har også trukket mig hen imod Natural Language Processing, et felt jeg er ivrig efter at udforske yderligere.