AutomateEdge · ML Engineer · Portfolio Projects

ML Engineer Portfolio Projects: 15 Shippable Ideas

These projects are ordered by depth and dependency — each one teaches something the later ones require. A strong ML Engineer portfolio contains 8-10 of these. The projects that get interviews are not the ones that use the most tools — they are the ones that show you understand what you built, why you made each decision, and what the numbers mean. Every project below should have: training/evaluation curves in a W&B report, a README that answers 'what problem, what approach, what result,' and a live demo or reproducible run command.

1. Implement a transformer from scratch — decoder-only language model

Difficulty · Intermediate 40-55 hours PyTorcheinopsWeights & BiasesJupyter

Write a decoder-only transformer (GPT-style) in under 500 lines of raw PyTorch — no Hugging Face, no Lightning. Include multi-head self-attention with causal masking, rotary positional embeddings, layer norm, and a standard feedforward block. Train on TinyShakespeare or a comparable small text corpus. Track loss curves in W&B. Compare your implementation against nanoGPT as a reference checkpoint. Write a blog post walking through each architectural decision with the mathematical motivation.

Evaluation rubric (what recruiters check on your GitHub)

2. Fine-tune an LLM with LoRA — reproduce benchmark metrics

Difficulty · Intermediate 35-50 hours Hugging Face TransformersPEFTAccelerateTRLbitsandbytesW&B

Fine-tune Llama 3.1 8B or Qwen 2.5 7B on an instruction dataset (Alpaca, ShareGPT, or a domain-specific set you curate) using LoRA via Hugging Face PEFT + Accelerate. Run ablations on LoRA rank (r=4, 8, 16, 32) and alpha, tracking loss and downstream eval metrics. Report ROUGE, perplexity, or a task-specific accuracy depending on your dataset. Compare to a full-fine-tune baseline on the same number of trainable parameters. Quantise the final checkpoint to INT4 and measure inference throughput before and after.

Evaluation rubric (what recruiters check on your GitHub)

3. Distributed training pipeline — train a model across 2+ GPUs

Difficulty · Advanced 40-60 hours PyTorch FSDPDeepSpeedtorchrunPyTorch ProfilerNVIDIA Nsight Systems

Take your transformer from project 1 (or a medium-sized image model) and train it across 2 or 4 GPUs using PyTorch FSDP. Profile single-GPU vs multi-GPU throughput (samples/second), memory usage per device, and communication overhead using PyTorch Profiler and NVIDIA Nsight. Then add DeepSpeed ZeRO-2 and compare. Document the setup, the results, and the trade-offs. The goal is to demonstrate you understand distributed training beyond 'I added `.to('cuda')`'.

Evaluation rubric (what recruiters check on your GitHub)

4. Reproduce a research paper end-to-end

Difficulty · Advanced 55-80 hours PyTorch (primary)Hugging Face DatasetsW&BLaTeX / Markdown for write-up

Pick a paper with a clear, measurable benchmark — LoRA, Mamba, DPO, CLIP, or Diffusion Policy are all reasonable choices depending on your interest area. Re-implement the core algorithm from scratch. Train on the paper's exact dataset (or a documented substitute). Report the primary metric from the paper and compare your result. Write a post-mortem: where did your first implementation differ from the paper, what did you have to fix, and what is still unexplained. Reproducing a paper is the single best signal of research-adjacent ML competence.

Evaluation rubric (what recruiters check on your GitHub)

5. Custom optimiser implementation + benchmarking

Difficulty · Advanced 30-45 hours PyTorchW&BNumPy (for derivation verification)

Implement two optimisers from scratch in PyTorch — Adam and one modern variant (SOAP, Muon, AdaFactor, or Adan). Verify mathematical correctness against PyTorch's reference on the same model and data. Benchmark convergence speed, final validation loss, and wall-clock time on a small language model task. Write up the derivation, the update rule, and the intuition behind each optimizer's design choice. This project demonstrates the math depth that separates ML Engineers from ML practitioners.

Evaluation rubric (what recruiters check on your GitHub)

6. A/B testing framework for model improvements

Difficulty · Intermediate 35-50 hours FastAPIPostgreSQLPython (scipy.stats)Grafana or a custom dashboard

Build an end-to-end A/B testing framework for ML models. Implement statistical power analysis to determine required sample size before launching an experiment. Run a real experiment pitting two model variants (e.g., base model vs LoRA fine-tune, or model with INT8 quantisation vs full precision) against each other on live or simulated traffic. Implement sequential testing (alpha spending) to allow early stopping. Log all predictions and compute the primary metric plus guardrail metrics. Report the result with a proper confidence interval.

Evaluation rubric (what recruiters check on your GitHub)

7. Model serving system with batching and autoscaling

Difficulty · Advanced 45-65 hours Ray Serve or vLLMFastAPIPrometheus + GrafanaLocustDocker + Kubernetes or Docker Compose

Build a production-grade model serving endpoint that handles variable request loads. Implement dynamic batching (accumulate requests for up to 20ms before forwarding to the model). Deploy with Ray Serve or vLLM. Add horizontal autoscaling triggered by GPU utilisation. Load test with Locust or k6 at 1x, 5x, and 20x steady-state traffic. Report p50, p95, and p99 latency and throughput at each load level. Compare serving cost per 1000 requests before and after batching optimisation.

Evaluation rubric (what recruiters check on your GitHub)

8. Feature store prototype with point-in-time correctness

Difficulty · Intermediate 30-45 hours FeastRedisApache ParquetpandasFastAPI (for serving)

Build a feature store that correctly serves features with point-in-time join semantics — the key property that prevents training-serving skew in time-dependent ML systems. Use Feast for the core store implementation. Define an offline store (Parquet-backed) and an online store (Redis-backed). Show that naive joins would produce a different (biased) training set compared to point-in-time joins on the same data. Deploy a simple model that uses online feature lookup at inference time. Document the skew problem and how point-in-time joins solve it.

Evaluation rubric (what recruiters check on your GitHub)

9. Train a diffusion model from scratch on a curated image dataset

Difficulty · Advanced 50-75 hours PyTorchtorchvisionHugging Face Diffusers (as reference)W&BNVIDIA GPU (H100 or A100 recommended)

Train a DDPM (Denoising Diffusion Probabilistic Model) or DDIM from scratch on a narrow, well-defined image domain you curate — pixel art, satellite imagery, medical images, or product photography. Implement the forward (noising) and reverse (denoising) processes, the noise prediction network (a UNet), and the sampling loop. Evaluate with FID score on a held-out test set. Track training in W&B. Ablate the number of diffusion timesteps (100 vs 500 vs 1000) and the noise schedule (linear vs cosine). This project demonstrates the mathematical depth of generative model training.

Evaluation rubric (what recruiters check on your GitHub)

10. Experiment tracking dashboard — replay and compare runs

Difficulty · Intermediate 25-35 hours W&B API / MLflow Python APIStreamlit or Plotly DashpandasOptuna

Build a custom experiment tracking dashboard that aggregates runs from W&B, MLflow, or both, and surfaces actionable comparisons. Features: hyperparameter importance analysis (Optuna's fANOVA or a simpler correlation sweep), run comparison with delta-metric highlighting, learning curve smoothing, best-checkpoint selection by eval metric. The goal is a tool you actually want to use for your other projects. This demonstrates software engineering taste alongside ML knowledge.

Evaluation rubric (what recruiters check on your GitHub)

11. Build a retrieval-augmented evaluation harness for LLMs

Difficulty · Intermediate 30-45 hours Hugging Face Transformers + EvaluateLM Evaluation Harness (EleutherAI)pgvector / ChromaW&BFastAPI

Build an evaluation harness for an LLM that integrates retrieval. The eval harness should: (1) run a suite of benchmark tasks against a model, (2) compare retrieval-augmented vs non-augmented performance, (3) run LLM-as-judge scoring on open-ended outputs, and (4) track results across model versions in W&B. Make the harness model-agnostic so you can plug in different checkpoints. This project demonstrates evaluation engineering — one of the highest-signal skills in 2026 ML hiring.

Evaluation rubric (what recruiters check on your GitHub)

12. MLOps pipeline — automated retraining with drift detection and rollback

Difficulty · Advanced 50-70 hours ZenML or MetaflowEvidently AI (drift detection)MLflow (model registry)FastAPIPrometheus + GrafanaDocker Compose

Build a complete MLOps pipeline that monitors a deployed model, detects data drift, triggers automated retraining when drift exceeds a threshold, evaluates the retrained model against the champion, and promotes the challenger only if it passes regression gates. Implement rollback that restores the previous model version in under 2 minutes. Use ZenML or Metaflow for pipeline orchestration. Deploy to Docker Compose on a VPS. This is the graduation project for the MLOps section and demonstrates production-grade ML engineering.

Evaluation rubric (what recruiters check on your GitHub)

13. GPU kernel optimisation — implement flash attention in Triton

Difficulty · Expert 50-80 hours Triton (OpenAI)PyTorchNVIDIA Nsight ComputeCUDA C++ (for the naive baseline)

Implement the forward pass of flash attention in Triton (the Python-embedded GPU kernel language). Start with a naive attention baseline in CUDA. Profile with Nsight Compute to identify the memory-bandwidth bottleneck. Implement the tiled, IO-aware forward pass from the FlashAttention-2 paper. Benchmark your kernel against torch.nn.functional.scaled_dot_product_attention and the reference flash-attn package on sequence lengths 512, 1024, 4096, and 8192. This project puts you in the top 5% of ML Engineer candidates. Treat it as an optional stretch goal; attempt only after the core portfolio is complete.

Evaluation rubric (what recruiters check on your GitHub)

14. End-to-end ML system — train, serve, monitor, and retrain

Difficulty · Advanced 70-100 hours PyTorch + Hugging Face (training)vLLM or Ray Serve (serving)Evidently (monitoring)ZenML or Metaflow (pipeline)FastAPI + Docker Compose (API + infra)

Capstone. Build a complete ML system on a problem you define: a recommender, a ranker, a classifier, or a generative model. The system must train on a real dataset, serve predictions behind an API endpoint at sub-200ms p99 latency, log prediction distributions for drift monitoring, and have a retraining pipeline that can be triggered by a data volume threshold or a schedule. Deploy to a VPS. Add a public-facing demo. Write a 2000-word technical post-mortem. The capstone is the project you demo in interviews — it should be something you can talk about for 45 minutes.

Evaluation rubric (what recruiters check on your GitHub)

Frequently asked questions

How many of these projects should I actually complete?

Eight to ten. Four or five of them should be Advanced difficulty. The GPU kernel project is an optional stretch goal — attempt it only after the core portfolio is complete and you want to differentiate further. Employers will read three in depth and skim the rest.

Should I prioritise breadth or depth?

Depth for two or three core projects, breadth for the rest. The transformer-from-scratch and distributed-training projects are the ones interviewers will ask you to walk through line-by-line. Those deserve 60-80 hours. The others can be lighter.

Can I use Hugging Face for everything?

No. The transformer-from-scratch, custom-optimiser, and paper-reproduction projects require building things that the library provides for you. The learning value is in the building. Hugging Face is appropriate for fine-tuning projects and for anything downstream of those foundational projects.

How important are the numbers in each project?

Very. 'I trained a model' is a weak signal. 'I trained a transformer that reaches 1.48 nats on TinyShakespeare, matching nanoGPT within 2%, with an ablation showing cosine schedule outperforms linear by 0.08 nats' is a strong signal. Every project should have a quantified result.

Do these projects need to be on a GPU cloud to count?

Yes for the distributed training, diffusion model, and fine-tuning projects — there is no substitute for actually running on multi-GPU hardware. For the others, a single Colab GPU is sufficient. Budget your GPU spend: the three GPU-heavy projects together need about $80-150 of cloud GPU time.

Should I open-source all of these?

Yes. Public GitHub, with a polished README, W&B report link, and a live demo URL where applicable. ML Engineers who demo their work directly are materially more likely to pass phone screens than those who only describe it.

Is the Kaggle top-10% signal meaningful for ML Engineer roles?

More than for generalist roles. ML Engineer interviewers at hyperscalers are often former Kagglers themselves and recognise competition-specific skills (ensembling, leak detection, feature-engineering on edge cases). A top-10% finish on a named competition is worth mentioning; a gold medal is a hard differentiator.

Continue on the ML Engineer track