The following demo shows the Airflow UI with all orchestrated DAGs available:
- Training Pipeline DAG β submits training jobs and logs results in MLflow.
- Hyperparameter Tuning DAG β runs Optuna optimization for XGBoost.
- Batch Prediction DAG β generates daily predictions.
- Monitoring DAG β runs Evidently drift detection and can trigger retraining.
- Promotion DAG β promotes models from staging to production.
(GIF captured with ScreenToGif.)
- π₯ Demo
- 1. Project Overview
- 2. Architecture
- 3. Prerequisites
- 4. Setup & Installation
- 5. Repository Structure
- 6. Project Components
- 7. CI/CD Pipeline
- 8. Testing & Quality Checks
- 9. How to Run the Project
- 10. Results & Monitoring
- 11. Makefile Reference
- 12. Future Improvements
- 13. Security & Contributions
- 14. Troubleshooting
- 15. Acknowledgments
Financial institutions face significant risk when issuing loans, as defaults can lead to major losses. Being able to predict the likelihood of loan default before issuing credit allows lenders to make better decisions, reduce risk exposure, and maintain healthier loan portfolios.
This project implements a production-grade MLOps pipeline to automate the full lifecycle of a loan default prediction model β from data preparation and training to deployment, monitoring, and continuous improvement. The pipeline is designed to be scalable, reproducible, and cloud-native, following best practices in modern machine learning operations.
-
Source: LendingClub loan dataset (public loan default dataset widely used in risk modeling).
-
Data Location: Stored in GCS (
gs://loan-default-artifacts-loan-default-mlops/data/loan_default_selected_features_clean.csv). -
Features: 20 predictive features including applicant financial attributes (loan amount, annual income, DTI ratio, credit history length, number of open accounts, revolving balance, etc.).
-
Target Variable:
-
loan_statusβ Binary classification1= Loan defaulted0= Loan fully paid
-
- Risk Mitigation β Identify high-risk loan applications early.
- Operational Efficiency β Automate model training, deployment, and monitoring to reduce manual effort.
- Scalability β Leverage cloud infrastructure to handle large-scale data and model workloads.
- Continuous Improvement β Monitor performance drift and trigger retraining when needed.
- Training & Tuning β Automated hyperparameter tuning with Optuna and scalable training jobs on Vertex AI.
- Experiment Tracking & Registry β MLflow for logging experiments, metrics, artifacts, and versioned models.
- Deployment β Batch and real-time model serving with Docker and Cloud Run.
- Monitoring β Evidently AI for detecting data drift and target drift in production.
- CI/CD β GitHub Actions pipelines for automated testing, integration, and deployment; local CI simulation for reproducibility.
- Infrastructure as Code (IaC) β Terraform for provisioning GCP resources in a consistent, reproducible manner.
- Orchestration β Apache Airflow
- Experiment Tracking & Registry β MLflow
- Deployment β Docker + GCP Cloud Run
- Monitoring β Evidently AI
- CI/CD β GitHub Actions + Local CI simulation
- Infrastructure as Code β Terraform
- Cloud β Google Cloud Platform (GCS, Artifact Registry, Vertex AI, Cloud Run)
The project is built as a modular MLOps pipeline where each component handles a specific part of the ML lifecycle β from data ingestion and training to deployment, monitoring, and automated retraining.
graph TD
subgraph Dev ["Local Dev / Codespaces"]
A[Developer] -->|Code + DAGs| B["Airflow + MLflow (Docker Compose)"]
A -->|Push to Repo| G[GitHub]
end
G[GitHub] -->|CI/CD Workflows| H[GitHub Actions]
H -->|Provision Infra| T[Terraform]
H -->|Build + Push| R[Artifact Registry]
subgraph GCP ["Google Cloud Platform"]
T --> BKT["GCS Bucket: Data, Artifacts, Reports"]
R --> CR["Cloud Run: Model Serving"]
T --> ML["MLflow Tracking Server (Cloud Run)"]
T --> VA["Vertex AI Training Jobs"]
end
B -->|Sync Artifacts| BKT
ML -->|Store Experiments| BKT
CR -->|Batch Predictions| BKT
BKT --> MON["Evidently Drift Monitoring"]
MON -->|Trigger Retrain| VA
βΉοΈ Note: MLflow appears in both environments. β’ Locally, MLflow runs in Docker Compose (alongside Airflow) for dev and testing. β’ In production, MLflow is deployed on Cloud Run with GCS as the backend store.
-
Apache Airflow
- Orchestrates the end-to-end ML workflows (training, tuning, batch prediction, monitoring, promotion).
- DAGs trigger Vertex AI jobs, batch predictions, and Evidently monitoring.
-
MLflow
- Experiment tracking (metrics, artifacts, models).
- Model registry with Staging β Production lifecycle.
- Deployed both locally (Docker) and on Cloud Run with GCS artifact storage.
-
Docker + Cloud Run
- Dockerfiles for training, serving, and MLflow.
- Models served via Cloud Run API for real-time predictions.
-
Google Cloud Storage (GCS)
-
Centralized storage for:
- Training data.
- Model artifacts (Optuna params, metrics, plots).
- Batch prediction outputs.
- Evidently monitoring reports.
-
-
Vertex AI
- Runs training jobs using the custom trainer image.
- Integrates with MLflow for logging experiments and registering models.
-
Evidently AI
- Compares training dataset with new predictions.
- Detects data drift and target drift.
- If drift is detected, triggers retraining via Airflow DAG.
-
Terraform
-
Infrastructure-as-Code provisioning:
- GCS bucket.
- Artifact Registry.
- MLflow Cloud Run service + IAM.
- Networking & permissions.
-
-
GitHub Actions (CI/CD)
- CI Pipeline: Lint, unit tests, formatting checks.
- Integration Pipeline: Full stack startup, health checks, integration tests.
- CD Pipeline: Builds and pushes trainer images to Artifact Registry.
To run this project locally or on the cloud, ensure you have the following tools installed:
-
Docker β
>= 24.x -
Docker Compose β
>= 2.x- Often bundled with Docker Desktop.
-
Python β
3.10(recommended for compatibility) -
Terraform β
>= 1.5.0 -
Google Cloud CLI (
gcloud) β>= 456.x- Required for authentication, Artifact Registry, and Vertex AI.
- Install gcloud
-
Make (GNU Make) β
>= 4.3- Pre-installed on most Linux/macOS; Windows users can install via WSL or Git Bash.
Before running on Google Cloud:
-
Create a GCP project (e.g.,
loan-default-mlops). -
Enable the following APIs:
storage.googleapis.comrun.googleapis.comaiplatform.googleapis.comartifactregistry.googleapis.comsqladmin.googleapis.com
-
Create a service account with roles:
roles/storage.adminroles/artifactregistry.adminroles/aiplatform.adminroles/run.admin
-
Download the service account key and place it at:
keys/gcs-service-account.json airflow/keys/gcs-service-account.json
Follow the steps below to set up the project locally and prepare it for deployment to Google Cloud.
git clone https://github.com/your-org/loan_default_prediction.git
cd loan_default_predictionCopy the example environment file and update values as needed:
cp .env.example .envKey variables in .env:
- GCS_BUCKET β GCS bucket name for storing artifacts, predictions, reports.
- MLFLOW_TRACKING_URI β MLflow tracking server URL.
- TRAIN_DATA_PATH β Path to training dataset (CSV in GCS).
- PREDICTION_INPUT_PATH β Batch input data path.
- PREDICTION_OUTPUT_PATH β Where batch predictions will be saved.
- PROMOTION_AUC_THRESHOLD β Metric threshold for auto-promotion.
- SLACK_WEBHOOK_URL / ALERT_EMAILS β For monitoring alerts.
Create a GCP service account with roles:
roles/storage.adminroles/artifactregistry.adminroles/aiplatform.adminroles/run.admin
Download the JSON key and place it in:
keys/gcs-service-account.json
airflow/keys/gcs-service-account.json
Set up Python dependencies locally (for testing and CI/CD tooling):
make installThis installs:
- Core ML libs (
scikit-learn,xgboost,pandas, etc.) - MLflow
- Evidently AI
- Dev tools (pytest, flake8, black, isort, mypy)
Spin up Airflow + MLflow + Serving API with Docker Compose:
make startOnce running, access the services at:
- Airflow UI β http://localhost:8080
- MLflow UI β http://localhost:5000
- Serve API β http://localhost:5001
Run the built-in verification:
make verifyExpected outputs:
- Airflow version + healthy UI.
- DAGs mounted in Airflow.
- MLflow logs accessible.
- Serving API responding.
The repo follows a clean structure that separates orchestration, infrastructure, source code, and CI/CD.
.
βββ airflow/ # Airflow orchestration
β βββ dags/ # DAGs: training, tuning, prediction, monitoring, promotion
β βββ docker-compose.yaml# Local stack (Airflow, MLflow, DB, Serve)
β βββ artifacts/ # Prediction outputs, Optuna params, monitoring reports (gitignored)
β βββ logs/ # Airflow logs (gitignored)
β βββ keys/ # Service account (gitignored)
β βββ tmp/ # Temp files (gitignored)
β
βββ infra/terraform/ # Terraform IaC
β βββ main.tf # GCS bucket + lifecycle rules
β βββ cloudrun.tf # MLflow Cloud Run, Artifact Registry, IAM
β βββ variables.tf # Configurable variables
β βββ outputs.tf # Export bucket + MLflow URLs
β βββ terraform.tfvars # Env-specific vars (gitignored)
β βββ .terraform/ # Terraform state (gitignored)
β
βββ src/ # ML source code
β βββ train_with_mlflow.py # Train & log to MLflow
β βββ tune_xgboost_with_optuna.py # Optuna tuning
β βββ batch_predict.py # Batch inference
β βββ monitor_predictions.py # Evidently drift monitoring
β βββ predict.py # Real-time inference
β βββ ingest_vertex_run.py # Ingest Vertex AI outputs
β βββ utils.py # Utility helpers
β
βββ scripts/ # Helper scripts
β βββ test_ci_local.sh # Local CI/CD simulation
β βββ troubleshoot.sh # Diagnostics
β βββ start/stop_all.sh # Start/stop automation
β
βββ tests/ # Unit & integration tests
β βββ test_utils.py
β βββ test_prediction_integration.py
β βββ test_batch_prediction_integration.py
β
βββ MLflow/ # MLflow custom Docker image
β βββ Dockerfile.mlflow
β βββ requirements.mlflow.txt
β βββ tracking_entrypoint.sh
β
βββ data/ # Data (samples only, large data ignored)
β βββ loan_default_selected_features_clean.csv
β βββ batch_input.csv
β βββ sample_input.json
β
βββ docs/ # Documentation assets
β βββ images/ # Screenshots + demo GIFs
β β βββ airflow_train_pipeline.gif
β β βββ batch_prediction_dag.png
β βββ *.png # DAG screenshots + Vertex AI logs
β
βββ .github/workflows/ # GitHub Actions CI/CD
β βββ ci.yml # Lint + unit tests
β βββ integration-cd.yml # Integration tests + deploy
β
βββ artifacts/ # MLflow + prediction artifacts (gitignored)
βββ mlruns/ # Local MLflow runs (gitignored, kept in GCS in production)
βββ keys/ # Global service account key (gitignored)
βββ Makefile # One-stop automation: setup, test, deploy
βββ requirements.txt # Core dependencies
βββ requirements-*.txt # Env-specific deps (dev, serve, airflow, monitoring, vertex)
βββ SECURITY_AND_CONTRIBUTING.md
βββ TROUBLESHOOTING.md
βββ README.md
- Secrets β
.env,keys/,airflow/keys/,*.json(except small samples). - Logs & Artifacts β
airflow/logs/,mlruns/,artifacts/,predictions_*.csv. - Large Data β
data/*(only small sample files are versioned). - Terraform State β
.terraform/,terraform.tfstate*,terraform.tfvars. - OS/Editor Junk β
.DS_Store,.vscode/,.idea/, swap files. - Cache β
__pycache__/,.pytest_cache/,.coverage.
This project is composed of several modular components that work together to automate the end-to-end ML lifecycle.
Airflow orchestrates the ML workflows through a set of DAGs:
-
tune_hyperparams_dag.pyβ Runs Optuna to tune XGBoost hyperparameters, saves best parameters and study DB to GCS. -
train_pipeline_dag.pyβ Weekly training pipeline:- Submits Vertex AI training job using best params.
- Ingests results into MLflow.
- Decides whether to promote model (based on AUC/F1 thresholds).
- Triggers batch prediction after training.
-
batch_prediction_dag.pyβ Daily batch inference using the latest MLflow model alias (staging/production), saves predictions to GCS. -
promote_model_dag.pyβ Promotes model from staging β production in MLflow, sends Slack + email notifications. -
monitoring_dag.pyβ Runs Evidently drift detection daily; if drift is detected, retrains viatrain_pipeline_dag.
Hyperparameter Tuning DAG
Expanded view with task details:

Batch Prediction DAG
- Tracks experiments, metrics, artifacts, and models.
- Registry supports staging β production promotion.
- Backend: Postgres (local), GCS (cloud).
- Provisions GCS bucket for data, artifacts, and reports.
- Creates Artifact Registry for trainer + MLflow images.
- Deploys MLflow server on Cloud Run.
- Configures IAM roles and service accounts.
- Compares training dataset vs latest batch predictions.
- Generates JSON + HTML drift reports.
- Stores reports in GCS and triggers retraining if drift is detected.
flowchart TD
TUNE[Tune Hyperparameters] --> TRAIN["Train Pipeline (Vertex AI)"]
TRAIN --> DECIDE{Promotion?}
DECIDE -->|Pass| PROMOTE[Promote Model]
DECIDE -->|Fail| SKIP[Skip Promotion]
PROMOTE --> BATCH[Batch Prediction]
SKIP --> BATCH
BATCH --> MONITOR["Monitoring DAG (Evidently)"]
MONITOR -->|No Drift| END([End])
MONITOR -->|Drift Detected| TRAIN
This project follows a two-tier CI/CD strategy:
-
Continuous Integration (CI) β Run automatically on every push/PR to
main.- Code quality checks (linting, formatting).
- Unit tests (
pytest -m "not integration"). - Fails fast if issues are found.
-
Integration + Continuous Deployment (CD) β Run manually or on
mainbranch merges.- Spins up the full Airflow + MLflow + Serve stack inside Docker.
- Runs integration tests against batch and real-time predictions.
- If successful β builds & pushes trainer image to Artifact Registry.
-
Local CI Simulation β Developers can replicate the same pipeline locally with
make ci-local.- Runs lint, formatting, unit tests.
- Spins up containers, checks health, runs integration tests.
- Optional local CD (
make deploy-trainer).
flowchart LR
C[Commit / PR to Main] --> CI[GitHub Actions CI Workflow]
CI --> L[Lint + Format Checks]
CI --> U[Unit Tests]
L -->|Fail| X[Stop β]
U -->|Fail| X
L -->|Pass| INT[Integration/CD Workflow]
U -->|Pass| INT
INT --> D[Start Airflow + MLflow Stack]
D --> IT[Run Integration Tests]
IT -->|Fail| X
IT -->|Pass| DEPLOY[Build + Push Trainer Image]
DEPLOY --> GCP[Artifact Registry + Vertex AI]
-
ci.yml-
Trigger: push/PR to
main. -
Steps:
- Install dependencies.
- Check formatting (
black,isort). - Lint (
flake8). - Run unit tests only.
-
-
integration-cd.yml-
Trigger: manual (
workflow_dispatch) or after integration passes. -
Steps:
- Build Docker images.
- Start Postgres + Airflow + MLflow.
- Health checks for services.
- Bootstrap MLflow with dummy model.
- Run integration tests (batch + real-time).
- If on
mainβ build & push trainer image to Artifact Registry.
-
Run the entire CI/CD process locally:
make ci-localThis executes scripts/test_ci_local.sh, which:
- Runs lint + formatting checks.
- Runs unit tests.
- Spins up Postgres + Airflow + MLflow.
- Ensures MLflow DB exists.
- Starts stack, checks health.
- Boots a dummy model in MLflow.
- Starts Serve API.
- Runs integration tests.
- Optional: deploy trainer image with
CD=1 make ci-local.
Ensuring code quality and reproducibility is a critical part of the pipeline. This project enforces multiple levels of testing and static analysis.
-
Located in
tests/. -
Lightweight checks for utility functions and components.
-
Example:
tests/test_utils.pyβ verifies utility functions likeadd_numbers().
Run unit tests only:
pytest -m "not integration" -v-
Validate the end-to-end pipeline inside the Airflow + MLflow stack.
-
Test scenarios include:
- Batch prediction test (
test_batch_prediction_integration.py) β ensures batch inference runs and saves predictions. - Real-time prediction test (
test_prediction_integration.py) β checks Serve API responds with valid predictions.
- Batch prediction test (
Run integration tests locally:
make integration-testsThese tests are also executed in GitHub Actions via the integration-cd.yml workflow.
- Enforced via Flake8.
- Ensures Python code adheres to PEP8 and project style guidelines.
make lint- Black β auto-formats code to consistent style.
- isort β ensures consistent import ordering.
Check formatting (CI/CD safe):
make check-formatFormat automatically:
make format- Enforced via mypy.
- Ensures static typing coverage in source code.
mypy src- pytest-cov enabled in dev dependencies.
- Generates test coverage reports locally:
pytest --cov=src tests/With these checks in place, the project guarantees:
- Code correctness (unit tests).
- Pipeline reliability (integration tests).
- Consistent style (lint/format).
- Type safety (mypy).
- Maintainability and reproducibility (coverage).
The project can be run in two modes:
- Locally with Docker Compose β for development and testing.
- On Google Cloud (production-ready) β with Terraform-managed infrastructure.
-
Start the full stack (Airflow + MLflow + Serve):
make start
-
Access services:
- Airflow β http://localhost:8080
- MLflow β http://localhost:5000
- Serve API β http://localhost:5001
-
Run unit + integration tests:
make test # unit tests make integration-tests # integration tests inside containers
-
Trigger Airflow DAGs manually:
-
Open Airflow UI (
localhost:8080). -
Enable and run DAGs:
tune_hyperparams_dagtrain_pipeline_dagbatch_prediction_dagmonitoring_dag
-
-
Provision infrastructure with Terraform:
make terraform-init make terraform-apply
This creates:
- GCS bucket (for data, artifacts, reports).
- Artifact Registry (for trainer + MLflow images).
- Cloud Run MLflow service.
- IAM service accounts + permissions.
-
Verify outputs: Terraform will print:
bucket_urlβ where artifacts are stored.mlflow_urlβ Cloud Run endpoint for MLflow tracking server.
-
Build and push trainer image:
make trainer
This builds the
loan-default-trainerimage and pushes it to Artifact Registry. -
Run training on Vertex AI (via Airflow
train_pipeline_dag):- Airflow submits a Vertex AI training job using the trainer image.
- Results are ingested into MLflow automatically.
-
Batch predictions:
-
Airflow runs
batch_prediction_dag. -
Predictions are written to:
gs://<your-bucket>/predictions/predictions.csv
-
-
Monitoring & retraining:
-
Airflow runs
monitoring_dag. -
Evidently compares training vs latest predictions.
-
Drift reports are stored in GCS under:
gs://<your-bucket>/reports/ -
If drift detected β
train_pipeline_dagis triggered automatically.
-
When youβre done, destroy resources to avoid costs:
make terraform-destroyThis section highlights the outputs of the ML pipeline and how monitoring ensures continuous model performance.
-
The DAG
tune_hyperparams_dagruns Optuna to optimize XGBoost hyperparameters. -
Best params are saved to:
- Local:
airflow/artifacts/best_xgb_params.json - GCS:
gs://<bucket>/artifacts/best_xgb_params.json
- Local:
-
Example:
{
"max_depth": 7,
"learning_rate": 0.12,
"n_estimators": 350,
"subsample": 0.85,
"colsample_bytree": 0.75
}-
Models are trained weekly via
train_pipeline_dagon Vertex AI. -
Runs are logged in MLflow with:
- Metrics:
AUC,F1,Precision,Recall. - Artifacts: feature importance plots, confusion matrix, ROC curves.
- Model versions: promoted from staging β production if thresholds met (
AUC β₯ 0.75).
- Metrics:
MLflow UI (local): http://localhost:5000
MLflow UI (cloud): <mlflow_url> from Terraform outputs
- Generated daily by
batch_prediction_dag. - Predictions written to:
gs://<bucket>/predictions/predictions.csv- A marker file tracks latest prediction path:
airflow/artifacts/latest_prediction.json- Drift reports generated daily by
monitoring_dag. - Compares training data vs latest predictions.
- Outputs both JSON + HTML reports:
gs://<bucket>/reports/monitoring_report_<timestamp>.json
gs://<bucket>/reports/monitoring_report_<timestamp>.html-
Example drift report metrics:
- Data Drift β % of features with distribution shift.
- Target Drift β Stability of loan default predictions over time.
sequenceDiagram
participant Train as Training Data
participant Batch as Batch Predictions
participant Evidently as Evidently Reports
participant Airflow as Airflow DAG
participant GCS as GCS Bucket
Train->>Evidently: Provide reference dataset
Batch->>Evidently: Provide current batch
Evidently->>Evidently: Compute data & target drift
Evidently-->>GCS: Save JSON + HTML reports
Evidently-->>Airflow: Write drift_status.json
Airflow-->>Airflow: If drift detected β Trigger retraining
The project uses a Makefile to automate common developer and CI/CD tasks. Below are the most important targets grouped by purpose.
installβ Install project and dev dependencies.lintβ Run flake8 for linting.formatβ Auto-format code with black + isort.check-formatβ Verify formatting without changing files.testβ Run unit tests with pytest.
startβ Start the full Airflow + MLflow + Serve stack.stopβ Stop all services (containers paused).downβ Stop and remove containers + networks.start-coreβ Start only core services (Postgres, Airflow webserver + scheduler, MLflow).stop-coreβ Stop core services.stop-hardβ Full clean-up (containers, volumes, logs, artifacts).
start-serveβ Start the model serving API.stop-serveβ Stop serving API.restart-serveβ Restart serving API.
integration-testsβ Run integration tests inside Airflow/MLflow containers.ci-localβ Run local CI/CD simulation (scripts/test_ci_local.sh).
terraform-initβ Initialize Terraform.terraform-planβ Preview infrastructure changes.terraform-applyβ Apply Terraform plan (create/update infra).terraform-destroyβ Tear down all provisioned resources.
resetβ Reset stack (rebuild using cached layers).fresh-resetβ Reset stack with no cache (force rebuild).verifyβ Verify health of Airflow + MLflow + Serve.troubleshootβ Run diagnostics (logs, health checks, variables).
build-trainerβ Build Vertex AI trainer Docker image.push-trainerβ Push trainer image to Artifact Registry.trainerβ Build + push trainer image (shortcut).deploy-trainerβ Build + push trainer, set image URI in Airflow.build-mlflowβ Build custom MLflow Docker image.bootstrap-allβ Full rebuild: MLflow + trainer + Airflow stack.
While the current pipeline is production-ready, there are several enhancements that can make it more robust, scalable, and enterprise-grade:
-
Automate full continuous retraining loop with Airflow:
- Drift detection β retrain β evaluate β promote β redeploy.
-
Add canary deployment strategy for new models (A/B testing before full promotion).
- Integrate WhyLogs or Prometheus + Grafana for richer monitoring.
- Add real-time drift detection on streaming data, not just batch.
- Expand alerting integrations (Slack, email, PagerDuty) beyond the current Airflow notifications.
- Expand Vertex AI Pipelines integration to orchestrate end-to-end workflows natively on GCP.
- Deploy serving API with GKE (Kubernetes) or Vertex AI Prediction for scale-out serving.
- Store logs/metrics in BigQuery for auditing and analysis.
- Integrate with a Feature Store (e.g., Feast) for consistent offline/online feature parity.
- Add data versioning (DVC or Delta Lake) for reproducibility.
-
Expand test coverage with:
- Load tests for prediction API.
- Chaos tests for Airflow resilience.
- End-to-end regression suites.
-
Enable scheduled nightly CI runs with smoke tests against staging environment.
- Add pre-commit hooks for lint/format checks before commits.
- Publish Docker images (trainer, MLflow, monitor) to a public registry for faster onboarding.
- Expand documentation in a
/docsfolder with DAG-specific diagrams and usage guides.
This project follows security best practices:
- Secrets (GCP keys,
.env) are not committed to git (enforced via.gitignore). - Service accounts are scoped with least privilege (
roles/storage.admin,roles/aiplatform.admin, etc.). - Terraform provisions infra in a reproducible, auditable way.
For detailed contribution guidelines and security reporting, see: π SECURITY_AND_CONTRIBUTING.md
Common issues and quick fixes:
-
Airflow logs directory not writable
make fix-perms
-
MLflow volume permissions issue
make fix-mlflow-volume
-
Reset full stack (cached build)
make reset
-
Reset full stack (no cache)
make fresh-reset
-
Verify services are running
make verify
For a comprehensive list of real-world error messages and fixes (with exact stack traces), see: π TROUBLESHOOTING.md
I would like to sincerely thank the following for their guidance, encouragement, and inspiration throughout the course of this project:
- The DataTalks.Club mentors and peers β their instructions and feedback provided invaluable insights.
- The broader Data Science and MLOps community β for sharing knowledge and best practices that shaped my approach.
- Family and friends β for their unwavering support and patience during the many long hours dedicated to building and refining this project.




