Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
c553e1e
build(healthcheck): Add healtcheck endpoint for API
NicolasLacroix Oct 30, 2025
ffa1520
feat(parser): Add dspipelines parser
NicolasLacroix Jan 30, 2026
fc761c2
feat(profiling): Add support for external taxonomies (provided by the…
NicolasLacroix Jan 30, 2026
f2ca2b5
docs(changelog): Update changelog with recent changes
NicolasLacroix Jan 30, 2026
9c33175
refactor(docker): Add docker-related files to docker/ and add grafana…
NicolasLacroix Jan 30, 2026
f84e0ee
docs(demo): Add demo and remove old cli
NicolasLacroix Jan 30, 2026
870cb9f
feat(profiling): Improve inference prompt templates and update docker…
NicolasLacroix Mar 4, 2026
0decc82
feat(profiling): Add support for unified taxonomy
NicolasLacroix Mar 9, 2026
84398de
feat(profiling): Add support for expected class (used with llm profil…
NicolasLacroix Mar 11, 2026
867c6e1
feat(profiling): Add context offset for llm profiler
NicolasLacroix Mar 11, 2026
d9461b0
feat(profiling): Add ability to provide expected result in the prompt
NicolasLacroix Mar 12, 2026
5748b4b
feat(parser): Update dspipelines parser to support subscript instruct…
NicolasLacroix Mar 25, 2026
1ea750e
feat(profiling): Add experimental version of embedding-based classifier
NicolasLacroix Mar 30, 2026
25cd212
feat(parser): Add /parser endpoint
NicolasLacroix Apr 2, 2026
40bc094
fix(prompt): Replace system prompt with user prompt when the model do…
NicolasLacroix Apr 2, 2026
22bbf59
Merging with xp branch
NicolasLacroix Apr 2, 2026
6120c4d
refactor(async): Replace synchronous implementation with async querying
NicolasLacroix Apr 3, 2026
4fd5d48
feat(app/routers/profile_router.py): v2 endpoint generate profile for…
yassinumer Apr 17, 2026
19a1201
fix(app/main.py): resolve merge conflict
yassinumer Apr 17, 2026
a2be84e
feat(app/routers/profile_router.py): link vespucci parser and ml-inte…
yassinumer Apr 21, 2026
3022677
feat(app/parsers/vespucci.py): add vespucci parser in factory
yassinumer Apr 21, 2026
5b37236
feat(app/routers/profile_router.py): use async io loop when profiling
yassinumer Apr 22, 2026
7a2562d
Merge pull request #2 from colombus-dev/9/feat/integrate-parser
yassinumer Apr 23, 2026
6975ec6
fix(app/routers/profile_router.py): use asyncio gather and correct ta…
yassinumer Apr 23, 2026
9c43f98
Merge branch 'development' into 9/feat/integrate-parser
yassinumer Apr 23, 2026
acda3e3
style: reformat codebase with ci specs
yassinumer Apr 23, 2026
d80f6dd
fix: fix mypy errors, skip complicated ones for now
yassinumer Apr 27, 2026
1e8ee55
ci(.github/workflows/ci.yml): introduce workflow
yassinumer Apr 27, 2026
fb99657
ci(.github/workflows/ci.yml): skip tests + fix build errors
yassinumer Apr 27, 2026
34937c6
ci: remove docker build -> there is no enough space
yassinumer Apr 27, 2026
d483874
Merge pull request #4 from colombus-dev/14/feat/ci-cd
yassinumer Apr 27, 2026
3b368b1
feat(docker/docker-compose.yml): use docker model runner to serve inf…
yassinumer Apr 30, 2026
b0463c6
refactor(app/profiling_functions/): code cleanup (keep only useful pa…
yassinumer May 4, 2026
e998a59
feat(app/profiling_functions,docker/docker-compose.yml): code cleanup…
yassinumer May 5, 2026
9834f6a
ci(.pre-commit-config.yaml): include ruff sorting
yassinumer May 5, 2026
82670b0
docs(README.md): update regarding env file
yassinumer May 5, 2026
6c494a4
docs(readme.md): update readme, split docker compose to seperate mac …
yassinumer May 11, 2026
2cea647
fix(docker/docker-compose.yml): langfuse use base url
yassinumer May 11, 2026
478937d
feat(env): use base_url for langfuse, ignore local env file
yassinumer May 11, 2026
b57d6e8
feat(docker/docker-compose.linux.vllm.yml): bring back vllm
yassinumer May 13, 2026
00e5dc2
docs(readme.md): update readme, cast to int
yassinumer May 13, 2026
a9cd424
Merge pull request #5 from colombus-dev/1/feat/implement-apple-silico…
yassinumer May 13, 2026
701e5f7
docs(README.md): install pre-commit hooks
yassinumer May 18, 2026
a95d188
fix(docker/.env.sample): var name was incorrect
yassinumer May 19, 2026
a913745
feat(docker/docker-compose.yml): use published image instead of local…
yassinumer May 20, 2026
b410d06
fix(embedding.py): Remove onnxruntime-gpu from dependencies and chang…
yassinumer Jun 1, 2026
db03e04
docs(README.md): simplify and improve structure, wording, exec order …
yassinumer Jun 1, 2026
a4b52c2
feat(docker/docker-compose.prod.yml): prod deployment config for ml p…
yassinumer Jun 2, 2026
fa30c87
Add LICENSE file
yassinumer Jun 2, 2026
584730a
Create CODE_OF_CONDUCT.md
NicolasLacroix May 20, 2026
0ad32a8
Merge branch 'main' into development
yassinumer Jun 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
demo/
10 changes: 0 additions & 10 deletions .env

This file was deleted.

51 changes: 51 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: CI

on:
push:
branches: ["**"]
pull_request:
branches: ["**"]

jobs:
lint-and-type-check:
name: Pre-commit hooks (lint, sort, type-check, docker)
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Install uv
uses: astral-sh/setup-uv@v5

- name: Install dependencies
run: uv sync --all-extras

- name: Run pre-commit on all files
uses: pre-commit/action@v3.0.1
with:
extra_args: --all-files # TODO ymu : maybe run only on changed files

test:
name: Tests
runs-on: ubuntu-latest
needs: lint-and-type-check

steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Install uv
uses: astral-sh/setup-uv@v5

- name: Install dependencies
run: uv sync --all-extras
50 changes: 50 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: Release

on:
push:
tags: ["v*"]

env:
REGISTRY: ghcr.io
IMAGE_PREFIX: ghcr.io/${{ github.repository_owner }}

jobs:
build-and-push:
name: Build and push image
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Generate tags
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.IMAGE_PREFIX }}/mlprofiler
tags: |
type=raw,value=latest
type=sha,prefix=,format=short
type=semver,pattern={{version}}

- name: Build and push mlprofiler
uses: docker/build-push-action@v5
with:
context: .
file: docker/Dockerfile.prod
push: true
tags: ${{ steps.meta.outputs.tags }}
cache-from: type=gha
cache-to: type=gha,mode=max
6 changes: 4 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -182,9 +182,9 @@ cython_debug/
.abstra/

# Visual Studio Code
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
# and can be added to the global gitignore or merged into this file. However, if you prefer,
# and can be added to the global gitignore or merged into this file. However, if you prefer,
# you could uncomment the following to ignore the entire vscode folder
# .vscode/

Expand All @@ -209,3 +209,5 @@ __marimo__/
# Others
out/
data/
.idea/
docker/.env
34 changes: 34 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.4.4
hooks:
- id: ruff
args: [--fix, --select, "I"]
#- id: ruff-format

- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.10.0
hooks:
- id: mypy
additional_dependencies:
- fastapi
- pydantic
- types-ujson

- repo: https://github.com/hadolint/hadolint
rev: v2.12.0
hooks:
- id: hadolint-docker
args: [--failure-threshold, warning]

- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-toml
- id: check-merge-conflict
- id: check-added-large-files
args: [--maxkb=1000]
- id: debug-statements
1 change: 1 addition & 0 deletions .python-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.12
11 changes: 10 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added

- Parser metadata in JSON ML profile.
- "dspipelines" parser
- External taxonomies support
- Distinction between context and code to classify
- Removed the CLI

## [0.3] - 2025-07-16

### Added
Expand All @@ -19,7 +27,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added

- Taxonomy metadata in JSON ML profile.
- "dspipelines" taxonomy (from *The Art and Practice of Data Science Pipelines*, 2022 ICSE) with some improvements (Library Loading, Others)
- "dspipelines" taxonomy (from *The Art and Practice of Data Science Pipelines*, 2022 ICSE) with some improvements (
Library Loading, Others)

## [0.1] - 2025-06-01

Expand Down
30 changes: 0 additions & 30 deletions Dockerfile.prod

This file was deleted.

95 changes: 71 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,51 +1,98 @@
# mlprofiler - The ML pipelines profiler
# ML Profiler

Profiles ML pipelines by analyzing source code and classifying pipeline steps.

## Requirements

* Docker (tested on version 28.5.1, build e180ab8)
* Docker Compose (tested on version v2.40.0)
- Docker ≥ 28.5.1
- Docker Compose ≥ 2.40.0
- _(Advanced)_ [Docker Model Runner](https://docs.docker.com/ai/model-runner/get-started/) ≥ 1.1.37 required for the LLM profiler function

## Quick start

```bash
cd docker
cp .env.sample .env # edit .env if needed, the defaults work for basic setup
docker compose --env-file .env up --build
```

## Advanced setup (LLM profiler)

The LLM profiler function requires Docker Model Runner (DMR). Setup differs by platform.

## Deployment
### Mac DMR

The following docker compose commands deploy the mlprofiler API and vLLM instance:
No extra installation needed. DMR uses llama.cpp natively via Metal (Apple Silicon).

```bash
$ docker compose --env-file .env build
$ docker compose --env-file .env up
docker compose -f docker-compose.yml -f docker-compose.mac.yml --env-file .env up --build
```

It is also possible to deploy the LLM monitoring platform (Langfuse) as follows:
### Linux DMR

[Set up the vLLM inference backend](https://docs.docker.com/ai/model-runner/inference-engines/#setting-up-vllm):

```bash
$ docker compose --file docker-compose-monitor-local.yml
docker model install-runner --backend vllm --gpu cuda
```

## Troubleshooting
[Configure the model](https://docs.docker.com/ai/model-runner/inference-engines/#vllm-configuration):

### Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
```bash
docker model configure --hf_overrides '{
"max_model_len": 8192,
"max_num_seqs": 10,
"gpu_memory_utilization": 0.8,
"enforce_eager": true
}' hf.co/Qwen/Qwen2.5-Coder-7B-Instruct-AWQ
```

Allow your user to use the socket:
```bash
sudo usermod -a -G docker $USER
newgrp docker
reboot
docker compose -f docker-compose.yml -f docker-compose.linux.dmr.yml --env-file .env up --build
```

### Failed to solve: process "/bin/sh -c uv sync --locked --no-install-project" did not complete successfully: exit code: 1
### Linux vLLM (standalone)

Set `VLLM_FORCE=1` in `.env`, then:

Regenerate the lock file by executing:
```bash
uv lock
docker compose -f docker-compose.yml -f docker-compose.linux.dmr.yml -f docker-compose.linux.vllm.yml --env-file .env up --build
```

## Monitoring (optional)

| Stack | Command |
|---|---|
| Langfuse ([docs](https://langfuse.com/docs)) | `docker compose -f docker-compose-monitor-langfuse.yml up` |
| Grafana/Prometheus ([docs](https://github.com/vllm-project/vllm/tree/main/examples/online_serving/prometheus_grafana)) | `docker compose -f docker-compose-monitor-grafana.yml up` |

## Development

Install pre-commit hooks:

```bash
uv run --with pre-commit pre-commit install
```

## Troubleshooting

**`permission denied` connecting to Docker socket**
```bash
sudo usermod -a -G docker $USER && newgrp docker
```
Then reboot.

### Network colombus-dev_network declared as external, but could not be found
---

Create the missing network:
**`uv sync` fails during build**

Regenerate the lockfile:
```bash
docker network create "colombus-dev_network"
uv lock
```

### Error response from daemon: could not select device driver "nvidia" with capabilities: [[gpu]]
---

**`could not select device driver "nvidia"`**

Install the nvidia toolkit and restart docker using this link:
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
Install the [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#with-apt-ubuntu-debian) and [configure Docker to use the NVIDIA runtime](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#configuring-docker).
Loading
Loading