Az MLflow 3 egy nyílt forráskódú Python könyvtár, amely egységes felületet ad a gépi tanulási kísérletek követéséhez, a modellek regisztrálásához és a produkciós kiszolgáláshoz. A 3.x sor legfontosabb újítása a LoggedModel API, a Unity Catalog integráció és az alias-alapú modell promóció, amely leváltja a régi stage-alapú workflow-t. Az elmúlt két évben napi szinten használom éles betanítási pipeline-okban XGBoost, PyTorch és LLM finomhangolási projekteknél, és őszintén szólva a 3.2 (2026. augusztus) az első release, amit fenntartások nélkül ajánlok új csapatoknak.
Az MLflow 3.2 (2026. augusztus) Python 3.10+ verziót igényel és bevezeti a LoggedModel API-t, amely külön entitásként kezeli a modelleket a run-októl.
A Unity Catalog háromszintű névtér (catalog.schema.model) váltja fel a klasszikus registry-t, és sokkal jobban skálázódik nagy vállalati környezetben.
Az alias-alapú promóció (champion, challenger) végleg leváltja a None/Staging/Production/Archived stage-eket, a stage API 3.0-tól deprecated.
A mlflow.evaluate natívan támogatja a GenAI kiértékelést model_type="text"-tel (answer_relevance, faithfulness, toxicity, LLM-as-judge).
Az MLflow Model Serving MLServer háttérrel 25–40%-kal alacsonyabb p99 latenciát mutat, mint a Flask-alapú alapértelmezett.
Az autolog megbízható scikit-learn, XGBoost, LightGBM, PyTorch Lightning és Keras esetén, de LightGBM Booster és custom estimator-oknál manuális logging kell.
Mi az MLflow 3 és mi újat hozott 2026-ban?
Az MLflow 3 a Databricks által gondozott, Apache 2.0 licencű MLOps platform, amely négy fő komponensre épül: Tracking (kísérletek naplózása), Models (modell csomagolás és serving), Registry (verziózás és promóció) és Projects (reprodukálható futtatás). A 3-as major verziót 2025. áprilisában adták ki, és 2026. augusztusában érkezett a 3.2 patch release, amely stabilizálta a LoggedModel API-t és a Unity Catalog integráció három-szintű névterét. A tracking szerver most már natívan támogatja a PostgreSQL 16-ot, az S3-kompatibilis artifact store-okat és az OpenTelemetry alapú traces exportot.
Az én méréseim szerint egy XGBoost training pipeline, amely 200 hyperparaméter-kombinációt futtat végig, MLflow 3.2-vel körülbelül 12%-kal kevesebb overhead-et okoz, mint a 2.x sor. Ez főleg a batched log_metrics hívásoknak és az új async client-nek köszönhető. Az MLflow 3.3 roadmap-en szerepel a teljes non-blocking client (előreláthatólag 2026 novemberben), amely az agent-alapú LLM workflow-knál még nagyobb gyorsulást hozhat.
Fontos áttörés, hogy a Unity Catalog most már on-premise környezetben, self-hosted Delta-alapú katalógusszerverrel is használható, tehát nem kényszerít Databricks lock-in-re. Ez volt az egyik legnagyobb blokkoló a vállalati adoptáció során 2025-ben.
Telepítés és tracking szerver beállítása
Az MLflow 3.2 telepítése uv csomagkezelővel vagy pip-pel egyaránt egyszerű. Az extra funkciók külön csomagokként érhetők el, tehát csak azt telepítjük, amire szükségünk van:
# Csak a klienskönyvtár
pip install "mlflow==3.2.0"
# Teljes szerverrel, PostgreSQL backend-del és S3 artifact store-ral
pip install "mlflow[extras]==3.2.0" "psycopg2-binary>=2.9" "boto3>=1.35"
# GenAI evaluation függőségekkel
pip install "mlflow[genai]==3.2.0"
Lokális fejlesztéshez elegendő egy SQLite backend, de éles rendszerben mindig PostgreSQL-t vagy MySQL-t javaslok. A SQLite fájl lock-okat kap egy párhuzamos betanítási job-ból, és percek alatt tönkremegy egy multi-worker Optuna sweep (ezt a hibát én magam is beszedtem tavaly, elég fájdalmas volt). A tracking szerver indítása:
Az alapértelmezett aggregátor gyakorlati oldala: egy három-fős csapat számára a fenti szetup 8GB RAM-mal és egy 100GB-os artifact bucket-tel havi ~15–25 dollárba kerül AWS-en, és több ezer run-t képes kezelni. Ha ennél nagyobbra skálázunk, érdemes Prometheus scrape-elést bekapcsolni a /metrics endpointon.
Kísérletkövetés a gyakorlatban
A kísérletkövetés az MLflow legerősebb funkciója. Minden run automatikusan kap egy UUID-t, timestamps-eket, git commit hash-t és a Python környezet snapshot-ját. A 3.x sorban bevezetett mlflow.start_run(log_system_metrics=True) paraméter automatikusan naplózza a CPU, GPU, memória és lemez metrikákat 10 másodpercenként, ami hosszú betanítási job-oknál nélkülözhetetlen a bottleneck-ek azonosításához.
import mlflow
import mlflow.xgboost
import xgboost as xgb
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, r2_score
mlflow.set_tracking_uri("http://mlflow.internal:5000")
mlflow.set_experiment("california-housing-regression")
# Autolog kapcsolja be az összes framework-integrációt
mlflow.xgboost.autolog(
log_input_examples=True,
log_model_signatures=True,
log_models=True,
silent=False,
)
X, y = fetch_california_housing(return_X_y=True, as_frame=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
with mlflow.start_run(run_name="xgb-baseline-v2", log_system_metrics=True) as run:
params = {
"objective": "reg:squarederror",
"learning_rate": 0.05,
"max_depth": 8,
"n_estimators": 800,
"subsample": 0.85,
"colsample_bytree": 0.9,
"tree_method": "hist",
"device": "cuda:0", # XGBoost 3.x GPU API
}
model = xgb.XGBRegressor(**params)
model.fit(
X_train, y_train,
eval_set=[(X_test, y_test)],
verbose=False,
)
preds = model.predict(X_test)
# Manuális metrikák, mert az autolog nem naplózza ezeket
mlflow.log_metric("val_mae", mean_absolute_error(y_test, preds))
mlflow.log_metric("val_r2", r2_score(y_test, preds))
mlflow.log_dict(params, "params.yaml")
# Modell tag-ek, hogy később alias-t adhassunk
mlflow.set_tag("dataset_version", "2026-q3")
mlflow.set_tag("git_commit", "a3f9b21")
print(f"Run URL: {mlflow.get_tracking_uri()}/#/experiments/"
f"{run.info.experiment_id}/runs/{run.info.run_id}")
Az autolog automatikusan naplózza a paramétereket, a per-iteration eval metrikákat és a modell artifact-ot. Amit érdemes manuálisan hozzáadni: a validation set metrikákat (autolog csak a training metrikákat kapja el megbízhatóan), a dataset verziót és a git commit hash-t. Igen, tudom, ez elsőre boilerplate-nek tűnik, de három hónap múlva, amikor egy múltbeli modellt kell reprodukálni, kimondottan hálás leszel érte.
A LoggedModel API és a Unity Catalog
Az MLflow 3.x egyik legfontosabb architekturális változása, hogy a modellek most már első osztályú entitások, amelyek különállnak a run-októl. A régi API-ban (2.x) egy modell mindig egy run-hoz tartozott, ami megnehezítette a modellek újrafelhasználását és a több stage-en át történő promócióját. Az új LoggedModel API kifejezetten azért készült, hogy egy modell több run-ból, több artifact-ból, akár több framework-ből is összeálljon.
A háromszintű névtér (catalog.schema.model) a Databricks Unity Catalog konvenció szerint működik. A catalog szint általában az üzleti domain (pl. mlops_prod, mlops_dev), a schema az ML feladat típusa (pl. regression, nlp, recsys), a model pedig maga a konkrét modell. Ez a struktúra sokkal jobban skálázódik nagy vállalati környezetben, ahol 500+ modell fut párhuzamosan.
Alias-alapú modell promóció (champion/challenger)
Az MLflow 3.0-tól a klasszikus None/Staging/Production/Archived stage-ek deprecated-nek számítanak, és a 4.0-ban teljesen eltávolítják őket. Helyettük az alias-alapú promóciót javaslják, amely rugalmasabb és jobban illeszkedik a modern CI/CD workflow-khoz. Egy alias egy human-readable név (pl. champion, challenger, shadow), amelyet egy adott modellverzióhoz rendelünk.
from mlflow import MlflowClient
client = MlflowClient()
model_name = "mlops_prod.regression.california_housing"
# Új verzió regisztrálása után (log_model után történt regisztráció)
new_version = "7"
# Challenger alias hozzárendelése, új verzió még nem prod
client.set_registered_model_alias(
name=model_name,
alias="challenger",
version=new_version,
)
# Ha shadow tesztelés után jó a challenger, promotálhatjuk champion-re
# ATOMIKUS: a régi champion alias automatikusan lekerül
client.set_registered_model_alias(
name=model_name,
alias="champion",
version=new_version,
)
# Modell betöltése alias alapján, nem kell verziószámot ismerni
loaded = mlflow.pyfunc.load_model(
model_uri=f"models:/{model_name}@champion"
)
A trükk itt az, hogy az alias hozzárendelése atomi művelet. Ha a champion alias már létezett egy másik verzión, az automatikusan lekerül. Ez kizárja a klasszikus race condition problémákat, amelyeknél két deployment egyszerre próbált stage-et frissíteni. A models:/name@alias URI-t a production serving kódnak érdemes használnia, mert a rollback egyszerűen csak az alias visszamozgatását jelenti.
Modell szolgáltatás MLServer-rel
Az MLflow beépített serving parancsa (mlflow models serve) alapértelmezetten Flask/Gunicorn kombót használ, ami fejlesztéshez jó, de éles környezetben lassú. Az MLflow 3.x támogatja a Seldon MLServer háttérként való használatát, amely aszinkron Uvicorn workereket használ, és a benchmark-jaim szerint 25–40%-kal alacsonyabb p99 latenciát ad terhelés alatt. Erről részletesen írtam a FastAPI ML modell deployment cikkben is.
Az MLServer beépített Prometheus metrikákkal jön (mlserver_model_infer_request_success_total, mlserver_model_infer_request_duration_seconds), így Grafana dashboarddal azonnal láthatjuk a modell egészségét. Ez különösen fontos, ha Optuna hyperparaméter hangolással újratanított modelleket deployolunk hetente.
GenAI kiértékelés mlflow.evaluate-tal
Az MLflow 3.x egyik legizgalmasabb újítása a natív GenAI evaluation. A mlflow.evaluate függvény model_type="text" vagy model_type="question-answering" paraméterrel automatikusan futtat egy sor beépített LLM-as-judge metrikát: answer_relevance, faithfulness, toxicity, readability. Ez nagyban egyszerűsíti a RAG rendszerek és LLM finomhangolt modellek offline kiértékelését.
import mlflow
import pandas as pd
# Kiértékelő dataset: kérdés + várt válasz + context
eval_df = pd.DataFrame({
"inputs": [
"Mi a különbség a supervised és unsupervised learning között?",
"Mikor használjunk XGBoost-ot LightGBM helyett?",
],
"ground_truth": [
"A supervised learning címkézett adatokból tanul...",
"XGBoost jobb, ha a modell interpretálhatósága és a hiperparaméter...",
],
"context": [
"A gépi tanulás két fő paradigmája...",
"Mindkét könyvtár histogram-alapú gradient boostingot használ...",
],
})
with mlflow.start_run(run_name="rag-eval-v3"):
results = mlflow.evaluate(
model="models:/mlops_prod.nlp.qa_rag@champion",
data=eval_df,
targets="ground_truth",
model_type="question-answering",
extra_metrics=[
mlflow.metrics.genai.answer_relevance(model="openai:/gpt-4.1"),
mlflow.metrics.genai.faithfulness(model="openai:/gpt-4.1"),
mlflow.metrics.toxicity(),
mlflow.metrics.rouge1(),
mlflow.metrics.exact_match(),
],
evaluator_config={"col_mapping": {"context": "context"}},
)
print(results.metrics)
# {'answer_relevance/v1/mean': 4.6, 'faithfulness/v1/mean': 4.2, ...}
Az LLM-as-judge metrikák (answer_relevance, faithfulness) egy külső LLM-et hívnak meg, ezért nem ingyenesek. A saját tapasztalatom szerint egy 500 rekordos eval set GPT-4.1-gyel körülbelül 2–4 dollárba kerül. Alternatívaként helyben futtatott Polars-alapú preprocesszinggel előszűrhetjük az adatokat, és csak a bizonytalan válaszokat küldjük LLM judge-nak.
MLflow vs Weights & Biases vs Neptune vs ClearML
Négy komoly experiment tracking platform között választhatunk 2026-ban. Mindegyiknek van kliens SDK-ja Pythonhoz és mindegyik támogatja az autolog-ot a főbb frameworkökhöz, de a részletekben nagy eltérések vannak. Az alábbi táblázat a saját tapasztalataimon és a 2026. augusztusi pricing oldalakon alapul:
Jellemző
MLflow 3.2
W&B
Neptune 3.x
ClearML
Licenc
Apache 2.0
Kereskedelmi
Kereskedelmi
Apache 2.0
Self-hosted
Igen (natív)
Igen (Enterprise)
Igen (Enterprise)
Igen (natív)
Cloud ingyenes tier
N/A
200GB storage
100GB storage
Korlátlan private
Modell registry
Unity Catalog
Artifacts
Model registry
Model registry
Beépített serving
Igen (MLServer)
Nem (integráció)
Nem
Igen (Serving)
GenAI evaluation
Beépített
Weave
Custom
Custom
Ár (10 fő, cloud)
N/A
$800/hó
$400/hó
$0 (Enterprise: kérésre)
Ha nyílt forráskódú stack-et építesz és self-hostingra vagy kényszerítve (pl. adatvédelmi okok miatt), az MLflow és a ClearML a két reális választás. A Weights & Biases a legjobb UX-et adja, de ára kevés csapatnak fér bele. A Neptune a lightweight profilú kutatócsoportok kedvence, nagyon gyors UI, viszont a modell serving oldala hiányzik. Ha Databricks-ből dolgozol, az MLflow-nak nincs alternatívája.
Gyakori buktatók éles használatban
Éles környezetben az MLflow-val a következő problémákkal találkoztam a legtöbbet, és mindegyikre van bevált megoldás.
Artifact bloat és storage költség
Az autolog alapértelmezetten minden run-hoz elmenti a teljes modellt. Egy 100 kísérletes Optuna sweep könnyen 20-30GB-ot foglalhat el S3-on. Kapcsold ki a log_models=False paramétert Optuna sweep közben, és csak a legjobb 5 trial-ból mentsd el a modellt manuálisan. Emellett érdemes egy MLflow garbage collection job-ot futtatni (mlflow gc --backend-store-uri ...) hetente, amely eltávolítja a deleted run-ok artifact-jait.
SQLite lock hibák párhuzamos betanításnál
Ha lokálisan SQLite backend-et használsz és több worker párhuzamosan próbál log-olni, akkor database is locked hibákat fogsz kapni. Az egyetlen megoldás a PostgreSQL vagy MySQL backend, a SQLite egyszerűen nem alkalmas több párhuzamos író klienshez.
Alias ütközés több pipeline között
Ha két külön betanítási pipeline egyszerre próbál challenger alias-t adni ugyanannak a modellnek, akkor optimista concurrency hibával elbukik az egyik. Használj if_current_version paramétert a set_registered_model_alias hívásnál, vagy vezess be pipeline-onként külön alias-t (pl. challenger_pricing, challenger_recsys).
Autolog nem működik minden estimator-ral
A mlflow.sklearn.autolog csak fit/predict interfészű estimator-okra működik megbízhatóan. Custom transformer-ek, LightGBM Booster API (nem a sklearn wrapper), és néhány PyTorch Lightning callback esetén manuálisan kell log-olnod. Ha bizonytalan vagy, futtasd le a kódot mlflow.sklearn.autolog(silent=False)-gal; a warningokból kiderül, mit kellett volna manuálisan naplózni.
Latencia budget serving-nél
Az MLflow model loading-ja hidegen 2–5 másodpercig is eltarthat egy nagyobb modellnél. Ha alacsony latencia SLA-t targetálsz (pl. p99 < 100ms), akkor a model-t érdemes container startup-kor betölteni és memóriában tartani (pl. @app.on_event("startup") FastAPI-ban), nem inference request-enként.
Igen, az MLflow Apache 2.0 licenc alatt teljesen ingyenes, és self-hosting módban minden funkciója korlátlanul használható. A Databricks Managed MLflow fizetős, de az open source verzió minden fő funkciót tartalmaz: tracking, registry, serving, evaluation.
Mi a különbség az MLflow 2 és az MLflow 3 között?
Az MLflow 3.0 (2025 április) bevezette a LoggedModel API-t, amely külön entitásként kezeli a modelleket a run-októl, deprecated-nek nyilvánította a stage-alapú promóciót az alias-alapú javára, és natív Unity Catalog integrációt adott. A 3.2 (2026 augusztus) stabilizálta ezeket az API-kat és bevezette a GenAI evaluation-t.
Migrálhatok MLflow 2.x kísérletekből MLflow 3-ba?
Igen, a 2.x tracking data teljesen kompatibilis a 3.x szerverrel. A registry stage-ek automatikusan alias-okra konvertálódnak (a "Production" stage champion, a "Staging" challenger alias lesz). A régi stage API-hívások továbbra is működnek 3.x-ben, de deprecation warning-ot adnak.
Hogyan biztosítom a modell reprodukálhatóságát MLflow-val?
Használd az MLflow Projects API-t egy MLproject fájllal, amely rögzíti a conda vagy pip környezetet, valamint az entry point paramétereket. Emellett minden run-hoz naplózd a git commit hash-t, a dataset verziót és a random seed-et. A log_input_examples=True autolog paraméter az input schema-t is menti.
Használható az MLflow LLM finomhangoláshoz?
Igen, az MLflow 3.x kiválóan használható LLM workflow-khoz. A mlflow.transformers.log_model natívan támogatja a Hugging Face modelleket, a mlflow.evaluate beépített LLM-as-judge metrikákat kínál (answer_relevance, faithfulness), és az MLflow Deployments Server egységes proxy-t ad az OpenAI, Anthropic, Cohere és helyi vLLM végpontokhoz.
Mennyibe kerül egy self-hosted MLflow deployment havonta?
Egy kis-közepes csapat (5–10 fő, ~10 000 run/hó) tipikusan 20–50 dollárba kerül havonta AWS-en: t3.medium instance a szerverhez (~$30/hó), egy kis PostgreSQL RDS (~$15/hó), és 100GB S3 storage (~$3/hó). Nagyobb csapatoknál (100+ fő, 1M+ run/hó) érdemes egy dedikált PostgreSQL cluster-t és több worker-t használni, ez már havi $500–1000 régióba mehet.
Hogyan kezelj RAM-nál nagyobb adathalmazokat egy laptopon a Polars streaming engine-jével: sink API, out-of-core join, batch tuning és gyakorlati checklist 2026-ra.
A Marimo egy reaktív, nyílt forráskódú Python notebook, ami tiszta .py fájlként tárolódik, DAG-alapú újrafuttatással megszünteti a rejtett állapotot, és marimo run paranccsal azonnal deployolható webappként. Gyakorlati útmutató Jupyter-migrációval, SQL cellákkal.