dataeval-flow 0.1.0__tar.gz → 0.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/.gitignore +6 -0
  2. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/PKG-INFO +139 -21
  3. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/README.md +131 -3
  4. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/pyproject.toml +64 -29
  5. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/__init__.py +17 -1
  6. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/__main__.py +9 -1
  7. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_model/_discover.py +20 -6
  8. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_model/_state.py +1 -1
  9. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_screens/_base.py +2 -2
  10. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_screens/_params.py +2 -2
  11. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_screens/_section.py +3 -3
  12. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/app.py +3 -2
  13. dataeval_flow-0.1.2/src/dataeval_flow/_logging.py +158 -0
  14. dataeval_flow-0.1.2/src/dataeval_flow/_version.py +24 -0
  15. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/cache.py +30 -33
  16. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/config/__init__.py +8 -0
  17. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/config/_loader.py +3 -3
  18. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/config/_merge.py +7 -5
  19. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/config/schemas/__init__.py +6 -1
  20. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/config/schemas/_task.py +4 -0
  21. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/config/schemas/_workflow.py +20 -0
  22. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/dataset.py +10 -10
  23. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/embeddings.py +2 -2
  24. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/preprocessing.py +18 -9
  25. dataeval_flow-0.1.2/src/dataeval_flow/preprocessors.py +56 -0
  26. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/runner.py +7 -7
  27. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflow/__init__.py +5 -3
  28. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflow/orchestrator.py +22 -10
  29. dataeval_flow-0.1.2/src/dataeval_flow/workflows/cleaning/_internal.py +135 -0
  30. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/cleaning/workflow.py +38 -198
  31. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/drift/workflow.py +19 -19
  32. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/ood/workflow.py +25 -25
  33. dataeval_flow-0.1.2/src/dataeval_flow/workflows/parameter_sweep/__init__.py +5 -0
  34. dataeval_flow-0.1.2/src/dataeval_flow/workflows/parameter_sweep/outputs.py +50 -0
  35. dataeval_flow-0.1.2/src/dataeval_flow/workflows/parameter_sweep/params.py +64 -0
  36. dataeval_flow-0.1.2/src/dataeval_flow/workflows/parameter_sweep/workflow.py +359 -0
  37. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/prioritization/workflow.py +15 -15
  38. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/splitting/workflow.py +10 -10
  39. dataeval_flow-0.1.0/src/dataeval_flow/_logging.py +0 -102
  40. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/LICENSE +0 -0
  41. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/__init__.py +0 -0
  42. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_model/__init__.py +0 -0
  43. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_model/_coerce.py +0 -0
  44. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_model/_execution.py +0 -0
  45. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_model/_introspect.py +0 -0
  46. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_model/_item.py +0 -0
  47. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_model/_registry.py +0 -0
  48. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_model/_undo.py +0 -0
  49. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_panes/__init__.py +0 -0
  50. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_panes/_config_pane.py +0 -0
  51. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_panes/_result_pane.py +0 -0
  52. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_panes/_task_pane.py +0 -0
  53. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_panes/_widgets.py +0 -0
  54. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_screens/__init__.py +0 -0
  55. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_screens/_detail.py +0 -0
  56. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_screens/_model.py +0 -0
  57. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_screens/_pathpicker.py +0 -0
  58. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_screens/_settings.py +0 -0
  59. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_viewmodel/__init__.py +0 -0
  60. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_viewmodel/_builder_vm.py +0 -0
  61. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_viewmodel/_model_vm.py +0 -0
  62. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_viewmodel/_rendering.py +0 -0
  63. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_viewmodel/_result_vm.py +0 -0
  64. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/_viewmodel/_section_vm.py +0 -0
  65. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/_app/cli.py +0 -0
  66. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/config/_models.py +0 -0
  67. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/config/_paths.py +0 -0
  68. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/config/schemas/_dataset.py +0 -0
  69. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/config/schemas/_extractor.py +0 -0
  70. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/config/schemas/_metadata.py +0 -0
  71. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/config/schemas/_preprocessor.py +0 -0
  72. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/config/schemas/_selection.py +0 -0
  73. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/metadata.py +0 -0
  74. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/py.typed +0 -0
  75. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/selection.py +0 -0
  76. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflow/_text_report.py +0 -0
  77. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflow/base.py +0 -0
  78. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/__init__.py +0 -0
  79. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/analysis/__init__.py +0 -0
  80. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/analysis/outputs.py +0 -0
  81. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/analysis/params.py +0 -0
  82. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/analysis/workflow.py +0 -0
  83. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/cleaning/__init__.py +0 -0
  84. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/cleaning/outputs.py +0 -0
  85. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/cleaning/params.py +0 -0
  86. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/cleaning/report.py +0 -0
  87. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/drift/__init__.py +0 -0
  88. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/drift/outputs.py +0 -0
  89. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/drift/params.py +0 -0
  90. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/drift/report.py +0 -0
  91. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/ood/__init__.py +0 -0
  92. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/ood/outputs.py +0 -0
  93. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/ood/params.py +0 -0
  94. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/ood/report.py +0 -0
  95. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/prioritization/__init__.py +0 -0
  96. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/prioritization/outputs.py +0 -0
  97. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/prioritization/params.py +0 -0
  98. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/prioritization/report.py +0 -0
  99. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/splitting/__init__.py +0 -0
  100. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/splitting/outputs.py +0 -0
  101. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/splitting/params.py +0 -0
  102. {dataeval_flow-0.1.0 → dataeval_flow-0.1.2}/src/dataeval_flow/workflows/splitting/report.py +0 -0
@@ -15,6 +15,9 @@ __pycache__/
15
15
  *.egg-info/
16
16
  dist/
17
17
  build/
18
+ # hatch-vcs writes the runtime version file at build/install time;
19
+ # source of truth is git tags. Do not commit.
20
+ src/dataeval_flow/_version.py
18
21
 
19
22
  # Cache
20
23
  .pytest_cache/
@@ -31,6 +34,9 @@ output/
31
34
  # Generated notebooks (source of truth is MyST markdown)
32
35
  *.ipynb
33
36
 
37
+ # Jupyter execution cache (stored in docs-artifacts/<branch> orphan branch instead)
38
+ .jupyter_cache/
39
+
34
40
  # Nox
35
41
  .nox/
36
42
  .cuda-version
@@ -1,13 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataeval-flow
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: DataEval Workflows container for data evaluation
5
5
  Project-URL: Repository, https://gitlab.jatic.net/jatic/aria/dataeval-flow
6
6
  License-Expression: MIT
7
7
  License-File: LICENSE
8
8
  Classifier: Development Status :: 3 - Alpha
9
9
  Classifier: Intended Audience :: Science/Research
10
- Classifier: License :: OSI Approved :: MIT License
11
10
  Classifier: Programming Language :: Python :: 3
12
11
  Classifier: Programming Language :: Python :: 3.10
13
12
  Classifier: Programming Language :: Python :: 3.11
@@ -15,51 +14,42 @@ Classifier: Programming Language :: Python :: 3.12
15
14
  Classifier: Programming Language :: Python :: 3.13
16
15
  Classifier: Topic :: Scientific/Engineering
17
16
  Classifier: Typing :: Typed
18
- Requires-Python: <3.14,>=3.10
19
- Requires-Dist: dataeval==1.0.4
17
+ Requires-Python: >=3.10
18
+ Requires-Dist: dataeval==1.0.6
20
19
  Requires-Dist: datasets>=4.0.0
21
20
  Requires-Dist: maite-datasets>=0.0.12
21
+ Requires-Dist: numpy>=1.24.2
22
22
  Requires-Dist: pydantic>=2.0
23
23
  Requires-Dist: pyyaml>=6.0
24
24
  Provides-Extra: all-cpu
25
25
  Requires-Dist: onnx>=1.15; extra == 'all-cpu'
26
26
  Requires-Dist: onnxruntime>=1.20; extra == 'all-cpu'
27
27
  Requires-Dist: opencv-python-headless>=4.8.0; extra == 'all-cpu'
28
- Requires-Dist: textual>=3.0; extra == 'all-cpu'
28
+ Requires-Dist: textual>=3.0; (python_version < '3.14') and extra == 'all-cpu'
29
29
  Requires-Dist: torch>=2.2.0; extra == 'all-cpu'
30
30
  Requires-Dist: torchvision>=0.17.0; extra == 'all-cpu'
31
31
  Provides-Extra: all-cu118
32
32
  Requires-Dist: onnx>=1.15; extra == 'all-cu118'
33
33
  Requires-Dist: onnxruntime-gpu>=1.20; extra == 'all-cu118'
34
34
  Requires-Dist: opencv-python-headless>=4.8.0; extra == 'all-cu118'
35
- Requires-Dist: textual>=3.0; extra == 'all-cu118'
35
+ Requires-Dist: textual>=3.0; (python_version < '3.14') and extra == 'all-cu118'
36
36
  Requires-Dist: torch>=2.2.0; extra == 'all-cu118'
37
37
  Requires-Dist: torchvision>=0.17.0; extra == 'all-cu118'
38
- Provides-Extra: all-cu124
39
- Requires-Dist: onnx>=1.15; extra == 'all-cu124'
40
- Requires-Dist: onnxruntime-gpu>=1.20; extra == 'all-cu124'
41
- Requires-Dist: opencv-python-headless>=4.8.0; extra == 'all-cu124'
42
- Requires-Dist: textual>=3.0; extra == 'all-cu124'
43
- Requires-Dist: torch>=2.2.0; extra == 'all-cu124'
44
- Requires-Dist: torchvision>=0.17.0; extra == 'all-cu124'
45
38
  Provides-Extra: all-cu128
46
39
  Requires-Dist: onnx>=1.15; extra == 'all-cu128'
47
40
  Requires-Dist: onnxruntime-gpu>=1.23.2; extra == 'all-cu128'
48
41
  Requires-Dist: opencv-python-headless>=4.8.0; extra == 'all-cu128'
49
- Requires-Dist: textual>=3.0; extra == 'all-cu128'
42
+ Requires-Dist: textual>=3.0; (python_version < '3.14') and extra == 'all-cu128'
50
43
  Requires-Dist: torch>=2.2.0; extra == 'all-cu128'
51
44
  Requires-Dist: torchvision>=0.17.0; extra == 'all-cu128'
52
45
  Provides-Extra: app
53
- Requires-Dist: textual>=3.0; extra == 'app'
46
+ Requires-Dist: textual>=3.0; (python_version < '3.14') and extra == 'app'
54
47
  Provides-Extra: cpu
55
48
  Requires-Dist: torch>=2.2.0; extra == 'cpu'
56
49
  Requires-Dist: torchvision>=0.17.0; extra == 'cpu'
57
50
  Provides-Extra: cu118
58
51
  Requires-Dist: torch>=2.2.0; extra == 'cu118'
59
52
  Requires-Dist: torchvision>=0.17.0; extra == 'cu118'
60
- Provides-Extra: cu124
61
- Requires-Dist: torch>=2.2.0; extra == 'cu124'
62
- Requires-Dist: torchvision>=0.17.0; extra == 'cu124'
63
53
  Provides-Extra: cu128
64
54
  Requires-Dist: torch>=2.2.0; extra == 'cu128'
65
55
  Requires-Dist: torchvision>=0.17.0; extra == 'cu128'
@@ -77,6 +67,19 @@ Description-Content-Type: text/markdown
77
67
 
78
68
  Workflow orchestration for DataEval with GPU support.
79
69
 
70
+ ## Target Audience
71
+
72
+ <!-- start JATIC interop -->
73
+
74
+ DataEval Flow is intended for data scientists, ML engineers, and T&E engineers
75
+ who want to run automated data-evaluation pipelines — outlier and duplicate
76
+ detection, drift and OOD monitoring, dataset splitting, prioritization, and
77
+ statistical analysis — against their image datasets and models. For users of
78
+ the JATIC product suite, DataEval Flow has native interoperability when using
79
+ MAITE-compliant datasets and models.
80
+
81
+ <!-- end JATIC interop -->
82
+
80
83
  ## Quick Start
81
84
 
82
85
  ```bash
@@ -93,6 +96,32 @@ docker run --gpus all \
93
96
  dataeval:cu118
94
97
  ```
95
98
 
99
+ ## Pulling pre-built images
100
+
101
+ Pre-built, cosign-signed images are published to Harbor for every merge to `main` and every release tag. Pull one of these instead of building from source if you don't need to modify the code.
102
+
103
+ **Rolling channel** — tracks the latest commit on `main`. The tag is overwritten on every merge.
104
+
105
+ ```bash
106
+ docker pull harbor.jatic.net/aria/dataeval:cu118 # cpu / cu118 / cu128
107
+ ```
108
+
109
+ **Pinned release channel** — immutable, version-tagged images cut from `v*` git tags. Use these for reproducible workloads.
110
+
111
+ ```bash
112
+ docker pull harbor.jatic.net/aria/dataeval:0.1.0-cu118
113
+ ```
114
+
115
+ **Verifying the signature** — every published image is signed with [cosign](https://docs.sigstore.dev/cosign/). The public key is committed at [docker/cosign.pub](docker/cosign.pub).
116
+
117
+ ```bash
118
+ cosign verify --key docker/cosign.pub harbor.jatic.net/aria/dataeval:cu118
119
+ ```
120
+
121
+ Then drop the `dataeval:cu118` reference in the Quick Start `docker run` commands above with the fully-qualified `harbor.jatic.net/aria/dataeval:cu118` (or pinned version) and skip step 1.
122
+
123
+ > **Note on feature branches.** Containers are only built and published from `main` and release tags — no image is produced for MRs or topic branches. If you want to run a feature branch as a container, check it out and follow the Quick Start to build locally; the resulting image will pick up the branch's version via `git describe`.
124
+
96
125
  ## Requirements
97
126
 
98
127
  | Requirement | Version |
@@ -253,7 +282,7 @@ Configs can be saved as YAML or JSON.
253
282
 
254
283
  The Docker build may appear frozen during the `uv sync` step:
255
284
 
256
- ```
285
+ ```text
257
286
  => [builder 7/7] RUN uv sync --frozen --no-dev --no-install-project 1139.3s
258
287
  ```
259
288
 
@@ -272,19 +301,68 @@ The Docker build may appear frozen during the `uv sync` step:
272
301
  The `dataeval_flow` package can be used standalone without Docker.
273
302
 
274
303
  **Installation:**
304
+
305
+ Three installer toolchains are supported. Choose whichever fits your environment;
306
+ all three install the same dependencies pinned in their respective lockfiles.
307
+
308
+ `uv` (default toolchain):
309
+
275
310
  ```bash
276
311
  git clone https://gitlab.jatic.net/jatic/aria/dataeval-flow.git
277
312
  cd dataeval-flow
278
- uv sync
313
+ uv sync --extra cpu # or cu118 / cu128 for CUDA variants
279
314
  ```
280
315
 
316
+ `pip` from PyPI (no source checkout). PyTorch is hosted on a separate
317
+ wheel index, so pass `--extra-index-url` matching the variant you want
318
+ (omit it and you'll get the CUDA-bundled manylinux build of torch from
319
+ PyPI, which is much larger):
320
+
321
+ ```bash
322
+ # CPU-only PyTorch
323
+ pip install "dataeval-flow[cpu]" --extra-index-url https://download.pytorch.org/whl/cpu
324
+
325
+ # CUDA 11.8 PyTorch
326
+ pip install "dataeval-flow[cu118]" --extra-index-url https://download.pytorch.org/whl/cu118
327
+
328
+ # CUDA 12.8 PyTorch
329
+ pip install "dataeval-flow[cu128]" --extra-index-url https://download.pytorch.org/whl/cu128
330
+ ```
331
+
332
+ `poetry` (source checkout; uses committed `poetry.lock`):
333
+
334
+ ```bash
335
+ git clone https://gitlab.jatic.net/jatic/aria/dataeval-flow.git
336
+ cd dataeval-flow
337
+ poetry install
338
+ ```
339
+
340
+ `conda` / `mamba` (source checkout; uses committed `environment.yml`):
341
+
342
+ ```bash
343
+ git clone https://gitlab.jatic.net/jatic/aria/dataeval-flow.git
344
+ cd dataeval-flow
345
+ conda env create -f environment.yml
346
+ conda activate dataeval-flow
347
+ pip install -e . # install the package itself; conda manages deps
348
+ ```
349
+
350
+ Notes:
351
+
352
+ - PyTorch is installed from PyPI/`download.pytorch.org` in every path
353
+ (it is no longer maintained on conda-forge).
354
+ - GPU variants (`cu118`, `cu128`) are only wired through `uv` and
355
+ `pip` today; the Poetry/conda paths install the CPU build of PyTorch.
356
+
281
357
  **CLI Usage:**
358
+
282
359
  ```bash
283
360
  python -m dataeval_flow --config /path/to/config --output /path/to/output
284
361
  python -m dataeval_flow --data /path/to/data --output /path/to/output
285
362
  ```
286
363
 
287
364
  **Python API Usage:**
365
+
288
366
  ```python
289
367
  from pathlib import Path
290
368
  from dataeval_flow import load_config, run_tasks
@@ -295,11 +373,51 @@ print(results[0].report())
295
373
  ```
296
374
 
297
375
  **Development:**
376
+
298
377
  ```bash
299
378
  uv sync --group dev
300
379
  nox
301
380
  ```
302
381
 
382
+ ## Versioning
383
+
384
+ The package version is **derived from git tags** — there is no hardcoded version anywhere in the source tree. `hatch-vcs` reads `git describe --tags` at build/install time and writes the resolved version to a generated `src/dataeval_flow/_version.py` (gitignored), which `dataeval_flow.__init__` imports at runtime.
385
+
386
+ **Release flow for container images:**
387
+
388
+ 1. Push a semver tag (e.g. `v0.2.0`) — this is the single source of truth for the release version.
389
+ 2. The `push:docker` CI job runs `git describe --tags --always --dirty | sed 's/^v//'` to resolve `${VERSION}`, then passes `--build-arg DATAEVAL_FLOW_VERSION="${VERSION}"` to `docker buildx build` for both the `test` and `prod` stages.
390
+ 3. The `prod` stage in [docker/Dockerfile.j2](docker/Dockerfile.j2) redeclares the ARG and:
391
+ - Bakes the resolved version into `/app/src/dataeval_flow/_version.py` so `dataeval_flow.__version__` matches the wheel version at runtime.
392
+ - Stamps the OCI `org.opencontainers.image.version` label with the same value.
393
+ 4. The image is pushed to Harbor and cosign-signed.
394
+
395
+ The `ARG DATAEVAL_FLOW_VERSION="…"` default rendered into each committed `docker/Dockerfile.<variant>` by `docker/generate.py` is only used for **local** `docker build` invocations that don't pass `--build-arg`. Release builds always override it, so the committed default is allowed to drift from the latest tag and does not need to be regenerated at release time.
396
+
303
397
  ## License
304
398
 
305
- MIT
399
+ MIT — see [LICENSE](LICENSE).
400
+
401
+ ## Contributing
402
+
403
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for bug reports and contribution
404
+ guidelines, and [BRANCHING.md](BRANCHING.md) for the branching and release
405
+ strategy.
406
+
407
+ ## Contact
408
+
409
+ For questions or feedback, reach out to <dataeval-flow@ariacoustics.com>.
410
+
411
+ ## Acknowledgement
412
+
413
+ ### CDAO Funding Acknowledgement
414
+
415
+ <!-- start acknowledgement -->
416
+
417
+ This material is based upon work supported by the Chief Digital and Artificial
418
+ Intelligence Office under Contract No. W519TC-23-9-2033. The views and
419
+ conclusions contained herein are those of the author(s) and should not be
420
+ interpreted as necessarily representing the official policies or endorsements,
421
+ either expressed or implied, of the U.S. Government.
422
+
423
+ <!-- end acknowledgement -->
@@ -2,6 +2,19 @@
2
2
 
3
3
  Workflow orchestration for DataEval with GPU support.
4
4
 
5
+ ## Target Audience
6
+
7
+ <!-- start JATIC interop -->
8
+
9
+ DataEval Flow is intended for data scientists, ML engineers, and T&E engineers
10
+ who want to run automated data-evaluation pipelines — outlier and duplicate
11
+ detection, drift and OOD monitoring, dataset splitting, prioritization, and
12
+ statistical analysis — against their image datasets and models. For users of
13
+ the JATIC product suite, DataEval Flow has native interoperability when using
14
+ MAITE-compliant datasets and models.
15
+
16
+ <!-- end JATIC interop -->
17
+
5
18
  ## Quick Start
6
19
 
7
20
  ```bash
@@ -18,6 +31,32 @@ docker run --gpus all \
18
31
  dataeval:cu118
19
32
  ```
20
33
 
34
+ ## Pulling pre-built images
35
+
36
+ Pre-built, cosign-signed images are published to Harbor for every merge to `main` and every release tag. Pull one of these instead of building from source if you don't need to modify the code.
37
+
38
+ **Rolling channel** — tracks the latest commit on `main`. The tag is overwritten on every merge.
39
+
40
+ ```bash
41
+ docker pull harbor.jatic.net/aria/dataeval:cu118 # cpu / cu118 / cu128
42
+ ```
43
+
44
+ **Pinned release channel** — immutable, version-tagged images cut from `v*` git tags. Use these for reproducible workloads.
45
+
46
+ ```bash
47
+ docker pull harbor.jatic.net/aria/dataeval:0.1.0-cu118
48
+ ```
49
+
50
+ **Verifying the signature** — every published image is signed with [cosign](https://docs.sigstore.dev/cosign/). The public key is committed at [docker/cosign.pub](docker/cosign.pub).
51
+
52
+ ```bash
53
+ cosign verify --key docker/cosign.pub harbor.jatic.net/aria/dataeval:cu118
54
+ ```
55
+
56
+ Then drop the `dataeval:cu118` reference in the Quick Start `docker run` commands above with the fully-qualified `harbor.jatic.net/aria/dataeval:cu118` (or pinned version) and skip step 1.
57
+
58
+ > **Note on feature branches.** Containers are only built and published from `main` and release tags — no image is produced for MRs or topic branches. If you want to run a feature branch as a container, check it out and follow the Quick Start to build locally; the resulting image will pick up the branch's version via `git describe`.
59
+
21
60
  ## Requirements
22
61
 
23
62
  | Requirement | Version |
@@ -178,7 +217,7 @@ Configs can be saved as YAML or JSON.
178
217
 
179
218
  The Docker build may appear frozen during the `uv sync` step:
180
219
 
181
- ```
220
+ ```text
182
221
  => [builder 7/7] RUN uv sync --frozen --no-dev --no-install-project 1139.3s
183
222
  ```
184
223
 
@@ -197,19 +236,68 @@ The Docker build may appear frozen during the `uv sync` step:
197
236
  The `dataeval_flow` package can be used standalone without Docker.
198
237
 
199
238
  **Installation:**
239
+
240
+ Three installer toolchains are supported. Choose whichever fits your environment;
241
+ all three install the same dependencies pinned in their respective lockfiles.
242
+
243
+ `uv` (default toolchain):
244
+
200
245
  ```bash
201
246
  git clone https://gitlab.jatic.net/jatic/aria/dataeval-flow.git
202
247
  cd dataeval-flow
203
- uv sync
248
+ uv sync --extra cpu # or cu118 / cu128 for CUDA variants
204
249
  ```
205
250
 
251
+ `pip` from PyPI (no source checkout). PyTorch is hosted on a separate
252
+ wheel index, so pass `--extra-index-url` matching the variant you want
253
+ (omit it and you'll get the CUDA-bundled manylinux build of torch from
254
+ PyPI, which is much larger):
255
+
256
+ ```bash
257
+ # CPU-only PyTorch
258
+ pip install "dataeval-flow[cpu]" --extra-index-url https://download.pytorch.org/whl/cpu
259
+
260
+ # CUDA 11.8 PyTorch
261
+ pip install "dataeval-flow[cu118]" --extra-index-url https://download.pytorch.org/whl/cu118
262
+
263
+ # CUDA 12.8 PyTorch
264
+ pip install "dataeval-flow[cu128]" --extra-index-url https://download.pytorch.org/whl/cu128
265
+ ```
266
+
267
+ `poetry` (source checkout; uses committed `poetry.lock`):
268
+
269
+ ```bash
270
+ git clone https://gitlab.jatic.net/jatic/aria/dataeval-flow.git
271
+ cd dataeval-flow
272
+ poetry install
273
+ ```
274
+
275
+ `conda` / `mamba` (source checkout; uses committed `environment.yml`):
276
+
277
+ ```bash
278
+ git clone https://gitlab.jatic.net/jatic/aria/dataeval-flow.git
279
+ cd dataeval-flow
280
+ conda env create -f environment.yml
281
+ conda activate dataeval-flow
282
+ pip install -e . # install the package itself; conda manages deps
283
+ ```
284
+
285
+ Notes:
286
+
287
+ - PyTorch is installed from PyPI/`download.pytorch.org` in every path
288
+ (it is no longer maintained on conda-forge).
289
+ - GPU variants (`cu118`, `cu128`) are only wired through `uv` and
290
+ `pip` today; the Poetry/conda paths install the CPU build of PyTorch.
291
+
206
292
  **CLI Usage:**
293
+
207
294
  ```bash
208
295
  python -m dataeval_flow --config /path/to/config --output /path/to/output
209
296
  python -m dataeval_flow --data /path/to/data --output /path/to/output
210
297
  ```
211
298
 
212
299
  **Python API Usage:**
300
+
213
301
  ```python
214
302
  from pathlib import Path
215
303
  from dataeval_flow import load_config, run_tasks
@@ -220,11 +308,51 @@ print(results[0].report())
220
308
  ```
221
309
 
222
310
  **Development:**
311
+
223
312
  ```bash
224
313
  uv sync --group dev
225
314
  nox
226
315
  ```
227
316
 
317
+ ## Versioning
318
+
319
+ The package version is **derived from git tags** — there is no hardcoded version anywhere in the source tree. `hatch-vcs` reads `git describe --tags` at build/install time and writes the resolved version to a generated `src/dataeval_flow/_version.py` (gitignored), which `dataeval_flow.__init__` imports at runtime.
320
+
321
+ **Release flow for container images:**
322
+
323
+ 1. Push a semver tag (e.g. `v0.2.0`) — this is the single source of truth for the release version.
324
+ 2. The `push:docker` CI job runs `git describe --tags --always --dirty | sed 's/^v//'` to resolve `${VERSION}`, then passes `--build-arg DATAEVAL_FLOW_VERSION="${VERSION}"` to `docker buildx build` for both the `test` and `prod` stages.
325
+ 3. The `prod` stage in [docker/Dockerfile.j2](docker/Dockerfile.j2) redeclares the ARG and:
326
+ - Bakes the resolved version into `/app/src/dataeval_flow/_version.py` so `dataeval_flow.__version__` matches the wheel version at runtime.
327
+ - Stamps the OCI `org.opencontainers.image.version` label with the same value.
328
+ 4. The image is pushed to Harbor and cosign-signed.
329
+
330
+ The `ARG DATAEVAL_FLOW_VERSION="…"` default rendered into each committed `docker/Dockerfile.<variant>` by `docker/generate.py` is only used for **local** `docker build` invocations that don't pass `--build-arg`. Release builds always override it, so the committed default is allowed to drift from the latest tag and does not need to be regenerated at release time.
331
+
228
332
  ## License
229
333
 
230
- MIT
334
+ MIT — see [LICENSE](LICENSE).
335
+
336
+ ## Contributing
337
+
338
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for bug reports and contribution
339
+ guidelines, and [BRANCHING.md](BRANCHING.md) for the branching and release
340
+ strategy.
341
+
342
+ ## Contact
343
+
344
+ For questions or feedback, reach out to <dataeval-flow@ariacoustics.com>.
345
+
346
+ ## Acknowledgement
347
+
348
+ ### CDAO Funding Acknowledgement
349
+
350
+ <!-- start acknowledgement -->
351
+
352
+ This material is based upon work supported by the Chief Digital and Artificial
353
+ Intelligence Office under Contract No. W519TC-23-9-2033. The views and
354
+ conclusions contained herein are those of the author(s) and should not be
355
+ interpreted as necessarily representing the official policies or endorsements,
356
+ either expressed or implied, of the U.S. Government.
357
+
358
+ <!-- end acknowledgement -->