AI-modeller og platforme

Sporing af Large Language Models (LLM) med MLflow: En Komplet Guide

mm
Føj Unite.AI til dine foretrukne kilder på Google
div]:bg-bg-300 [&_pre]:-mr-4 md:[&_pre]:-mr-9″>

Da Large Language Models (LLM) vokser i kompleksitet og størrelse, bliver det mere og mere udfordrende at spore deres ydeevne, eksperimenter og installationer. Her kommer MLflow ind – som leverer en komprehensiv platform for at styre hele livscyklussen for maskinlæringsmodeller, herunder LLM.

I denne dybdegående guide vil vi udforske, hvordan man kan udnytte MLflow til at spore, evaluere og installere LLM. Vi vil dække alt fra opsætning af din udviklingsmiljø til avancerede evalueringsteknikker, med masser af kodeeksempler og bedste praksis langs vejen.

Funktionalitet af MLflow i Large Language Models (LLM)

MLflow er blevet et afgørende værktøj i maskinlærings- og datavidenskabsfællesskabet, især til at styre livscyklussen for maskinlæringsmodeller. Når det kommer til Large Language Models (LLM), tilbyder MLflow en robust samling af værktøjer, der kan strømline processen med at udvikle, spore, evaluere og installere disse modeller. Her er en oversigt over, hvordan MLflow fungerer inden for LLM-området og de fordele, det giver til ingeniører og datavidenskabsfolk.

Lær om de centrale komponenter i MLflow

Sporing og administration af LLM-interaktioner

MLflows LLM-sporingssystem er en udvidelse af dets eksisterende sporingsfunktioner, tilpasset de unikke behov for LLM. Det giver mulighed for omfattende sporning af modelinteraktioner, herunder følgende nøgleaspekter:

  • Parametre: Logger nøgle-værdi-par, der detaljerer inputparametrene for LLM, såsom model-specifikke parametre som top_k og temperatur. Dette giver kontekst og konfiguration for hver kørsel, så alle aspekter af modellens konfiguration er fanget.
  • Mål: Kvantitative målinger, der giver indsigt i LLMs ydeevne og nøjagtighed. Disse kan opdateres dynamisk, mens kørslen skrider frem, og giver enten realtids- eller postprocess-indsigt.
  • Forudsigelser: Fanget inputprompt og modellens output, som gemmes som artefakter i en struktureret format for let tilgang og analyse.
  • Artefakter: Ud over forudsigelser kan MLflow gemme forskellige outputfiler, såsom visualiseringer, serialiserede modeller og strukturerede datafiler, hvilket giver mulighed for detaljeret dokumentation og analyse af modellens ydeevne.

Denne strukturerede tilgang sikrer, at alle interaktioner med LLM er omhyggeligt registreret, og giver en omfattende linje og kvalitetsregistrering for tekstgenereringsmodeller​.

Evaluering af LLM

Evaluering af LLM stiller unikke udfordringer på grund af deres genererende natur og manglen på en enkelt grundsandhed. MLflow simplificerer dette med specialiserede evalueringsværktøjer designet til LLM. Nøglefunktioner inkluderer:

  • Flere modelvalueringer: Støtter evaluering af forskellige typer LLM, enten det er en MLflow pyfunc-model, en URI, der peger på en registreret MLflow-model, eller en hvilken som helst Python-funktion, der repræsenterer din model.
  • Omfattende mål: Tilbyder en række mål tilpasset LLM-evaluering, herunder både SaaS-modelafhængige mål (f.eks. svarrelevans) og funktionbaserede mål (f.eks. ROUGE, Flesch Kincaid).
  • Foruddefinerede målsamlinger: Afhængigt af brugsfællesskabet, såsom spørgsmål-svar eller tekstsummering, tilbyder MLflow foruddefinerede mål for at simplificere evalueringen.
  • Brugerdefineret målopskaffelse: Giver brugerne mulighed for at definere og implementere brugerdefinerede mål for at tilpasse specifikke evalueringbehov, hvilket øger fleksibiliteten og dybden af modelvaluering.
  • Evaluering med statiske datasæt: Giver mulighed for evaluering af statiske datasæt uden at specificere en model, hvilket er nyttigt for hurtige vurderinger uden at skulle genkøre modelinference.

Installation og integration

MLflow understøtter også problemfri installation og integration af LLM:

  • MLflow-installationsserver: Fungerer som et samlet grænseflade for interaktion med multiple LLM-udbydere. Det simplificerer integrationer, administrerer legitimationsoplysninger sikkert og tilbyder en konsekvent API-oplevelse. Denne server understøtter en række grundlæggende modeller fra populære SaaS-udbydere samt selvhostede modeller.
  • Enhetlig slutpunkt: Gør det let at skifte mellem udbydere uden kodeændringer, hvilket minimiserer nedtid og forbedrer fleksibilitet.
  • Integreret resultatsyn: Tilbyder omfattende evalueringresultater, som kan tilgås direkte i koden eller via MLflow-brugergrænsefladen til detaljeret analyse.

MLflow er en komprehensiv samling af værktøjer og integrationer, der gør det til en uvurderlig aktiv for ingeniører og datavidenskabsfolk, der arbejder med avancerede NLP-modeller.

Opsætning af din udviklingsmiljø

Før vi dykker ned i at spore LLM med MLflow, lad os opsætte 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 installation er det en god praksis at genstarte din Python-miljø for at sikre, at alle biblioteker er korrekt indlæst. I en Jupyter-notebook kan du bruge:

import mlflow
import chromadb

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

Dette bekræfter versionerne af de nøglebiblioteker, vi skal bruge.

Forståelse af MLflows LLM-sporingsfunktioner

MLflows LLM-sporingssystem bygger på dets eksisterende sporingsfunktioner og tilføjer funktioner specifikt designet til de unikke aspekter af LLM. Lad os bryde ned i de nøglekomponenter:

Kørsler og eksperimenter

I MLflow repræsenterer en “kørsel” en enkelt eksekvering af din modelkode, mens et “eksperiment” er en samling af relaterede kørsler. For LLM kan en kørsel repræsentere en enkelt forespørgsel eller en batch af prompter behandlet af modellen.

Nøgle-sporingskomponenter

  1. Parametre: Disse er inputkonfigurationer for din LLM, såsom temperatur, top_k eller max_tokens. Du kan logge disse ved hjælp af mlflow.log_param() eller mlflow.log_params().
  2. Mål: Kvantitative målinger af din LLMs ydeevne, såsom nøjagtighed, latency eller brugerdefinerede score. Brug mlflow.log_metric() eller mlflow.log_metrics() til at spore disse.
  3. Forudsigelser: For LLM er det afgørende at logge både inputprompt og modellens output. MLflow gemmer disse som artefakter i CSV-format ved hjælp af mlflow.log_table().
  4. Artefakter: Enhver yderligere fil eller data relateret til din LLM-kørsel, såsom modelcheckpoints, visualiseringer eller datasætprøver. Brug mlflow.log_artifact() til at gemme disse.

Lad os se på et grundlæggende eksempel på at logge en LLM-kørsel:

Dette eksempel demonstrerer logging af parametre, mål og input/output som en tabelartefakt.


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 = "Forklar begrebet maskinlæring på en simpel måde."</p>

<p> # Log parametre
mlflow.log_param("model", "text-davinci-002")
mlflow.log_param("max_tokens", 100)</p>

<p> # Spørg LLM og log resultater
result = query_llm(prompt)
mlflow.log_metric("response_length", len(result))</p>

<p> # Log prompt og svar
mlflow.log_table("prompt_responses", {"prompt": [prompt], "response": [result]})</p>

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

Installation af LLM med MLflow

MLflow giver kraftfulde muligheder for at installere LLM, hvilket gør det lettere at servicere dine modeller i produktionsmiljøer. Lad os udforske, hvordan man kan installere en LLM ved hjælp af MLflows installationsfunktioner.

Oprettelse af et slutpunkt

Først skal vi oprette et slutpunkt for vores LLM ved hjælp af MLflows installationsklient:

import mlflow
from mlflow.deployments import get_deploy_client

<p># Initialiser installationsklienten
client = get_deploy_client("databricks")</p>

<p># Definer slutpunktets konfiguration
endpoint_name = "llm-slutpunkt"
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># Opret slutpunktet
client.create_endpoint(name=endpoint_name, config=endpoint_config)

Dette kodeoprettelse opretter et slutpunkt for en GPT-3.5-turbo-model 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:

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

<p>response = client.predict(
endpoint=endpoint_name,
inputs={"prompt": "Forklar begrebet neurale netværk kort.", "max_tokens": 100,},)</p>

print(response)

Dette sender en prompt til vores installeret model og returnerer den genererede respons.

Evaluering af LLM med MLflow

Evaluering er afgørende for at forstå ydeevnen og adfærden af dine LLM. MLflow giver omfattende værktøjer til evaluering af LLM, herunder både indbyggede og brugerdefinerede mål.

Forberedelse af din LLM til evaluering

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

  1. En mlflow.pyfunc.PyFuncModel-instance eller en URI, der peger på en loggeret MLflow-model.
  2. En Python-funktion, der tager streng-input og returnerer en enkelt streng.
  3. En MLflow-installationsslutpunkt-URI.
  4. Sæt model=None og inkluder modeloutput i evalueringens data.

Lad os se på et eksempel, der bruger en loggeret MLflow-model:

import mlflow
import openai

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

<p> system_prompt = "Besvar følgende spørgsmål kortfattet."
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> # Forbered evalueringdata
eval_data = pd.DataFrame({
"question": ["Hvad er maskinlæring?", "Forklar neurale netværk."],
"ground_truth": [
"Maskinlæring er en underkategori af AI, der giver systemer mulighed for at lære og forbedre sig fra erfaring uden eksplicit programmering.",
"Neurale netværk er beregningsystemer inspireret af biologiske neurale netværk, bestående af sammenkoblede noder, der behandler og transmitterer information.",
]
})</p>

<p> # Evaluér modellen
results = mlflow.evaluate(
logged_model_info.model_uri,
eval_data,
targets="ground_truth",
model_type="question-answering",
)</p>

<p>print(f"Evalueringmål: {results.metrics}")

Dette eksempel logger en OpenAI-model, forbereder evalueringdata og evaluerer derefter modellen ved hjælp af MLflows indbyggede mål til spørgsmål-svar-opgaver.

Brugerdefinerede evalueringmål

MLflow giver mulighed for at definere brugerdefinerede mål til LLM-evaluering. Her er et eksempel på, hvordan man kan oprette et brugerdefineret mål til at evaluere professionelhed i svarene:

from mlflow.metrics.genai import EvaluationExample, make_genai_metric

<p>professionalism = make_genai_metric(
name="professionalism",
definition="Mål for formel og passende kommunikationsstil.",
grading_prompt=(
"Vurder professionelhed i svaret på en skala fra 0-4:\n"
"0: Ekstremt uformel eller upassende\n"
"1: Uformel, men respektfuld\n"
"2: Moderat formel\n"
"3: Professionel og passende\n"
"4: Meget formel og ekspertudført"
),
examples=[
EvaluationExample(
input="Hvad er MLflow?",
output="MLflow er som dit venlige nabolagsværktøj til at styre ML-projekter. Det er super fedt!",
score=1,
justification="Svaret er uformelt og bruger uformel sprog.",
),
EvaluationExample(
input="Hvad er MLflow?",
output="MLflow er en åben platform for maskinlæringslivscyklussen, herunder eksperimentering, reproducerbarhed og installation.",
score=4,
justification="Svaret er formelt, kortfattet og professionelt formuleret.",
)
],
model="openai:/gpt-3.5-turbo-16k",
parameters={"temperature": 0.0},
aggregations=["mean", "variance"],
greater_is_better=True,
)</p>

<p> # Brug det brugerdefinerede mål i evaluering
results = mlflow.evaluate(
logged_model_info.model_uri,
eval_data,
targets="ground_truth",
model_type="question-answering",
extra_metrics=[professionalism]
)</p>

<p>print(f"Professionalitets-score: {results.metrics['professionalism_mean']}")

Dette brugerdefinerede mål bruger GPT-3.5-turbo til at score professionelhed i svarene, og demonstrerer, hvordan man kan udnytte LLM selv til evaluering.

Avancerede LLM-evalueringsteknikker

Da LLM bliver mere avanceret, bliver også evalueringsteknikkerne mere avancerede. Lad os udforske nogle avancerede evalueringsteknikker med MLflow.

Retrieval-Augmented Generation (RAG)-evaluering

RAG-systemer kombinerer kraften fra retrieval-baserede og generative modeller. Evaluering af RAG-systemer kræver vurdering af både retrieval- og genereringskomponenterne. Her er, hvordan du kan 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

<p> # Indlæs og forbered dokumenter
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> # Opret vektorlager
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)</p>

<p> # Opret RAG-kæde
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> # Evaluéringsfunktion
def evaluate_rag(question):
result = qa_chain({"query": question})
return result["result"], [doc.page_content for doc in result["source_documents"]]</p>

<p> # Forbered evalueringdata
eval_questions = [
"Hvad er MLflow?",
"Hvordan håndterer MLflow eksperimentssporing?",
"Hvad er de vigtigste komponenter i MLflow?",
]</p>

<p> # Evaluér ved hjælp af 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> # Log brugerdefinerede mål
mlflow.log_metric("avg_sources_per_question", sum(len(evaluate_rag(q)[1]) for q in eval_questions) / len(eval_questions))

Dette eksempel opretter et RAG-system ved hjælp af LangChain og Chroma og evaluerer derefter ved at logge spørgsmål, svar, hentede kilder og brugerdefinerede mål til MLflow.

Chunking-strategi-evaluering

Måden, du opdeler dine dokumenter på, kan have en betydelig indvirkning på RAGs ydeevne. MLflow kan hjælpe dig med at evaluere forskellige chunking-strategier:

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> # Evaluér hentningsydeevne (forenklet)
correct_retrievals = sum(1 for _ in range(100) if simulate_retrieval(chunks))
mlflow.log_metric("retrieval_accuracy", correct_retrievals / 100)</p>

<p> # Evaluér forskellige strategier
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> # Sammenlign resultater
best_run = mlflow.search_runs(order_by=["metrics.retrieval_accuracy DESC"]).iloc[0]
print(f"Bedste chunking-strategi: {best_run['params.splitter_class']} med størrelse {best_run['params.chunk_size']} og overlap {best_run['params.chunk_overlap']}")

Dette script evaluerer forskellige kombinationer af chunk-størrelser, overlap og splittingsmetoder og logger resultaterne til MLflow til let sammenligning.

Visualisering af LLM-evalueringresultater

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

Brug af MLflow-brugergrænsefladen

Efter at have kørt dine evalueringer kan du bruge MLflow-brugergrænsefladen til at visualisere resultaterne:

  1. Start MLflow-brugergrænsefladen: mlflow ui
  2. Åbn en webbrowser og gå til http://localhost:5000
  3. Vælg dit eksperiment og kørsler for at se mål, parametre og artefakter

Brugerdefinerede visualiseringer

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

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"Sammenligning af {metric_name}")
plt.xlabel("Trin")
plt.ylabel(metric_name)
plt.legend()</p>

<p> # Gem og log plot
plt.savefig(f"{metric_name}_comparison.png")
mlflow.log_artifact(f"{metric_name}_comparison.png")</p>

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

Denne funktion opretter en linjeplot, der sammenligner et bestemt mål på tværs af flere kørsler og logger det som en artefakt.

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

Alternativer til åben kilde MLflow

Der findes mange alternativer til åben kilde MLflow til at styre maskinlæringsarbejdsgange, hver med unikke funktioner og integrationer.

Administreret MLflow af Databricks

Administreret MLflow, der er hostet af Databricks, giver de grundlæggende funktioner i åben kilde MLflow, men med ekstra 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 Machine Learning

Azure Machine Learning giver en komplet maskinlæringsløsning på Microsofts Azure-cloudplatform. Det giver kompatibilitet med MLflow-komponenter som modelregistret og eksperimentssporing, selvom det ikke er baseret på MLflow.

Dedikeret ML-platform

Flere virksomheder giver administrerede ML-produkter med forskellige funktioner:

  • neptune.ai: Fokuserer på eksperimentssporing og modelstyring.
  • Weights & Biases: Tilbyder omfattende eksperimentssporing, datasætversionering og samarbejdsværktøjer.
  • Comet ML: Giver eksperimentssporing, modelproduktionsovervågning og datalogging.
  • Valohai: Specialiserer sig i maskinlæringsrørledninger og orkestrering.

Metaflow

Metaflow, udviklet af Netflix (NFLX ), er et åben kilde-rammeark til at orkestrere dataarbejdsgange og ML-rørledninger. Selvom det excellerer i at styre store installationsprojekter, mangler det omfattende eksperimentssporings- og modelstyringsfunktioner i forhold til MLflow.

Amazon SageMaker og Google’s Vertex AI

Både Amazon SageMaker (AMZN ) og Google’s Vertex AI giver komplette MLOps-løsninger integreret i deres respektive cloud-platforme. Disse tjenester tilbyder robuste værktøjer til at bygge, træne og installere maskinlæringsmodeller i stor skala.

Detailed Comparison

Administreret MLflow vs. åben kilde MLflow

Administreret MLflow af Databricks giver flere fordele i forhold til åben kilde-versionen, herunder:

  • Opsætning og installation: Problemfri integration med Databricks reducerer opsætnings- og installations tid og indsats.
  • Skalerbarhed: Kan håndtere store maskinlæringsarbejdsgange med let.
  • Sikkerhed og administration: Udgående sikkerhedsfunktioner som rollebaseret adgangskontrol (RBAC) og datakryptering.
  • Integration: Dyb integration med Databricks’ tjenester, hvilket forbedrer funktionalitet og samarbejde.
  • Data gemme og backup: Automatiske backup-strategier sikrer datasikkerhed og pålidelighed.
  • Omkring: Brugere betaler for platformen, lagring og beregningsressourcer.
  • Support og vedligeholdelse: Dedikeret support og vedligeholdelse leveret af Databricks.

Konklusion

Sporing af Large Language Models med MLflow giver en robust ramme for at styre kompleksiteten i LLM-udvikling, evaluering og installation. Ved at følge bedste praksis og udnytte avancerede funktioner, som er beskrevet i denne guide, kan du oprette mere organiserede, reproducerbare og indsigtsgivende LLM-eksperimenter.

Husk, at LLM-området udvikler sig hurtigt, og nye evalueringsteknikker og sporingsmetoder dukker op konstant. Hold dig opdateret med de seneste MLflow-udgivelser og LLM-forskning for at forbedre dine evaluering- og sporingsprocesser.

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

Jeg har brugt de sidste fem år på at dykke ned 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-ingeniørprojekter, med en særlig fokus på AI/ML. Min fortsatte nysgerrighed har også ført mig mod Natural Language Processing, et felt jeg er ivrig efter at udforske yderligere.