AI-modeller og platforme
Sporing af Large Language Models (LLM) med MLflow: En Komplet Guide
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.
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
- 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()ellermlflow.log_params(). - Mål: Kvantitative målinger af din LLMs ydeevne, såsom nøjagtighed, latency eller brugerdefinerede score. Brug
mlflow.log_metric()ellermlflow.log_metrics()til at spore disse. - 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(). - 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:
<div class="relative flex flex-col rounded-lg">
<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:
- En
mlflow.pyfunc.PyFuncModel-instance eller en URI, der peger på en loggeret MLflow-model. - En Python-funktion, der tager streng-input og returnerer en enkelt streng.
- En MLflow-installationsslutpunkt-URI.
- Sæt
model=Noneog 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:
- Start MLflow-brugergrænsefladen:
mlflow ui - Åbn en webbrowser og gå til
http://localhost:5000 - 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.
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.














