Skip to main content

How to Start an MLflow Tracking Server on Your Computer

· 11 min read
Jagdish Kumawat
Founder @ Dewiride

The MLflow tracking server is the place your training runs go: a small web server that stores every run and shows them in the MLflow UI. You don't need a cloud account or a database server to run one; MLflow 3.18 brings everything, including a SQLite database. This guide starts a server on your own computer, explains every line it prints, checks that it's ready, and stops it safely.

Syntax​

Syntax
mlflow server [OPTIONS]

In a uv project, start it through uv so it runs with the project's MLflow: uv run mlflow server [OPTIONS]. Square brackets mean the options are optional. The ones you'll use most, from mlflow server --help:

OptionWhat it setsDefault
--host <address>, or -hThe network address the server listens on. 127.0.0.1 accepts connections from this computer only127.0.0.1
--port <number>, or -pThe port the server listens on5000
--backend-store-uri <URI>Where experiments, runs, parameters and metrics are storedsqlite:///mlflow.db, a database file in the folder you start from
--artifacts-destination <URI>Where the files that runs log are stored./mlartifacts, in the folder you start from
--workers <number>, or -wHow many processes answer requests4

-h is short for --host, not for help; --help lists every option. The example below starts the server on port 8080, because on a Mac port 5000 belongs to the AirPlay Receiver: see How to Change the MLflow Server Port.

Prerequisites​

  • MLflow 3.18 installed in a uv project. This guide uses a folder called mlflow-server, made with uv init --bare --python 3.15 mlflow-server and uv add mlflow: see How to Install MLflow in a Python Project with uv.
  • A terminal in that folder, which the server will keep busy.

Step 1: Start the Server​

Terminal (in mlflow-server)
uv run mlflow server --port 8080

On the very first start, the output looks like this:

Output
Backend store URI not provided. Using sqlite:///mlflow.db
Registry store URI not provided. Using backend store URI.
2026/11/13 17:19:14 INFO mlflow.store.db.utils: Creating initial MLflow database tables...
2026/11/13 17:19:14 INFO mlflow.store.db.utils: Updating database tables
[MLflow] Security middleware enabled with default settings (localhost-only). To allow connections from other hosts, use --host 0.0.0.0 and configure --allowed-hosts and --cors-allowed-origins.
2026/11/13 17:19:15 INFO mlflow.server.jobs.executor_registry: Available backends after discovery: docker, local
2026/11/13 17:19:15 INFO mlflow.server.jobs.executor_registry: Job executor backend 'local' passed requirements check
2026/11/13 17:19:15 INFO: Uvicorn running on http://127.0.0.1:8080 (Press CTRL+C to quit)
2026/11/13 17:19:15 INFO: Started parent process [93838]
/Users/you/source/mlflow-server/.venv/lib/python3.15/site-packages/mlflow/server/fastapi_app.py:24: StarletteDeprecationWarning: starlette.middleware.wsgi is deprecated and will be removed in a future release. Please refer to https://github.com/abersheeran/a2wsgi as a replacement.
from starlette.middleware.wsgi import WSGIResponder, build_environ
/Users/you/source/mlflow-server/.venv/lib/python3.15/site-packages/mlflow/server/fastapi_app.py:24: StarletteDeprecationWarning: starlette.middleware.wsgi is deprecated and will be removed in a future release. Please refer to https://github.com/abersheeran/a2wsgi as a replacement.
from starlette.middleware.wsgi import WSGIResponder, build_environ
/Users/you/source/mlflow-server/.venv/lib/python3.15/site-packages/mlflow/server/fastapi_app.py:24: StarletteDeprecationWarning: starlette.middleware.wsgi is deprecated and will be removed in a future release. Please refer to https://github.com/abersheeran/a2wsgi as a replacement.
from starlette.middleware.wsgi import WSGIResponder, build_environ
/Users/you/source/mlflow-server/.venv/lib/python3.15/site-packages/mlflow/server/fastapi_app.py:24: StarletteDeprecationWarning: starlette.middleware.wsgi is deprecated and will be removed in a future release. Please refer to https://github.com/abersheeran/a2wsgi as a replacement.
from starlette.middleware.wsgi import WSGIResponder, build_environ
2026/11/13 17:19:18 INFO: Started server process [93843]
2026/11/13 17:19:18 INFO: Waiting for application startup.
2026/11/13 17:19:18 INFO: Started server process [93844]
2026/11/13 17:19:18 INFO: Waiting for application startup.
2026/11/13 17:19:18 INFO: Started server process [93842]
2026/11/13 17:19:18 INFO: Waiting for application startup.
2026/11/13 17:19:18 INFO: Started server process [93841]
2026/11/13 17:19:18 INFO: Waiting for application startup.
2026/11/13 17:19:18 INFO: Application startup complete.
2026/11/13 17:19:19 INFO: Application startup complete.
2026/11/13 17:19:19 INFO: Application startup complete.
2026/11/13 17:19:19 INFO: Application startup complete.

A terminal running uv run mlflow server --port 8080: sqlite:///mlflow.db as the backend store, the initial database tables being created, the localhost-only security middleware, Uvicorn running on http://127.0.0.1:8080, and four Application startup complete lines.

What each part means:

LineMeaning
Backend store URI not provided. Using sqlite:///mlflow.dbRuns are stored in a SQLite database file, mlflow.db, in the folder you started from. This has been the default since MLflow 3.7.0
Registry store URI not providedThe Model Registry uses the same database
Creating initial MLflow database tables...First start only: MLflow created its tables
Security middleware enabled … (localhost-only)Only programs on this computer can connect
Job executor backend 'local' passed requirements checkThe background job runner, used by MLflow's AI features, can run
Uvicorn running on http://127.0.0.1:8080The address of your server
StarletteDeprecationWarningA warning from MLflow's own code, once per worker. Harmless: Fixed: "StarletteDeprecationWarning: starlette.middleware.wsgi is deprecated" When You Start the MLflow Server
Application startup complete × 4The server runs 4 worker processes by default; it's ready when all four report in

A few seconds later, four more lines confirm the job runner's scheduled tasks. Leave the terminal open: the server stops when the terminal does.

Step 2: Check That It's Ready​

The server answers two simple addresses. In a second terminal:

Terminal 2
curl -i http://127.0.0.1:8080/health
Output
HTTP/1.1 200 OK
date: Fri, 13 Nov 2026 12:32:04 GMT
server: uvicorn
content-length: 2
content-type: text/plain; charset=utf-8
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
vary: Origin

OK

/version returns the server's MLflow version:

Terminal 2
curl -i http://127.0.0.1:8080/version
Output
HTTP/1.1 200 OK
date: Fri, 13 Nov 2026 12:01:55 GMT
server: uvicorn
content-type: text/html; charset=utf-8
content-length: 6
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
vary: Origin

3.18.0

In Windows PowerShell, type curl.exe instead of curl. Or skip curl entirely and open the UI.

Step 3: Open the UI​

Open http://127.0.0.1:8080 in your browser:

The MLflow 3.18.0 UI on the first visit, in GenAI mode, with the Welcome to MLflow page, a Default experiment under Recent Experiments, and the MLflow Assistant panel open on the right.

A new server has one experiment, Default. For classic machine learning, switch the sidebar to Model training and close the Assistant panel: How to Open the MLflow UI and Find Your Runs.

Where the Server Keeps Your Data​

Everything lives in the folder you started the server from:

  • mlflow.db: the SQLite database with experiments, runs, parameters, metrics and tags. Created on the first start.
  • mlartifacts/: files your runs log, such as charts and models. Created when the first file arrives.

So always start the server from the same folder. How to See Where MLflow Stores Runs and Artifacts looks inside both.

The Options You'll Use Most​

From mlflow server --help:

OptionDefaultWhat it does
--port5000The port to listen on. This series uses 8080, because on a Mac port 5000 belongs to the AirPlay Receiver
--host127.0.0.1The network address to listen on. Keep the default on a laptop
--workers4How many worker processes handle requests
--backend-store-urisqlite:///mlflow.dbWhere runs are stored, for example a PostgreSQL database
--artifacts-destination./mlartifactsWhere logged files are stored

mlflow ui still works in MLflow 3.18.0 and takes exactly the same options; MLflow's documentation uses mlflow server.

Step 4: Stop the Server​

Press Ctrl+C in the server's terminal. Uvicorn shuts down its four workers and the command exits. The workers print at the same time, so the lines arrive mixed up:

Output (last lines)
^CException ignored on threading shutdown:
2026/11/13 17:17:49 INFO: Shutting down
...
2026/11/13 17:17:49 INFO: Received SIGINT, exiting.
2026/11/13 17:17:49 INFO: Terminated child process [65535]
...
2026/11/13 17:17:49 INFO: Stopping parent process [65532]
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.15/lib/python3.15/threading.py", line 1721, in _shutdown
_thread_shutdown()
~~~~~~~~~~~~~~~~^^
KeyboardInterrupt

The Exception ignored on threading shutdown and KeyboardInterrupt lines look alarming, but the server still stopped cleanly; Fixed: "Exception ignored on threading shutdown" KeyboardInterrupt When You Stop the MLflow Server explains where they come from.

Nothing is lost when the server stops. Run uv run mlflow server --port 8080 from the same folder, and every run is still there.

Common Mistakes​

MistakeWhat happensDo this instead
Opening http://localhost:5000 on a Mac"Access to localhost was denied" (HTTP ERROR 403) from the AirPlay ReceiverUse port 8080: Fixed: "Access to localhost was denied" HTTP ERROR 403 When You Open the MLflow UI on a Mac
Starting the server from another folderIt creates a new, empty mlflow.db there, and your runs seem to vanishAlways start from the same folder
Opening the UI before Application startup completeThe page doesn't load yetWait for all four lines
Closing the server's terminalThe server stopsKeep it open, or run it in its own window

Troubleshooting​

SymptomLikely causeFix
ERROR: [Errno 48] Address already in useAnother program, or another MLflow server, uses the portFixed: "[Errno 48] Address already in use" When You Start the MLflow Server
A StarletteDeprecationWarning on every startMLflow 3.18.0 imports a module Starlette marked as deprecatedHarmless; see the Fixed post linked above
Training code fails with Max retries exceeded … Connection refusedThe server isn't running at the address the code usesFixed: "MlflowException: API request to … failed with exception … Max retries exceeded" Connection Refused in MLflow

FAQ​

Do I need a database server such as PostgreSQL?​

Not on your own computer. SQLite is a file, built into Python, and it's MLflow's default. A team sharing one server would use a database server.

Can other computers reach my server?​

No. It listens on 127.0.0.1 and only accepts connections from your own computer.

Does the server send data anywhere?​

Open-source MLflow collects anonymous usage data by default. Set MLFLOW_DISABLE_TELEMETRY=true before starting the server to turn it off for the server and the UI: How to Turn Off MLflow Telemetry.

Conclusion​

uv run mlflow server --port 8080 started a tracking server at http://127.0.0.1:8080, with a SQLite database in mlflow.db, files in mlartifacts/, four workers and a localhost-only security setting. /health answered OK, /version answered 3.18.0, and Ctrl+C stopped it without losing anything.

Additional Resources​