MLOpsThe MLOps lifecycle · MLflow 3.17 · DVC 3.67 · FastAPI · Docker · GitHub Actions · Evidently · Python 3.11+
Dashboard
0%
1
Curious builder0 XP earned · 300 to level 2
0 daysFinish a lesson to begin
Badge collection0 of 6 unlocked
50 small wins to finish your pathNext lesson →

Installing the MLOps toolkit

The MLOps toolkit for this course is a set of pinned Python libraries that train the model, track the runs, version the data, serve the predictions and watch for drift: scikit-learn, MLflow, DVC, FastAPI and Evidently, with pandas and NumPy underneath them.

Last updated: 19 Oct, 2026 · MLOps

Every page in this course runs against the versions below, so the numbers you see on a page are the numbers your own run prints. There is no API key anywhere in the course, no model to download and no GPU. Docker and a GitHub account arrive later, in the serving and CI/CD parts, and each is set up in the lesson that first needs it.

Checking your Python version

The stack needs Python 3.11 or newer. scikit-learn 1.9.1 and NumPy 2.3.5 publish no build for 3.10, so an older Python cannot install them at all. Open a terminal (on Windows, PowerShell from the Start menu; on macOS, the Terminal app) and ask Python what it is:

python3 --version

If it prints 3.11 or higher you are set. If it prints 3.10 or lower, or the command is not found, install a current Python from python.org (on Windows, tick Add python.exe to PATH in the installer), or take the uv route below, which fetches a suitable Python for the project itself.

Why every line of requirements.txt carries a version · from the Complete End to End Deep Learning Project With MLFLOW,DVC And Deployment · 29:04 to 31:17

The clip pins TensorFlow 2.12, MLflow 2.2.2 and python-box 6 against Python 3.8 on conda; this course pins MLflow 3.17.1, DVC 3.67.1, Evidently 0.7.23, python-box 7.4.1 and scikit-learn 1.9.1 against Python 3.11 or newer, because Python 3.8 is end of life and TensorFlow is never installed here.

Installing the libraries

Pick one route. On your own machine prefer uv: it makes a project folder with its own environment, so these pins never clash with other Python work on the same computer. pip into your main Python is shorter to type. Colab needs no install at all, though the Docker and DVC lessons want a real terminal.

curl -LsSf https://astral.sh/uv/install.sh | sh
uv init mlops-course --python 3.12
cd mlops-course
uv add pandas==2.3.3 numpy==2.3.5 scikit-learn==1.9.1 joblib==1.5.2 \
    matplotlib==3.10.7 mlflow==3.17.1 dvc==3.67.1 evidently==0.7.23 \
    fastapi==0.146.0 uvicorn==0.54.0 pydantic==2.14.1 httpx2==2.14.0 \
    PyYAML==6.0.3 python-box==7.4.1 ensure==1.0.4

What the uv route sets up

  • The first line installs uv, a fast package manager. Open a new terminal afterwards so the uv command is on your path.
  • uv init mlops-course --python 3.12 creates the folder with a pyproject.toml listing the project's libraries, and fetches Python 3.12 if your machine does not have it.
  • uv add makes a private environment in mlops-course/.venv, installs the pins into it and writes the exact resolution to uv.lock, so a teammate who clones the repo gets the same install.
  • Run code with uv run, for example uv run python check_setup.py. There is no activate step: uv always uses the project's own environment.

What the pip and Colab routes do

  • python3 -m pip (or py -m pip on Windows) installs into the same interpreter that python3 runs, which avoids the classic mistake of installing into one Python and running another.
  • Colab already ships pandas, NumPy, matplotlib and FastAPI, so its line installs only what is missing. After a %pip install, restart the session (Runtime, Restart session) so the new versions load.
  • FastAPI's test client needs httpx2, which is on 2.x, not 0.28. With plain httpx installed instead, every test run prints a Starlette deprecation warning over its output.

Reading the version check

Save this as check_setup.py in the project folder and run it with uv run python check_setup.py, python3 check_setup.py or py check_setup.py, or paste it into a notebook cell:

Examplecheck_setup.py, run on the course's own install
import sys
from importlib.metadata import version

print("python      ", sys.version.split()[0])
for name in ("scikit-learn", "pandas", "numpy", "mlflow", "dvc",
             "evidently", "fastapi", "pydantic"):
    print(f"{name:<12}", version(name))
  • python 3.12.13 is the interpreter these pages ran on. Anything from 3.11 up gives the same results.
  • scikit-learn 1.9.1 is the version behind every metric in the course. It renamed sparse to sparse_output on OneHotEncoder and dropped squared from the squared-error metric, so code from a 2023 tutorial needs both changed.
  • mlflow 3.17.1 is three major versions past the 2.x the end-to-end videos use. The tracking lessons name each change where it bites.
  • evidently 0.7.23 is a rewrite of the 0.4 API, so the drift lesson teaches the current shape rather than the one in the older tutorial.
  • importlib.metadata.version reads the installed distribution name, which is why the check asks for scikit-learn rather than the import name sklearn.

Fixing the two errors this install throws

Two failures account for most of the install questions on these projects. Both are shown here with the message pip prints.

Installing a pin your Python is too old for

bash
$ python3 -m pip install scikit-learn==1.9.1
ERROR: Could not find a version that satisfies the requirement scikit-learn==1.9.1
  (from versions: 1.0.2, 1.1.0, ... 1.7.0, 1.7.1, 1.7.2)
ERROR: No matching distribution found for scikit-learn==1.9.1

The version list stopping short of the pin is the tell: the index has 1.9.1, but not for the Python you ran pip with. Check the version with the command above and install Python 3.11 or newer, or let uv init --python 3.12 fetch one for the project.

Installing a library by its import name

bash
$ python3 -m pip install yaml
ERROR: Could not find a version that satisfies the requirement yaml (from versions: none)
ERROR: No matching distribution found for yaml

from versions: none means no project of that name exists on the index. Several libraries here install under one name and import under another: PyYAML imports as yaml, python-box imports as box, and scikit-learn imports as sklearn. Install the name in the pin list, import the other one.

uv against pip for this project

uvpip into your main Python
Where libraries landA .venv inside the projectThe interpreter you ran pip with
Python versionFetched and pinned per projectWhatever is already installed
Exact versions recordeduv.lock, committed to gitOnly what you typed
Clash with other workNone, the environment is privatePossible: one set of versions for everything
Running a scriptuv run python x.pypython3 x.py

Where the install choice matters

  • Following this course on a work laptop, where another project already pins a different pandas and the two cannot both win.
  • Handing the project to someone else, where uv.lock or the pinned requirements.txt is what makes their run match yours.
  • Rebuilding the same environment in CI, where the build has no interactive terminal and installs from the pin file alone.
Watch out. Installing with pip while running code with a different interpreter is the most common setup failure, and it looks like a library bug: the install says Successfully installed and the import still fails. Always install with python3 -m pip or py -m pip, never the bare pip command, so the install and the run use the same Python.
Try it yourself
  • Run the version check and compare each line with the pins in the install tab you used.
  • Add a deliberately misspelled name such as panda to the check and read the ModuleNotFoundError it raises, so the message is familiar when a real import fails.
  • Ask pip for sklearn instead of scikit-learn and read what it says about the name.

Little by little, you're building something great.