AI-modeller och plattformar
Spåra Stora Språkmodeller med MLflow: En Komplett Guide
När Stora Språkmodeller (LLM) växer i komplexitet och omfattning, blir det allt svårare att spåra deras prestanda, experiment och distributioner. Här kommer MLflow in – som tillhandahåller en omfattande plattform för att hantera hela livscykeln för maskinlärningsmodeller, inklusive LLM.
I den här djupgående guiden kommer vi att utforska hur man kan utnyttja MLflow för att spåra, utvärdera och distribuera LLM. Vi kommer att täcka allt från att konfigurera din miljö till avancerade utvärderingstekniker, med många kodexempel och bästa praxis längs vägen.
Konfigurera Din Miljö
Innan vi dyker in i att spåra LLM med MLflow, låt oss konfigurera vår utvecklingsmiljö. Vi behöver installera MLflow och flera andra viktiga bibliotek:
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 är det en bra praxis att starta om din Python-miljö för att säkerställa att alla bibliotek är korrekt laddade. I en Jupyter-anteckningsbok kan du använda:
import mlflow
import chromadb
<p>print(f"MLflow-version: {mlflow.__version__}")
print(f"ChromaDB-version: {chromadb.__version__}")
Detta kommer att bekräfta versionerna av de viktiga biblioteken vi kommer att använda.
Förstå MLflows LLM-spårningsförmågor
MLflows LLM-spårningssystem bygger på dess befintliga spårningsförmågor, med tillägg av funktioner specifikt utformade för de unika aspekterna av LLM. Låt oss bryta ner de viktigaste komponenterna:
Körningar och Experiment
I MLflow representerar en “körning” en enda körning av din modellkod, medan ett “experiment” är en samling relaterade körningar. För LLM kan en körning representera en enda fråga eller en batch med prompt som bearbetas av modellen.
Viktiga Spårningskomponenter
- Parametrar: Dessa är inmatningskonfigurationer för din LLM, såsom temperatur, top_k eller max_token. Du kan logga dessa med
mlflow.log_param()ellermlflow.log_params(). - Mätvärden: Kvantitativa mått på din LLM:s prestanda, som noggrannhet, latens eller anpassade poäng. Använd
mlflow.log_metric()ellermlflow.log_metrics()för att spåra dessa. - Förutsägelser: För LLM är det viktigt att logga både inmatningsprompt och modellens utdata. MLflow lagrar dessa som artefakter i CSV-format med
mlflow.log_table(). - Artefakter: Alla ytterligare filer eller data relaterade till din LLM-körning, såsom modellcheckpunkter, visualiseringar eller datamängdsprover. Använd
mlflow.log_artifact()för att lagra dessa.
Låt oss titta på ett grundläggande exempel på att logga en LLM-körning:
Detta exempel demonstrerar loggning av parametrar, mätvärden och in-/utdata som en tabellartefakt.
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 = "Förklara konceptet maskinlärning på ett enkelt sätt."</p>
<p> # Logga parametrar
mlflow.log_param("modell", "text-davinci-002")
mlflow.log_param("max_tokens", 100)</p>
<p> # Fråga LLM och logga resultat
result = query_llm(prompt)
mlflow.log_metric("svars_längd", len(result))</p>
<p> # Logga prompt och svar
mlflow.log_table("prompt_svar", {"prompt": [prompt], "svar": [result]})</p>
<p>print(f"Svar: {result}")
Distribuera LLM med MLflow
MLflow erbjuder kraftfulla funktioner för att distribuera LLM, vilket gör det enklare att tjäna dina modeller i produktionsmiljöer. Låt oss utforska hur man distribuerar en LLM med MLflows distributionsfunktioner.
Skapa en Slutpunkt
Först kommer vi att skapa en slutpunkt för vår LLM med MLflows distributionsklient:
import mlflow
from mlflow.deployments import get_deploy_client
<p># Initiera distributionsklienten
client = get_deploy_client("databricks")</p>
<p># Definiera slutpunktskonfigurationen
slutpunktsnamn = "llm-slutpunkt"
slutpunktskonfig = {
"served_entities": [{
"name": "gpt-modell",
"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># Skapa slutpunkten
client.create_endpoint(name=slutpunktsnamn, config=slutpunktskonfig)
Denna kod konfigurerar en slutpunkt för en GPT-3.5-turbo-modell med Azure OpenAI. Observera användningen av Databricks-hemligheter för säker API-nyckelhantering.
Testa Slutpunkten
När slutpunkten är skapad kan vi testa den:
<div class="relative flex flex-col rounded-lg">
<p>response = client.predict(
endpoint=slutpunktsnamn,
inputs={"prompt": "Förklara konceptet neuronnät på ett kort sätt.", "max_tokens": 100,},
)</p>
print(response)
Detta kommer att skicka en prompt till vår distribuerade modell och returnera den genererade responsen.
Utvärdera LLM med MLflow
Utvärdering är avgörande för att förstå prestanda och beteende hos dina LLM. MLflow erbjuder omfattande verktyg för att utvärdera LLM, inklusive både inbyggda och anpassade mätvärden.
Förbereda Din LLM för Utvärdering
För att utvärdera din LLM med mlflow.evaluate() måste din modell vara i en av följande former:
- En
mlflow.pyfunc.PyFuncModel-instans eller en URI som pekar på en loggad MLflow-modell. - En Python-funktion som tar stränginmatningar och returnerar en enda sträng.
- En MLflow-distributions-slutpunkts-URI.
- Ange
modell=Noneoch inkludera modellutdata i utvärderingsdata.
Låt oss titta på ett exempel som använder en loggad MLflow-modell:
import mlflow
import openai
<p>with mlflow.start_run():</p>
<p> system_prompt = "Svara på följande fråga kortfattat."
logged_model_info = mlflow.openai.log_model(
model="gpt-3.5-turbo",
task=openai.chat.completions,
artifact_path="modell",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": "{fråga}"},
],
)</p>
<p> # Förbered utvärderingsdata
utvärderingsdata = pd.DataFrame({
"fråga": ["Vad är maskinlärning?", "Förklara neuronnät."],
"grund_sanning": [
"Maskinlärning är en undergrupp till AI som möjliggör system att lära och förbättra från erfarenhet utan explicit programmering.",
"Neuronnät är beräkningsystem inspirerade av biologiska neuronnät, bestående av sammanlänkade noder som bearbetar och överför information.",
]
})</p>
<p> # Utvärdera modellen
result = mlflow.evaluate(
logged_model_info.model_uri,
utvärderingsdata,
targets="grund_sanning",
model_type="frågesvar",
)</p>
<p>print(f"Utvärderingsmätvärden: {result.metrics}")
Detta exempel loggar en OpenAI-modell, förbereder utvärderingsdata och utvärderar sedan modellen med MLflows inbyggda mätvärden för frågesvarsuppgifter.
Anpassade Utvärderingsmätvärden
MLflow tillåter dig att definiera anpassade mätvärden för LLM-utvärdering. Här är ett exempel på att skapa ett anpassat mätvärde för att utvärdera professionalismen i svaren:
from mlflow.metrics.genai import EvaluationExample, make_genai_metric
<p>professionalism = make_genai_metric(
name="professionalism",
definition="Mått på formell och lämplig kommunikationsstil.",
grading_prompt=(
"Ge ett betyg på professionalismen i svaret på en skala från 0-4:\n"
"0: Extremt informell eller olämplig\n"
"1: Informell men respektfull\n"
"2: Måttligt formell\n"
"3: Professionell och lämplig\n"
"4: Mycket formell och expertutformad"
),
examples=[
EvaluationExample(
input="Vad är MLflow?",
output="MLflow är som ditt vänliga grannverktyg för att hantera ML-projekt. Det är supercoolt!",
score=1,
justification="Svaret är informellt och använder informell språk.",
),
EvaluationExample(
input="Vad är MLflow?",
output="MLflow är en öppen källkodsplattform för maskinlärningslivscykeln, inklusive experiment, reproducerbarhet och distribution.",
score=4,
justification="Svaret är formellt, koncist och professionellt utformat.",
)
],
model="openai:/gpt-3.5-turbo-16k",
parameters={"temperature": 0.0},
aggregations=["mean", "variance"],
greater_is_better=True,
)</p>
<p> # Använd det anpassade mätvärdet i utvärdering
result = mlflow.evaluate(
logged_model_info.model_uri,
utvärderingsdata,
targets="grund_sanning",
model_type="frågesvar",
extra_metrics=[professionalism]
)</p>
<p>print(f"Professionalismsscore: {result.metrics['professionalism_mean']}")
Detta anpassade mätvärde använder GPT-3.5-turbo för att bedöma professionalismen i svaren, vilket visar hur du kan utnyttja LLM själva för utvärdering.
Avancerade LLM-utvärderingstekniker
När LLM blir mer avancerade, blir också utvärderingsteknikerna mer avancerade. Låt oss utforska några avancerade utvärderingsmetoder med MLflow.
Retrieval-Augmented Generation (RAG) Utvärdering
RAG-system kombinerar kraften i retrieval-baserade och generativa modeller. Utvärdering av RAG-system kräver bedömning av både retrieval- och genereringskomponenterna. Här är hur du kan konfigurera ett RAG-system och utvärdera det med 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> # Ladda och förbered dokument
loader = WebBaseLoader(["https://mlflow.org/docs/latest/index.html"])
dokument = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texter = text_splitter.split_documents(dokument)</p>
<p> # Skapa vektorlagring
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texter, embeddings)</p>
<p> # Skapa RAG-kedja
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> # Utvärderingsfunktion
def evaluate_rag(fråga):
result = qa_chain({"query": fråga})
return result["result"], [doc.page_content for doc in result["source_documents"]]</p>
<p> # Förbered utvärderingsdata
utvärderingsfrågor = [
"Vad är MLflow?",
"Hur hanterar MLflow experimentsspårning?",
"Vilka är de viktigaste komponenterna i MLflow?",
]</p>
<p> # Utvärdera med MLflow
with mlflow.start_run():
for fråga in utvärderingsfrågor:
svar, källor = evaluate_rag(fråga)</p>
<p> mlflow.log_param(f"fråga", fråga)
mlflow.log_metric("antal_källor", len(källor))
mlflow.log_text(svar, f"svar_{fråga}.txt")</p>
<p> for i, källa in enumerate(källor):
mlflow.log_text(källa, f"källa_{fråga}_{i}.txt")</p>
<p> # Logga anpassade mätvärden
mlflow.log_metric("genomsnittligt_antal_källor_per_fråga", sum(len(evaluate_rag(q)[1]) for q in utvärderingsfrågor) / len(utvärderingsfrågor))
Detta exempel konfigurerar ett RAG-system med LangChain och Chroma, och utvärderar det genom att logga frågor, svar, hämtade källor och anpassade mätvärden till MLflow.
Chunkningstrategiutvärdering
Sättet du chunkar dina dokument kan ha en betydande inverkan på RAG-prestanda. MLflow kan hjälpa dig att utvärdera olika chunkningstrategier:
import mlflow
from langchain.text_splitter import CharacterTextSplitter, TokenTextSplitter
<p>def evaluate_chunking_strategy(dokument, chunk_size, chunk_overlap, splitter_class):
splitter = splitter_class(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
chunks = splitter.split_documents(dokument)</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("antal_chunks", len(chunks))
mlflow.log_metric("genomsnittlig_chunk_längd", sum(len(chunk.page_content) for chunk in chunks) / len(chunks))</p>
<p> # Utvärdera hämtningsprestanda (förenklad)
korrekt_hämtning = sum(1 for _ in range(100) if simulate_retrieval(chunks))
mlflow.log_metric("hämtningsnoggrannhet", korrekt_hämtning / 100)</p>
<p> # Utvärdera olika strategier
for chunk_size in [500, 1000, 1500]:
for chunk_overlap in [0, 50, 100]:
for splitter_class in [CharacterTextSplitter, TokenTextSplitter]:
evaluate_chunking_strategy(dokument, chunk_size, chunk_overlap, splitter_class)</p>
<p> # Jämför resultaten
bästa_körning = mlflow.search_runs(order_by=["metrics.hämtningsnoggrannhet DESC"]).iloc[0]
print(f"Bästa chunkningstrategi: {bästa_körning['params.splitter_class']} med storlek {bästa_körning['params.chunk_size']} och överlapp {bästa_körning['params.chunk_overlap']}")
Detta skript utvärderar olika kombinationer av chunk-storlekar, överlapp och delningsmetoder, och loggar resultaten till MLflow för enkel jämförelse.
Visualisera LLM-utvärderingsresultat
MLflow erbjuder olika sätt att visualisera dina LLM-utvärderingsresultat. Här är några tekniker:
Använda MLflow UI
Efter att du har kört dina utvärderingar kan du använda MLflow UI för att visualisera resultaten:
- Starta MLflow UI:
mlflow ui - Öppna en webbläsare och navigera till
http://localhost:5000 - Välj ditt experiment och körningar för att visa mätvärden, parametrar och artefakter
Anpassade Visualiseringar
Du kan skapa anpassade visualiseringar av dina utvärderingsresultat med bibliotek som Matplotlib eller Plotly, och sedan logga dem som artefakter:
import matplotlib.pyplot as plt
import mlflow
<p>def plot_metric_comparison(mätvärdesnamn, körningsid):
plt.figure(figsize=(10, 6))
for körningsid in körningsid:
körning = mlflow.get_run(körningsid)
mätvärdesvärden = mlflow.get_metric_history(körningsid, mätvärdesnamn)
plt.plot([m.step for m in mätvärdesvärden], [m.value for m in mätvärdesvärden], label=körning.data.tags.get("mlflow.runName", körningsid))</p>
<p> plt.title(f"Jämförelse av {mätvärdesnamn}")
plt.xlabel("Steg")
plt.ylabel(mätvärdesnamn)
plt.legend()</p>
<p> # Spara och logga plotten
plt.savefig(f"{mätvärdesnamn}_jämförelse.png")
mlflow.log_artifact(f"{mätvärdesnamn}_jämförelse.png")</p>
<p> # Användning
with mlflow.start_run():
plot_metric_comparison("svars_relevans", ["körningsid_1", "körningsid_2", "körningsid_3"])
Denna funktion skapar en linjegraf som jämför ett specifikt mätvärde över flera körningar och loggar den som en artefakt.
Alternativ till Öppen Källkods-MLflow
Det finns många alternativ till öppen källkods-MLflow för att hantera maskinlärningsarbetsflöden, var och en med unika funktioner och integrationer.
Hanterad MLflow av Databricks
Hanterad MLflow, som värd av Databricks, erbjuder kärnfunktionerna i öppen källkods-MLflow men med ytterligare fördelar som smidig integration med Databricks ekosystem, avancerade säkerhetsfunktioner och hanterad infrastruktur. Detta gör det till ett utmärkt val för organisationer som behöver robust säkerhet och skalbarhet.
Azure Machine Learning
Azure Machine Learning erbjuder en komplett maskinlärningslösning på Microsofts Azure-molnplattform. Det erbjuder kompatibilitet med MLflow-komponenter som modellregistret och experimentsspåraren, även om det inte är baserat på MLflow.
Dedikerade ML-plattformar
Flera företag erbjuder hanterade ML-produkter med olika funktioner:
- neptune.ai: Fokuserar på experimentsspårning och modellhantering.
- Weights & Biases: Erbjuder omfattande experimentsspårning, datamängdsversionering och samarbetsverktyg.
- Comet ML: Tillhandahåller experimentsspårning, modellproduktionsövervakning och dataloggning.
- Valohai: Specialiserar sig på maskinlärningspipeliner och orkestrering.
Metaflow
Metaflow, utvecklat av Netflix (NFLX ), är ett öppen källkods-ramverk designat för att orkestrera dataarbetsflöden och ML-pipeliner. Även om det excellerar i att hantera stora distributionsprojekt, saknar det omfattande experimentsspårnings- och modellhanteringsfunktioner jämfört med MLflow.
Amazon SageMaker och Google’s Vertex AI
Både Amazon SageMaker (AMZN ) och Google’s Vertex AI erbjuder komplett MLOps-lösningar integrerade i sina respektive molnplattformar. Dessa tjänster erbjuder robusta verktyg för att bygga, träna och distribuera maskinlärningsmodeller i stor skala.
Detaljerad Jämförelse
Hanterad MLflow vs. Öppen Källkods-MLflow
Hanterad MLflow av Databricks erbjuder flera fördelar jämfört med den öppna källkods-versionen, inklusive:
- Setup och Distribution: Smidig integration med Databricks minskar setup-tiden och ansträngningen.
- Skalbarhet: Kan hantera stora maskinlärningsarbetsbelastningar med lätthet.
- Säkerhet och Hantering: Ut-ur-lådan-säkerhetsfunktioner som rollbaserad åtkomstkontroll (RBAC) och datakryptering.
- Integration: Djup integration med Databricks tjänster, förbättrar interoperabilitet och funktionalitet.
- Data Lagring och Säkerhetskopiering: Automatiserade säkerhetskopieringsstrategier säkerställer datasäkerhet och tillförlitlighet.
- Kostnad: Användare betalar för plattformen, lagringen och beräkningsresurserna.
- Support och Underhåll: Dedikerad support och underhåll tillhandahålls av Databricks.
Slutsats
Spåra Stora Språkmodeller med MLflow ger en robust ram för att hantera komplexiteten i LLM-utveckling, utvärdering och distribution. Genom att följa bästa praxis och utnyttja avancerade funktioner som beskrivs i den här guiden, kan du skapa mer organiserade, reproducerbara och insiktsfulla LLM-experiment.
Kom ihåg att området för LLM utvecklas snabbt, och nya tekniker för utvärdering och spårning dyker upp ständigt. Håll dig uppdaterad med de senaste MLflow-utgåvorna och LLM-forskningen för att kontinuerligt förbättra dina spårnings- och utvärderingsprocesser.
När du tillämpar dessa tekniker i dina projekt, kommer du att utveckla en djupare förståelse för dina LLM:s beteende och prestanda, vilket leder till mer effektiva och tillförlitliga språkmodeller.














