{"id":49770,"date":"2025-06-22T15:02:47","date_gmt":"2025-06-22T15:02:47","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49770"},"modified":"2026-02-21T07:29:35","modified_gmt":"2026-02-21T07:29:35","slug":"step-by-step-install-run-mlflow-on-windows","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/step-by-step-install-run-mlflow-on-windows\/","title":{"rendered":"Step-by-Step: Install &amp; Run MLflow on Windows"},"content":{"rendered":"\n<p>Here\u2019s a <strong>step-by-step guide<\/strong> to install and run <strong>MLflow on Windows<\/strong>, covering setup, UI launch, and test tracking. This works on <strong>Windows 10\/11<\/strong> with Python \u2265 3.8.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 Step-by-Step: Install &amp; Run MLflow on Windows<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\uddf0 Step 1: Install Python (if not already installed)<\/h3>\n\n\n\n<p>MLflow works best with <strong>Python 3.8\u20133.11<\/strong>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Download Python from <a href=\"https:\/\/www.python.org\/downloads\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.python.org\/downloads\/<\/a><\/li>\n\n\n\n<li>During installation, make sure to check \u2705 <strong>&#8220;Add Python to PATH&#8221;<\/strong><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udca1 Step 2 (Recommended): Create a Virtual Environment<\/h3>\n\n\n\n<p>Open <strong>Command Prompt or PowerShell<\/strong> and run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">python<\/span> <span class=\"hljs-selector-tag\">-m<\/span> <span class=\"hljs-selector-tag\">venv<\/span> <span class=\"hljs-selector-tag\">mlflow-env<\/span>\n<span class=\"hljs-selector-class\">.mlflow-envScriptsactivate<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This isolates dependencies for MLflow.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udce6 Step 3: Upgrade pip<\/h3>\n\n\n\n<p>Still inside the virtual environment:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">python -m pip install --upgrade pip\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\ude80 Step 4: Install MLflow<\/h3>\n\n\n\n<p>Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">pip install mlflow\n<\/code><\/span><\/pre>\n\n\n<p>Verify it installed:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mlflow --version\n<\/code><\/span><\/pre>\n\n\n<p>You should see something like:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">mlflow<\/span>, <span class=\"hljs-selector-tag\">version<\/span> 2<span class=\"hljs-selector-class\">.21<\/span><span class=\"hljs-selector-class\">.3<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h3 class=\"wp-block-heading\">\ud83c\udf10 Step 5: Launch the MLflow Tracking UI<\/h3>\n\n\n\n<p>Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mlflow ui\nor\nstart mlflow ui\n<\/code><\/span><\/pre>\n\n\n<p>This will start a local server at:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">http:<span class=\"hljs-comment\">\/\/127.0.0.1:5000<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Visit this URL in your browser to access the MLflow UI.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"396\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-14-1024x396.png\" alt=\"\" class=\"wp-image-49771\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-14-1024x396.png 1024w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-14-300x116.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-14-768x297.png 768w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-14-1536x593.png 1536w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-14.png 1910w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\uddea Step 6: Run a Test MLflow Tracking Script<\/h3>\n\n\n\n<p>Save the following as <code>test_mlflow.py<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import mlflow\nimport mlflow.sklearn\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.datasets import load_diabetes\nfrom sklearn.model_selection import train_test_split\n\n<span class=\"hljs-comment\"># \ud83d\udd27 Set tracking URI to the running server<\/span>\nmlflow.set_tracking_uri(<span class=\"hljs-string\">\"http:\/\/127.0.0.1:5000\"<\/span>)\n\n<span class=\"hljs-comment\"># Load dataset<\/span>\ndata = load_diabetes()\nX_train, X_test, y_train, y_test = train_test_split(data.data, data.target)\n\n<span class=\"hljs-comment\"># Enable autologging<\/span>\nmlflow.sklearn.autolog()\n\n<span class=\"hljs-comment\"># Start tracking<\/span>\nwith mlflow.start_run():\n    model = RandomForestRegressor()\n    model.fit(X_train, y_train)\n    score = model.score(X_test, y_test)\n    <span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"Model score:\"<\/span>, score)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Run the script:<\/p>\n\n\n\n<p>This opens a new command prompt window for the UI, leaving your current terminal free.<\/p>\n\n\n\n<p>Then in the same terminal:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>python mlflow_test.py<\/code><\/pre>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\"><\/code><\/span><\/pre>\n\n\n<p>Now go back to your MLflow UI (<code>http:\/\/127.0.0.1:5000<\/code>) and you will see the run logged.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 What Just Happened:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 Your <strong>ML model trained<\/strong> (<code>RandomForestRegressor<\/code>)<\/li>\n\n\n\n<li>\u2705 The model\u2019s score was printed: <code>0.3752<\/code><\/li>\n\n\n\n<li>\u2705 The run was logged to MLflow&#8217;s tracking server at <code>http:\/\/127.0.0.1:5000<\/code><\/li>\n\n\n\n<li>\u2705 A <strong>run name<\/strong> like <code>learned-hound-363<\/code> was auto-generated<\/li>\n\n\n\n<li>\u2705 The script output gave you two links:\n<ul class=\"wp-block-list\">\n<li>Run page: <a class=\"\" href=\"http:\/\/127.0.0.1:5000\/#\/experiments\/0\/runs\/a0f0442085f94809a33d7512e0cc7ef6\">View Run<\/a><\/li>\n\n\n\n<li>Experiment page: <a class=\"\" href=\"http:\/\/127.0.0.1:5000\/#\/experiments\/0\">View Experiment<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"130\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-15-1024x130.png\" alt=\"\" class=\"wp-image-49774\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-15-1024x130.png 1024w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-15-300x38.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-15-768x97.png 768w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-15.png 1190w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"421\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-16-1024x421.png\" alt=\"\" class=\"wp-image-49777\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-16-1024x421.png 1024w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-16-300x123.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-16-768x316.png 768w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-16-1536x632.png 1536w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-16.png 1571w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcc1 Step 7: Where is the data saved?<\/h3>\n\n\n\n<p>MLflow creates a folder named:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mlruns\/\n<\/code><\/span><\/pre>\n\n\n<p>This contains all experiment logs and metrics.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddfc Optional Cleanup<\/h2>\n\n\n\n<p>To stop the MLflow UI:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Press <code>Ctrl + C<\/code> in the terminal<\/li>\n<\/ul>\n\n\n\n<p>To deactivate the virtual environment:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">deactivate\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udee0\ufe0f Troubleshooting Tips<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Issue<\/th><th>Solution<\/th><\/tr><\/thead><tbody><tr><td><code>mlflow: command not found<\/code><\/td><td>Make sure you&#8217;re in the virtual environment. Activate with <code>.mlflow-envScriptsactivate<\/code><\/td><\/tr><tr><td>Port 5000 busy<\/td><td>Run <code>mlflow ui --port 5001<\/code><\/td><\/tr><tr><td>UI not opening<\/td><td>Use full URL <code>http:\/\/127.0.0.1:5000<\/code> in your browser<\/td><\/tr><tr><td>Python 3.13 issues<\/td><td>Downgrade to Python 3.10 or 3.11 for stability<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">One Code<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import mlflow\nimport mlflow.sklearn\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.datasets import load_diabetes\nfrom sklearn.model_selection import train_test_split\n\n<span class=\"hljs-comment\"># \ud83d\udd27 Set tracking URI to the running server<\/span>\nmlflow.set_tracking_uri(<span class=\"hljs-string\">\"http:\/\/127.0.0.1:5000\"<\/span>)\nmlflow.set_experiment(<span class=\"hljs-string\">\"MyImprovedExperiment\"<\/span>)\n\n<span class=\"hljs-comment\"># Load dataset<\/span>\ndata = load_diabetes()\nX_train, X_test, y_train, y_test = train_test_split(data.data, data.target)\n\n<span class=\"hljs-comment\"># Enable autologging<\/span>\nmlflow.sklearn.autolog()\n\n<span class=\"hljs-comment\"># Start tracking<\/span>\nwith mlflow.start_run():\n    model = RandomForestRegressor()\n    model.fit(X_train, y_train)\n    score = model.score(X_test, y_test)\n\n    <span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"Model score:\"<\/span>, score)\n\n    <span class=\"hljs-comment\"># Optional: log manually with input example<\/span>\n    input_example = X_train&#91;<span class=\"hljs-number\">0<\/span>:<span class=\"hljs-number\">1<\/span>]\n    mlflow.sklearn.log_model(\n        sk_model=model,\n        artifact_path=<span class=\"hljs-string\">\"model\"<\/span>,\n        input_example=input_example,\n    )\n\nmlflow.log_param(<span class=\"hljs-string\">\"learning_rate\"<\/span>, <span class=\"hljs-number\">0.1<\/span>)\nmlflow.log_metric(<span class=\"hljs-string\">\"accuracy\"<\/span>, <span class=\"hljs-number\">0.87<\/span>)\nmlflow.sklearn.log_model(model, <span class=\"hljs-string\">\"my_model\"<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Here\u2019s a step-by-step guide to install and run MLflow on Windows, covering setup, UI launch, and test tracking. This works on Windows 10\/11 with Python \u2265 3.8. \u2705 Step-by-Step: Install&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-49770","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49770","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=49770"}],"version-history":[{"count":8,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49770\/revisions"}],"predecessor-version":[{"id":59010,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49770\/revisions\/59010"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49770"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49770"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49770"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}