← All writing
MLOps · 5 min read · 17 Aug 2026

Setting Up Your First MLOps Project on a Laptop

Before you rent a single GPU or spin up a cloud pipeline, you can learn almost everything that matters about MLOps using nothing but your own machine and some discipline.

Cover image for the article: Setting Up Your First MLOps Project on a Laptop

Why the cloud is not the first problem

Most introductions to MLOps start with Kubernetes, managed feature stores, or a cloud vendor's pipeline service. I think this is the wrong order of operations for anyone building their first project. The hard part of MLOps is not provisioning compute; it is designing a workflow where data, code, and models stay in sync, where every result can be traced back to the exact inputs that produced it, and where you can tell the difference between a genuine improvement and noise. None of that requires a single cloud credential.

A laptop forces useful constraints. You cannot throw more machines at a messy pipeline, so you are pushed to keep things small, modular, and inspectable. If your training script cannot run cleanly end to end on a modest dataset locally, moving it to the cloud will only add latency to your debugging loop and cost to your mistakes. I would rather spend a week getting the local version right than spend a week fighting cloud logs to understand why a job silently failed.

There is also a leakage argument. Many of the worst evaluation mistakes I have seen, splits that accidentally share information between train and test, features computed using future data, come from pipelines that grew organically without anyone stepping back to check the flow of information. Building the pipeline locally, where you can step through every stage with a debugger and print statements, makes these errors far easier to catch than in a distributed job running somewhere you cannot easily inspect.

The minimum viable pipeline

A first MLOps project needs four things: version control for code, version control for data, a way to track experiments, and a way to reproduce a result exactly. You do not need elaborate tooling for any of these on a laptop. Git handles code. A lightweight data versioning tool, or even a disciplined convention of hashing your dataset files and recording the hash alongside results, handles data. A simple experiment log, whether that is a proper tracking tool or a structured CSV file you append to after every run, handles tracking. And a fixed random seed plus a pinned environment file handles reproducibility.

Concretely, imagine you are training a classifier on a tabular dataset of five thousand rows. Your project structure might separate raw data, processed data, and model artefacts into distinct folders, none of which get committed directly to git but all of which are referenced by name and hash in your experiment log. Each training run writes a row: the git commit hash, the data hash, the hyperparameters, the validation metric, and the path to the saved model. When you come back three weeks later and see that run 14 scored an F1 of 0.81 while run 22 scored 0.76, you can trace both back to the exact code and data that produced them, rather than trusting your memory.

This sounds like overhead for a small project, and it is, slightly. But the discipline compounds. The first time you catch a silent regression because your data hash changed without you meaning it to, or the first time you reproduce a six-month-old result in ten minutes because your environment file was pinned, the overhead pays for itself many times over. These are exactly the habits that make cloud MLOps tractable later, because the cloud version of this problem is the same problem with more moving parts and less visibility.

laptop with code editor open on desk

Evaluation before automation

It is tempting to jump straight to automating retraining and deployment once the basic pipeline runs. I would resist that until the evaluation strategy is solid, because automation only accelerates whatever process you have built, good or bad. If your validation split leaks information from training, automating the pipeline just means you now generate misleadingly good numbers faster and more often.

Concretely, suppose your dataset has a time dimension, customer transactions over eighteen months, say. A random train-test split will scatter future transactions into training and past ones into testing, letting the model implicitly learn patterns it should not have access to. On a laptop, with a small dataset, it is straightforward to build a proper time-based split by hand: train on the first fourteen months, validate on the next two, test on the final two, and check that no customer ID appears in both training and test if your task requires generalising to unseen customers. Getting this right on a toy problem, where you can eyeball every row if needed, is far easier than diagnosing it after the fact on a cloud dataset with millions of rows.

Alongside the split, build one honest baseline before touching anything sophisticated. A logistic regression, a simple moving average, a majority-class predictor: something you fully understand and can compute in seconds. If your fancier model only edges out the baseline by a fraction of a percentage point on your validation metric, that tells you something important before you invest more engineering effort. This step is cheap on a laptop and expensive to skip on the cloud, where a marginal model can look impressive purely because it consumed more compute and time.

What to carry forward

When you do eventually move to the cloud, the goal is not to rebuild your workflow but to lift it unchanged. If your local pipeline expects a versioned dataset path, a config file of hyperparameters, and writes results to a structured log, a cloud job should be able to run the identical code with the identical inputs and produce the identical output, modulo hardware-specific floating point differences. If moving to the cloud requires you to rewrite large parts of your pipeline, that is a sign the local version was not actually a pipeline, just a script.

Practically, I would suggest treating your laptop project as a contract: any stage of the pipeline, from raw data to final metric, should be re-runnable from a single command, with all the configuration explicit rather than hardcoded. Test that contract by deleting your processed data and model artefacts and rebuilding everything from scratch. If that fails, or requires manual steps you have forgotten to script, fix it before you touch a cloud console. The cloud will amplify whatever habits you bring to it; it is worth making sure those habits are good ones first.

notebook with handwritten data pipeline diagram
← All writing See the project case studies →