{"id":32693047,"url":"https://github.com/willyfh/mlops-workflow","last_synced_at":"2026-04-13T15:32:04.401Z","repository":{"id":320881205,"uuid":"1083636569","full_name":"willyfh/mlops-workflow","owner":"willyfh","description":"An MLOps workflow for training, inference, experiment tracking, model registry, and deployment.","archived":false,"fork":false,"pushed_at":"2025-11-23T00:55:59.000Z","size":77,"stargazers_count":14,"open_issues_count":0,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-23T02:21:13.583Z","etag":null,"topics":["deployment","experiment-tracking","fastapi","machine-learning","minio","ml-inference","ml-training","mlflow","mlops","postgresql","pytorch"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/willyfh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-26T12:37:51.000Z","updated_at":"2025-11-23T00:54:39.000Z","dependencies_parsed_at":"2025-10-26T15:23:03.328Z","dependency_job_id":null,"html_url":"https://github.com/willyfh/mlops-workflow","commit_stats":null,"previous_names":["willyfh/mlops-workflow"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/willyfh/mlops-workflow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willyfh%2Fmlops-workflow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willyfh%2Fmlops-workflow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willyfh%2Fmlops-workflow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willyfh%2Fmlops-workflow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/willyfh","download_url":"https://codeload.github.com/willyfh/mlops-workflow/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willyfh%2Fmlops-workflow/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31759305,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T15:25:13.801Z","status":"ssl_error","status_checked_at":"2026-04-13T15:25:09.162Z","response_time":93,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["deployment","experiment-tracking","fastapi","machine-learning","minio","ml-inference","ml-training","mlflow","mlops","postgresql","pytorch"],"created_at":"2025-11-01T16:02:46.769Z","updated_at":"2026-04-13T15:32:04.393Z","avatar_url":"https://github.com/willyfh.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ⚙ MLOps Workflow\n\n[![python 3.10](https://img.shields.io/badge/python-3.10-blue)](https://www.python.org/downloads/release/python-3100/)\n[![python 3.11](https://img.shields.io/badge/python-3.11-blue)](https://www.python.org/downloads/release/python-3110/)\n[![python 3.12](https://img.shields.io/badge/python-3.12-blue)](https://www.python.org/downloads/release/python-3120/)\n[![Run Tests](https://github.com/willyfh/mlops-workflow/actions/workflows/ci-checks.yaml/badge.svg)](https://github.com/willyfh/mlops-workflow/actions/workflows/ci-checks.yaml)\n[![codecov](https://codecov.io/gh/willyfh/mlops-workflow/graph/badge.svg?token=OGLCMT2KQ4)](https://codecov.io/gh/willyfh/mlops-workflow)\n[![MIT License](https://img.shields.io/badge/License-MIT-yellow)](https://opensource.org/licenses/MIT)\n\nA modular MLOps workflow for training, inference, experiment tracking, model registry, and deployment.\nBuilt with FastAPI, MLflow, MinIO, and PostgreSQL for scalable machine learning operations.\n\n![image](https://github.com/user-attachments/assets/246750fb-5da8-4285-99c9-bf819d1a8bca)\n\n## Features\n\n- Supports concurrent (non-blocking) model training and inference requests via FastAPI\n- MLflow for experiment tracking\n- MinIO for artifact storage\n- PostgreSQL for metadata and experiment storage\n- Hydra for modular config\n- Pydantic for config validation\n- Docker Compose for easy deployment\n- Pre-commit hooks for code quality\n- Unit and integration tests\n\n---\n\n## Prerequisites\n\n- Docker\n- Nvidia container toolkit (optional, for GPU)\n  - [Install Guide](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html)\n\n### GPU/CPU Configuration\n\n- If you don’t want to use GPU, update your `.env` file:\n\n  ```env\n  NVIDIA_VISIBLE_DEVICES=\n  NVIDIA_RUNTIME=\n  ```\n\n- If you want to use GPU:\n\n  ```env\n  NVIDIA_VISIBLE_DEVICES=all\n  NVIDIA_RUNTIME=nvidia\n  ```\n\n---\n\n## Installation \u0026 Usage\n\n### Docker Compose\n\n#### 1. Build and start containers\n\n```sh\ndocker compose build\ndocker compose up\n```\n\n#### 2. Login to MinIO\n\n[http://localhost:9001/login](http://localhost:9001/login)\n\n- User: minioadmin\n- Password: minioadmin (defined in `.env`)\n\n#### 3. Create and copy access keys\n\n- Create and copy the access keys\n- Update `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` in `.env`\n\n#### 4. Restart containers\n\n```sh\ndocker compose up\n```\n\n#### 5. For training (from host)\n\n```sh\ncurl -X POST -F \"config_file=@backend/conf/config.yaml\" \\\n  http://localhost:8000/api/v1/run_train\n```\n\n#### 6. For inference\n\n`\u003crun_id\u003e` refers to the MLflow run ID\n\n```sh\ncurl -X POST -H \"Content-Type: application/json\" -d '{\n\"image_data\": \"'\"$(base64 -w 0 backend/tests/assets/3.png)\"'\"'\n}' http://localhost:8000/api/v1/run_inference/run_id/\u003crun_id\u003e\n```\n\n---\n\n## Service URLs\n\nHere are the main web interfaces and endpoints you can access:\n\n- **FastAPI API \u0026 Docs**\n  - API root: [http://localhost:8000/api/v1/](http://localhost:8000/api/v1/)\n  - Swagger UI: [http://localhost:8000/docs](http://localhost:8000/docs)\n  - ReDoc: [http://localhost:8000/redoc](http://localhost:8000/redoc)\n\n- **MLflow Tracking UI**\n  - [http://localhost:5000](http://localhost:5000)\n\n- **MinIO Console**\n  - [http://localhost:9001/login](http://localhost:9001/login)\n\n- **PostgreSQL**\n  - Accessible via database clients at localhost:5432 (no web UI)\n\n---\n\n## Notes\n\n- For GPU support, ensure Nvidia container toolkit is installed and configured.\n- This project uses [uv](https://github.com/astral-sh/uv) as the Python dependency manager inside Docker containers\n\n## Disclaimer\n\nThis repository is intended as a minimal, educational template or starter kit for machine learning workflows. The training logic and architecture are kept simple for clarity and ease of use. For production or research use, you are encouraged to extend and customize the code to fit your requirements.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwillyfh%2Fmlops-workflow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwillyfh%2Fmlops-workflow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwillyfh%2Fmlops-workflow/lists"}