AI-modeller og plattformer
Sporing av store språkmodeller (LLM) med MLflow: En komplett guide
Ettersom store språkmodeller (LLM) vokser i kompleksitet og omfang, blir sporing av deres ytelse, eksperimenter og distribusjon stadig mer utfordrende. Dette er der MLflow kommer inn – som en omfattende plattform for å håndtere hele livssyklusen til maskinlæringsmodeller, inkludert LLM.
I denne dybdeguiden vil vi utforske hvordan vi kan utnytte MLflow for å spore, evaluere og distribuere LLM. Vi vil dekke alt fra å sette opp din utviklingsmiljø til avanserte evalueringsteknikker, med mange kodeeksempler og beste praksis langs veien.
Konfigurasjon av utviklingsmiljø
Før vi dykker inn i å spore LLM med MLflow, la oss konfigurere utviklingsmiljøet vårt. Vi må installere MLflow og flere andre nøkkelbiblioteker:
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
Etter installasjon, er det en god praksis å restarte Python-miljøet for å sikre at alle biblioteker er lastet korrekt. I en Jupyter-notebook, kan du bruke:
import mlflow
import chromadb
<p>print(f"MLflow-versjon: {mlflow.__version__}")
print(f"ChromaDB-versjon: {chromadb.__version__}")
Dette vil bekrefte versjonene av nøkkelbiblioteker vi kommer til å bruke.
Forståelse av MLflows LLM-sporingsfunksjoner
MLflows LLM-sporingssystem bygger på dens eksisterende sporingsfunksjoner, og legger til funksjoner spesifikt designet for de unike aspektene av LLM. La oss bryte ned de nøkkelkomponentene:
Kjøringer og eksperimenter
I MLflow representerer en “kjøring” en enkelt eksekvering av modellkoden, mens et “eksperiment” er en samling av relaterte kjøringer. For LLM kan en kjøring representere en enkelt spørring eller en batch av promter prosessert av modellen.
Nøkkel-sporingskomponenter
- Parametere: Disse er inputkonfigurasjoner for din LLM, som temperatur, top_k eller max_tokens. Du kan logge disse ved hjelp av
mlflow.log_param()ellermlflow.log_params(). - Målinger: Kvantitative målinger av din LLMs ytelse, som nøyaktighet, latens eller tilpassede poeng. Bruk
mlflow.log_metric()ellermlflow.log_metrics()for å spore disse. - Forutsigelser: For LLM er det viktig å logge både inputpromter og modellens utdata. MLflow lagrer disse som artefakter i CSV-format ved hjelp av
mlflow.log_table(). - Artefakter: Enhver ekstra fil eller data relatert til din LLM-kjøring, som modell-sjekkpunkter, visualiseringer eller datasamlinger. Bruk
mlflow.log_artifact()for å lagre disse.
La oss se på et grundig eksempel på å logge en LLM-kjøring:
Dette eksemplet demonstrerer logging av parametere, målinger og input/output som en tabellartefakt.
import mlflow
import openai
<p>def spør_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()</p>
<p>with mlflow.start_run():
prompt = "Forklar konseptet om maskinlæring på en enkel måte."</p>
<p># Log parametere
mlflow.log_param("modell", "text-davinci-002")
mlflow.log_param("max_tokens", 100)</p>
<p># Spør LLM og logg resultatet
result = spør_llm(prompt)
mlflow.log_metric("svarlengde", len(result))</p>
<p># Logg prompt og svar
mlflow.log_table("prompt_svar", {"prompt": [prompt], "svar": [result]})</p>
<p>print(f"Svar: {result}")
Distribusjon av LLM med MLflow
MLflow tilbyr kraftige muligheter for å distribuere LLM, og gjør det enklere å tjene dine modeller i produksjonsmiljøer. La oss utforske hvordan du kan distribuere en LLM ved hjelp av MLflows distribusjonsfunksjoner.
Opprettelse av et sluttpunkt
Først vil vi opprette et sluttpunkt for vår LLM ved hjelp av MLflows distribusjonsklient:
import mlflow
from mlflow.deployments import get_deploy_client
<p># Initialiser distribusjonsklienten
client = get_deploy_client("databricks")</p>
<p># Definer sluttpunktkonfigurasjon
sluttpunkt_navn = "llm-sluttpunkt"
sluttpunkt_konfig = {
"served_entities": [{
"navn": "gpt-modell",
"ekstern_modell": {
"navn": "gpt-3.5-turbo",
"tilbyder": "openai",
"oppgave": "llm/v1/completions",
"openai_konfig": {
"openai_api_type": "azure",
"openai_api_nøkkel": "{{secrets/scope/openai_api_nøkkel}}",
"openai_api_base": "{{secrets/scope/openai_api_base}}",
"openai_distribusjonsnavn": "gpt-35-turbo",
"openai_api_versjon": "2023-05-15",
},
},
}],
}</p>
<p># Opprett sluttpunkt
client.create_endpoint(name=sluttpunkt_navn, config=sluttpunkt_konfig)
Dette kodefragment setter opp et sluttpunkt for en GPT-3.5-turbo-modell ved hjelp av Azure OpenAI. Merk bruken av Databricks-hemmeligheter for sikker API-nøkkelhåndtering.
Testing av sluttpunkt
Når sluttpunktet er opprettet, kan vi teste det:
<div class="relative flex flex-col rounded-lg">
<p>response = client.predict(
endpoint=sluttpunkt_navn,
inputs={"prompt": "Forklar konseptet om neurale nettverk kort.", "max_tokens": 100,},
)</p>
print(response)
Dette vil sende en spørring til vår distribuerte modell og returnere den genererte responsen.
Evaluering av LLM med MLflow
Evaluering er avgjørende for å forstå ytelsen og atferden til dine LLM. MLflow tilbyr omfattende verktøy for å evaluere LLM, inkludert både innebygde og tilpassede målinger.
Forberedelse av LLM for evaluering
For å evaluere din LLM med mlflow.evaluate(), må din modell være i en av følgende former:
- En
mlflow.pyfunc.PyFuncModel-instans eller en URI som peker til en logget MLflow-modell. - En Python-funksjon som tar string-input og returnerer en enkelt string.
- En MLflow-distribusjonssluttpunkt-URI.
- Sett
modell=Noneog inkluder modell-utdata i evalueringsdataene.
La oss se på et eksempel som bruker en logget MLflow-modell:
import mlflow
import openai
<p>with mlflow.start_run():
system_prompt = "Svar på følgende spørring kort."
logget_modell_info = mlflow.openai.log_modell(
modell="gpt-3.5-turbo",
oppgave=openai.chat.completions,
artifact_path="modell",
meldinger=[
{"rolle": "system", "innhold": system_prompt},
{"rolle": "bruker", "innhold": "{spørring}"},
],
)</p>
<p># Forbered evalueringdata
eval_data = pd.DataFrame({
"spørring": ["Hva er maskinlæring?", "Forklar neurale nettverk."],
"grunn_sannhet": [
"Maskinlæring er en undergruppe av AI som muliggjør systemer å lære og forbedre seg fra erfaring uten eksplisitt programmering.",
"Neurale nettverk er datamaskin-systemer inspirert av biologiske neurale nettverk, bestående av sammenkoblede noder som prosesserer og overfører informasjon.",
]
})</p>
<p># Evaluering av modell
resultater = mlflow.evaluate(
logget_modell_info.model_uri,
eval_data,
mål="grunn_sannhet",
modell_type="spørring-svar",
)</p>
<p>print(f"Evalueringmålinger: {resultater.målinger}")
Dette eksemplet logger en OpenAI-modell, forbereder evalueringdata og evalueringer så modellen ved hjelp av MLflows innebygde målinger for spørring-svar-oppgaver.
Tilpassede evalueringmålinger
MLflow tillater deg å definere tilpassede målinger for LLM-evaluering. Her er et eksempel på å opprette en tilpasset måling for å evaluere profesjonaliteten til svarene:
from mlflow.metrics.genai import EvaluationExample, make_genai_metric
<p>profesjonalitet = make_genai_metric(
navn="profesjonalitet",
definisjon="Mål på formell og passende kommunikasjonsstil.",
grading_prompt=(
"Vurdér profesjonaliteten til svaret på en skala fra 0-4:\n"
"0: Ekstremt uformell eller upassende\n"
"1: Uformell, men respektfull\n"
"2: Moderat formell\n"
"3: Profesjonell og passende\n"
"4: Høy formell og ekspertutformet"
),
eksempler=[
EvaluationExample(
input="Hva er MLflow?",
output="MLflow er en åpen kilde-plattform for maskinlærings-livssyklusen, inkludert eksperimentering, reproduksjon og distribusjon.",
poeng=4,
begrunnelse="Svaret er formelt, konsist og profesjonelt utformet.",
)
],
modell="openai:/gpt-3.5-turbo-16k",
parametere={"temperatur": 0.0},
aggregasjoner=["gjennomsnitt", "varians"],
større_er_bedre=True,
)</p>
<p># Bruk av tilpasset måling i evaluering
resultater = mlflow.evaluate(
logget_modell_info.model_uri,
eval_data,
mål="grunn_sannhet",
modell_type="spørring-svar",
ekstra_målinger=[profesjonalitet]
)</p>
<p>print(f"Profesjonalitetspoeng: {resultater.målinger['profesjonalitet_gjennomsnitt']}")
Denne tilpassede målingen bruker GPT-3.5-turbo til å score profesjonaliteten til svarene, og demonstrerer hvordan du kan utnytte LLM selv for evaluering.
Avanserte LLM-evalueringsteknikker
Ettersom LLM blir mer sofistikerte, blir også teknikkene for å evaluere dem. La oss utforske noen avanserte evalueringsteknikker med MLflow.
Henting-utvidet generering (RAG) evaluering
RAG-systemer kombinerer kraften til henting-baserte og generative modeller. Evaluering av RAG-systemer krever vurdering av både henting- og genereringskomponentene. Her er hvordan du kan opprette et RAG-system og evaluere det ved hjelp av 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># Last og forbered dokumenter
loader = WebBaseLoader(["https://mlflow.org/docs/latest/index.html"])
dokumenter = loader.last()
tekst_splitter = CharacterTextSplitter(chunk_størrelse=1000, chunk_overlap=0)
tekster = tekst_splitter.split_dokumenter(dokumenter)</p>
<p># Opprett vektorlagring
embeddings = OpenAIEmbeddings()
vektorlagring = Chroma.from_dokumenter(tekster, embeddings)</p>
<p># Opprett RAG-kjede
llm = OpenAI(temperatur=0)
qa_kjede = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vektorlagring.as_retriever(),
return_source_dokumenter=True
)</p>
<p># Evalueringfunksjon
def evaluering_rag(spørring):
result = qa_kjede({"spørring": spørring})
return result["result"], [dok.page_content for dok in result["source_dokumenter"]]</p>
<p># Forbered evalueringdata
eval_spøringer = [
"Hva er MLflow?",
"Hvordan håndterer MLflow eksperiment-sporing?",
"Hva er de viktigste komponentene av MLflow?",
]</p>
<p># Evaluering ved hjelp av MLflow
with mlflow.start_run():
for spørring in eval_spøringer:
svar, kilder = evaluering_rag(spørring)</p>
<p>mlflow.log_param(f"spørring", spørring)
mlflow.log_metric("antall_kilder", len(kilder))
mlflow.log_text(svar, f"svar_{spørring}.txt")</p>
<p>for i, kilde in enumerate(kilder):
mlflow.log_text(kilde, f"kilde_{spørring}_{i}.txt")</p>
<p># Logg tilpassede målinger
mlflow.log_metric("gjennomsnitt_kilder_per_spørring", sum(len(evaluering_rag(s)) for s in eval_spøringer) / len(eval_spøringer))
Dette eksemplet oppretter et RAG-system ved hjelp av LangChain og Chroma, og så evalueringer det ved å logge spøringer, svar, hentede kilder og tilpassede målinger til MLflow.
Chunking-strategi-evaluering
Måten du chunker dine dokumenter på kan ha en betydelig innvirkning på RAG-ytelse. MLflow kan hjelpe deg med å evaluere ulike chunking-strategier:
import mlflow
from langchain.text_splitter import CharacterTextSplitter, TokenTextSplitter
<p>def evaluering_chunking_strategi(dokumenter, chunk_størrelse, chunk_overlap, splitter_klasse):
splitter = splitter_klasse(chunk_størrelse=chunk_størrelse, chunk_overlap=chunk_overlap)
chunks = splitter.split_dokumenter(dokumenter)</p>
<p>with mlflow.start_run():
mlflow.log_param("chunk_størrelse", chunk_størrelse)
mlflow.log_param("chunk_overlap", chunk_overlap)
mlflow.log_param("splitter_klasse", splitter_klasse.__name__)</p>
<p>mlflow.log_metric("antall_chunks", len(chunks))
mlflow.log_metric("gjennomsnitt_chunk_lengde", sum(len(chunk.page_content) for chunk in chunks) / len(chunks))</p>
<p># Evaluering av henting-ytelse (forenklet)
riktige_hentinger = sum(1 for _ in range(100) if simulering_henting(chunks))
mlflow.log_metric("henting_nøyaktighet", riktige_hentinger / 100)</p>
<p># Evaluering av ulike strategier
for chunk_størrelse in [500, 1000, 1500]:
for chunk_overlap in [0, 50, 100]:
for splitter_klasse in [CharacterTextSplitter, TokenTextSplitter]:
evaluering_chunking_strategi(dokumenter, chunk_størrelse, chunk_overlap, splitter_klasse)</p>
<p># Sammenlign resultater
beste_kjøring = mlflow.search_runs(order_by=["målinger.henting_nøyaktighet DESC"]).iloc[0]
print(f"Beste chunking-strategi: {beste_kjøring['params.splitter_klasse']} med størrelse {beste_kjøring['params.chunk_størrelse']} og overlap {beste_kjøring['params.chunk_overlap']}")
Dette skriptet evalueringer ulike kombinasjoner av chunk-størrelser, overlap og splitt-metoder, og logger resultater til MLflow for enkel sammenligning.
Visualisering av LLM-evalueringresultater
MLflow tilbyr ulike måter å visualisere dine LLM-evalueringresultater på. Her er noen teknikker:
Bruk av MLflow-brukergrensesnittet
Etter å ha kjørt evalueringer, kan du bruke MLflow-brukergrensesnittet til å visualisere resultater:
- Start MLflow-brukergrensesnittet:
mlflow ui - Åpne en nettleser og naviger til:
http://localhost:5000 - Velg ditt eksperiment og kjøringer for å se målinger, parametere og artefakter
Tilpassede visualiseringer
Du kan opprette tilpassede visualiseringer av dine evalueringresultater ved hjelp av biblioteker som Matplotlib eller Plotly, og så logge dem som artefakter:
import matplotlib.pyplot as plt
import mlflow
<p>def plot_målings_sammenligning(målingsnavn, kjørings_id):
plt.figure(figsize=(10, 6))
for kjørings_id in kjørings_id:
kjøring = mlflow.get_run(kjørings_id)
målingsverdier = mlflow.get_metric_history(kjørings_id, målingsnavn)
plt.plot([m.step for m in målingsverdier], [m.value for m in målingsverdier], label=kjøring.data.tags.get("mlflow.runName", kjørings_id))</p>
<p>plt.title(f"Sammenligning av {målingsnavn}")
plt.xlabel("Kjøring")
plt.ylabel(målingsnavn)
plt.legend()</p>
<p># Lagre og logg plot
plt.savefig(f"{målingsnavn}_sammenligning.png")
mlflow.log_artifact(f"{målingsnavn}_sammenligning.png")</p>
<p># Bruk
with mlflow.start_run():
plot_målings_sammenligning("svar_relevans", ["kjørings_id_1", "kjørings_id_2", "kjørings_id_3"])
Denne funksjonen oppretter en linjeplot som sammenligner en bestemt måling over flere kjøringer og logger den som en artefakt.
Alternativer til åpen kilde MLflow
Det finnes flere alternativer til åpen kilde MLflow for å håndtere maskinlærings-arbeidsflyter, hver med unike funksjoner og integrasjoner.
Managed MLflow av Databricks
Managed MLflow, hostet av Databricks, tilbyr kjernefunksjonaliteten til åpen kilde MLflow, men med ekstra fordeler som enkel integrasjon med Databricks-økosystemet, avanserte sikkerhetsfunksjoner og håndtert infrastruktur. Dette gjør det til et utmerket valg for organisasjoner som trenger robust sikkerhet og skalerbarhet.
Azure Machine Learning
Azure Machine Learning tilbyr en end-to-end maskinlæringsløsning på Microsofts Azure-cloudplattform. Det tilbyr kompatibilitet med MLflow-komponenter som modell-registret og eksperiment-sporing, selv om det ikke er basert på MLflow.
Dedikerte ML-plattformer
Flere selskaper tilbyr managed ML-produkter med ulike funksjoner:
- neptune.ai: Fokuserer på eksperiment-sporing og modellhåndtering.
- Weights & Biases: Tilbyr omfattende eksperiment-sporing, datasett-versjonering og samarbeidsverktøy.
- Comet ML: Tilbyr eksperiment-sporing, modell-produksjons-overvåking og data-logging.
- Valohai: Spesialiserer seg på maskinlærings-pipelines og orkestrering.
Metaflow
Metaflow, utviklet av Netflix (NFLX ), er en åpen kilde-ramme for å orkestrere data-arbeidsflyter og ML-pipelines. Selv om det utmerker seg i å håndtere store distribusjoner, mangler det omfattende eksperiment-sporing og modellhåndtering funksjoner sammenlignet med MLflow.
Amazon SageMaker og Google’s Vertex AI
Både Amazon SageMaker (AMZN ) og Google’s Vertex AI (GOOGL ) tilbyr end-to-end MLOps-løsninger integrert i deres respektive cloud-plattformer. Disse tjenestene tilbyr robuste verktøy for å bygge, trene og distribuere maskinlæringsmodeller i stor skala.
Detailed Comparison
Managed MLflow vs. Open Source MLflow
Managed MLflow av Databricks tilbyr flere fordeler sammenlignet med åpen kilde MLflow, inkludert:
- Oppsett og distribusjon: Enkel integrasjon med Databricks-reduksjon av oppsetts- og distribusjonstid.
- Skalerbarhet: I stand til å håndtere store maskinlærings-arbeidsflyter med lettighet.
- Sikkerhet og håndtering: Ut-av-boksen sikkerhetsfunksjoner som rollebasert tilgangskontroll (RBAC) og data-kryptering.
- Integrasjon: Dypt integrasjon med Databricks-tjenester, som forbedrer interoperabilitet og funksjonalitet.
- Data-lagring og backup: Automatiske backup-strategier sikrer datasikkerhet og pålitelighet.
- Kostnad: Brukere betaler for plattformen, lagring og beregningsressurser.
- Støtte og vedlikehold: Dedikert støtte og vedlikehold tilbudt av Databricks.
Konklusjon
Sporing av store språkmodeller med MLflow gir en robust ramme for å håndtere kompleksiteten i LLM-utvikling, evaluering og distribusjon. Ved å følge beste praksis og utnytte avanserte funksjoner som beskrevet i denne guiden, kan du skape mer organiserte, reproduksible og innsiktsfulle LLM-eksperimenter.
Husk at området for LLM er raskt utviklende, og nye teknikkene for evaluering og sporingsfunksjoner er stadig i utvikling. Hold deg oppdatert med de nyeste MLflow-utgavene og LLM-forskning for å kontinuerlig forbedre dine sporings- og evalueringprosesser.
Ettersom du anvender disse teknikkene i dine prosjekter, vil du utvikle en dypere forståelse av dine LLMs atferd og ytelse, og dette vil føre til mer effektive og pålitelige språkmodeller.














