dataeval-flow 0.1.1__tar.gz → 0.2.0__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 (120) hide show
  1. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/.gitignore +9 -0
  2. dataeval_flow-0.2.0/PKG-INFO +604 -0
  3. dataeval_flow-0.2.0/README.md +552 -0
  4. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/pyproject.toml +55 -26
  5. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/__init__.py +15 -1
  6. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/__main__.py +40 -0
  7. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/__init__.py +1 -1
  8. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_model/_discover.py +40 -25
  9. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_model/_registry.py +13 -7
  10. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_model/_state.py +9 -6
  11. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_panes/_widgets.py +1 -1
  12. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_screens/_params.py +1 -1
  13. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_screens/_section.py +8 -1
  14. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_viewmodel/_builder_vm.py +5 -4
  15. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_viewmodel/_rendering.py +7 -7
  16. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_viewmodel/_section_vm.py +4 -2
  17. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/app.py +3 -3
  18. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/cli.py +6 -3
  19. dataeval_flow-0.2.0/src/dataeval_flow/_encoding_cli.py +123 -0
  20. dataeval_flow-0.2.0/src/dataeval_flow/_logging.py +324 -0
  21. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_version.py +2 -2
  22. dataeval_flow-0.2.0/src/dataeval_flow/binning.py +545 -0
  23. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/cache.py +219 -159
  24. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/config/__init__.py +9 -0
  25. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/config/_loader.py +13 -2
  26. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/config/_merge.py +10 -0
  27. dataeval_flow-0.2.0/src/dataeval_flow/config/_models.py +182 -0
  28. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/config/schemas/__init__.py +18 -2
  29. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/config/schemas/_dataset.py +2 -7
  30. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/config/schemas/_extractor.py +18 -1
  31. dataeval_flow-0.2.0/src/dataeval_flow/config/schemas/_metadata.py +156 -0
  32. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/config/schemas/_task.py +5 -0
  33. dataeval_flow-0.1.1/src/dataeval_flow/config/schemas/_selection.py → dataeval_flow-0.2.0/src/dataeval_flow/config/schemas/_view.py +73 -11
  34. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/config/schemas/_workflow.py +22 -0
  35. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/dataset.py +122 -136
  36. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/embeddings.py +40 -1
  37. dataeval_flow-0.2.0/src/dataeval_flow/metadata.py +32 -0
  38. dataeval_flow-0.2.0/src/dataeval_flow/policy.py +417 -0
  39. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/preprocessing.py +11 -4
  40. dataeval_flow-0.2.0/src/dataeval_flow/preprocessors.py +56 -0
  41. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/runner.py +55 -6
  42. dataeval_flow-0.2.0/src/dataeval_flow/view.py +54 -0
  43. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflow/__init__.py +29 -3
  44. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflow/_text_report.py +267 -1
  45. dataeval_flow-0.2.0/src/dataeval_flow/workflow/base.py +109 -0
  46. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflow/orchestrator.py +149 -30
  47. dataeval_flow-0.2.0/src/dataeval_flow/workflows/_common.py +131 -0
  48. dataeval_flow-0.2.0/src/dataeval_flow/workflows/_ontology.py +118 -0
  49. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/analysis/params.py +2 -2
  50. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/analysis/workflow.py +146 -178
  51. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/cleaning/_internal.py +1 -1
  52. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/cleaning/outputs.py +5 -1
  53. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/cleaning/params.py +2 -2
  54. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/cleaning/report.py +3 -3
  55. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/cleaning/workflow.py +22 -11
  56. dataeval_flow-0.2.0/src/dataeval_flow/workflows/coverage/__init__.py +36 -0
  57. dataeval_flow-0.2.0/src/dataeval_flow/workflows/coverage/ontology.py +145 -0
  58. dataeval_flow-0.2.0/src/dataeval_flow/workflows/coverage/outputs.py +356 -0
  59. dataeval_flow-0.2.0/src/dataeval_flow/workflows/coverage/params.py +231 -0
  60. dataeval_flow-0.2.0/src/dataeval_flow/workflows/coverage/report.py +595 -0
  61. dataeval_flow-0.2.0/src/dataeval_flow/workflows/coverage/workflow.py +754 -0
  62. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/drift/workflow.py +12 -10
  63. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/ood/params.py +2 -2
  64. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/ood/workflow.py +85 -29
  65. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/parameter_sweep/workflow.py +3 -3
  66. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/prioritization/params.py +2 -2
  67. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/prioritization/workflow.py +16 -9
  68. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/splitting/report.py +29 -15
  69. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/splitting/workflow.py +11 -29
  70. dataeval_flow-0.1.1/PKG-INFO +0 -423
  71. dataeval_flow-0.1.1/README.md +0 -358
  72. dataeval_flow-0.1.1/src/dataeval_flow/_logging.py +0 -158
  73. dataeval_flow-0.1.1/src/dataeval_flow/config/_models.py +0 -115
  74. dataeval_flow-0.1.1/src/dataeval_flow/config/schemas/_metadata.py +0 -28
  75. dataeval_flow-0.1.1/src/dataeval_flow/metadata.py +0 -48
  76. dataeval_flow-0.1.1/src/dataeval_flow/selection.py +0 -50
  77. dataeval_flow-0.1.1/src/dataeval_flow/workflow/base.py +0 -69
  78. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/LICENSE +0 -0
  79. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_model/__init__.py +0 -0
  80. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_model/_coerce.py +0 -0
  81. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_model/_execution.py +0 -0
  82. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_model/_introspect.py +0 -0
  83. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_model/_item.py +0 -0
  84. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_model/_undo.py +0 -0
  85. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_panes/__init__.py +0 -0
  86. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_panes/_config_pane.py +0 -0
  87. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_panes/_result_pane.py +0 -0
  88. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_panes/_task_pane.py +0 -0
  89. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_screens/__init__.py +0 -0
  90. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_screens/_base.py +0 -0
  91. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_screens/_detail.py +0 -0
  92. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_screens/_model.py +0 -0
  93. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_screens/_pathpicker.py +0 -0
  94. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_screens/_settings.py +0 -0
  95. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_viewmodel/__init__.py +0 -0
  96. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_viewmodel/_model_vm.py +0 -0
  97. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/_app/_viewmodel/_result_vm.py +0 -0
  98. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/config/_paths.py +0 -0
  99. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/config/schemas/_preprocessor.py +0 -0
  100. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/py.typed +0 -0
  101. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/__init__.py +0 -0
  102. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/analysis/__init__.py +0 -0
  103. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/analysis/outputs.py +0 -0
  104. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/cleaning/__init__.py +0 -0
  105. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/drift/__init__.py +0 -0
  106. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/drift/outputs.py +0 -0
  107. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/drift/params.py +0 -0
  108. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/drift/report.py +0 -0
  109. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/ood/__init__.py +0 -0
  110. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/ood/outputs.py +0 -0
  111. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/ood/report.py +0 -0
  112. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/parameter_sweep/__init__.py +0 -0
  113. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/parameter_sweep/outputs.py +0 -0
  114. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/parameter_sweep/params.py +0 -0
  115. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/prioritization/__init__.py +0 -0
  116. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/prioritization/outputs.py +0 -0
  117. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/prioritization/report.py +0 -0
  118. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/splitting/__init__.py +0 -0
  119. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/splitting/outputs.py +0 -0
  120. {dataeval_flow-0.1.1 → dataeval_flow-0.2.0}/src/dataeval_flow/workflows/splitting/params.py +0 -0
@@ -34,6 +34,15 @@ output/
34
34
  # Generated notebooks (source of truth is MyST markdown)
35
35
  *.ipynb
36
36
 
37
+ # Jupyter execution cache (stored in docs-artifacts/<branch> orphan branch instead)
38
+ .jupyter_cache/
39
+
40
+ # IPython runtime files and configuration
41
+ docs/source/.ipython/*
42
+ !docs/source/.ipython/profile_default/
43
+ docs/source/.ipython/profile_default/*
44
+ !docs/source/.ipython/profile_default/ipython_kernel_config.py
45
+
37
46
  # Nox
38
47
  .nox/
39
48
  .cuda-version
@@ -0,0 +1,604 @@
1
+ Metadata-Version: 2.5
2
+ Name: dataeval-flow
3
+ Version: 0.2.0
4
+ Summary: DataEval Workflows container for data evaluation
5
+ Project-URL: Homepage, https://github.com/aria-ml/dataeval-flow
6
+ Project-URL: Documentation, https://dataeval-flow.readthedocs.io/
7
+ Project-URL: Repository, https://github.com/aria-ml/dataeval-flow
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Science/Research
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Programming Language :: Python :: 3.14
18
+ Classifier: Topic :: Scientific/Engineering
19
+ Classifier: Typing :: Typed
20
+ Requires-Python: <3.15,>=3.10
21
+ Requires-Dist: click>=8.0
22
+ Requires-Dist: dataeval==1.1.0-rc6
23
+ Requires-Dist: datamaite[ic,od]==0.4.1
24
+ Requires-Dist: numpy>=1.24.2
25
+ Requires-Dist: pydantic>=2.0
26
+ Requires-Dist: pyyaml>=6.0
27
+ Provides-Extra: app
28
+ Requires-Dist: textual>=3.0; extra == 'app'
29
+ Provides-Extra: cpu
30
+ Requires-Dist: torch>=2.2.0; extra == 'cpu'
31
+ Requires-Dist: torchvision>=0.17.0; extra == 'cpu'
32
+ Provides-Extra: cu118
33
+ Requires-Dist: torch>=2.2.0; extra == 'cu118'
34
+ Requires-Dist: torchvision>=0.17.0; extra == 'cu118'
35
+ Provides-Extra: cu128
36
+ Requires-Dist: torch>=2.2.0; extra == 'cu128'
37
+ Requires-Dist: torchvision>=0.17.0; extra == 'cu128'
38
+ Provides-Extra: onnx
39
+ Requires-Dist: onnx>=1.15; extra == 'onnx'
40
+ Requires-Dist: onnxruntime<1.24,>=1.20; (python_version == '3.10') and extra == 'onnx'
41
+ Requires-Dist: onnxruntime>=1.20; (python_version >= '3.11') and extra == 'onnx'
42
+ Provides-Extra: onnx-gpu
43
+ Requires-Dist: onnx>=1.15; extra == 'onnx-gpu'
44
+ Requires-Dist: onnxruntime-gpu<1.24,>=1.23.2; (python_version == '3.10') and extra == 'onnx-gpu'
45
+ Requires-Dist: onnxruntime-gpu<1.27,>=1.23.2; (python_version >= '3.11') and extra == 'onnx-gpu'
46
+ Requires-Dist: onnxruntime-gpu<1.27,>=1.24; (python_version >= '3.14') and extra == 'onnx-gpu'
47
+ Provides-Extra: ontology
48
+ Requires-Dist: dataeval[ontology]==1.1.0-rc6; extra == 'ontology'
49
+ Provides-Extra: opencv
50
+ Requires-Dist: opencv-python-headless>=4.8.0; extra == 'opencv'
51
+ Description-Content-Type: text/markdown
52
+
53
+ <!-- markdownlint-disable MD041 -->
54
+ ![DataEval Flow](docs/source/_static/images/DataEvalFlow_Logo.png)
55
+
56
+ # DataEval Flow
57
+
58
+ DataEval Flow provides workflow orchestration for DataEval evaluators, packaging
59
+ data cleaning, dataset analysis, coverage assessment, drift monitoring, OOD
60
+ detection, splitting, prioritization, and parameter-sweep pipelines behind a
61
+ single declarative configuration format and both headless and interactive CLIs.
62
+
63
+ 📖 **Documentation:** <https://dataeval-flow.readthedocs.io/>
64
+
65
+ ## What DataEval Flow is for
66
+
67
+ <!-- start needs -->
68
+
69
+ DataEval Flow lets T&E engineers compose and run multi-stage data evaluation
70
+ pipelines without writing Python glue code. Pipelines are described in YAML or
71
+ JSON, executed locally or in a CUDA-enabled container, and produce both
72
+ human-readable reports and machine-readable result envelopes that satisfy JATIC
73
+ interoperability requirements. It builds directly on the
74
+ [DataEval](https://dataeval.readthedocs.io/) library, so the underlying
75
+ evaluators — outlier and duplicate detection, coverage and gap analysis, drift
76
+ and OOD monitoring, dataset splitting, prioritization, and statistical analysis —
77
+ are the same algorithms DataEval exposes, wrapped in a reproducible
78
+ orchestration layer.
79
+
80
+ <!-- end needs -->
81
+
82
+ ## Target Audience
83
+
84
+ <!-- start JATIC interop -->
85
+
86
+ DataEval Flow is intended for data scientists, ML engineers, and T&E engineers
87
+ who want to run automated data-evaluation pipelines against their image datasets
88
+ and models. It is part of the JATIC suite of tools: DataEval Flow has native
89
+ interoperability when using MAITE-compliant datasets and models, so its outputs
90
+ compose with other MAITE-conforming JATIC tools.
91
+
92
+ <!-- end JATIC interop -->
93
+
94
+ ## Limitations and requirements for use
95
+
96
+ - **Computer-vision image datasets only.** DataEval Flow operates on image
97
+ classification and object-detection datasets; it does not handle NLP or
98
+ tabular data.
99
+ - **MAITE for native interoperability.** Non-MAITE sources are consumed through
100
+ the built-in adapters (HuggingFace, COCO, YOLO, TorchVision, ImageFolder);
101
+ native JATIC interoperability requires MAITE-compliant datasets/models.
102
+ - **Some workflows need metadata.** Bias, parity, and metadata-insight analyses
103
+ require per-sample metadata factors to be present in the dataset.
104
+ - **Some workflows need a model or embeddings.** Embedding-space drift, OOD
105
+ detection, and prioritization require a feature extractor (ONNX/PyTorch) or
106
+ precomputed embeddings.
107
+ - **Drift and OOD need a representative reference.** Detection baselines are only
108
+ as good as the reference dataset they are fit on.
109
+ - **Batch container, not a service.** The container runs a pipeline to
110
+ completion and exits; it is not a long-running web service (no health-check
111
+ endpoint).
112
+
113
+ ## System Requirements
114
+
115
+ The guidance below applies to both the container and the Python-library forms.
116
+
117
+ ### Tested platforms
118
+
119
+ DataEval Flow is developed and tested on Linux (Ubuntu 22.04 and 24.04, including
120
+ WSL2). The Python package supports **Python 3.10–3.14**; the CI test matrix runs
121
+ all five. The container images are built on Ubuntu 22.04 (cu118) and
122
+ Ubuntu 24.04 (cpu, cu128). macOS and Windows are supported only through Docker or
123
+ WSL2 and are not part of the CI test matrix — if you hit an issue on those hosts,
124
+ the OS/hardware may be the root cause.
125
+
126
+ ### Architecture
127
+
128
+ All container images and the dependency stack target **linux/amd64 (x86-64)**.
129
+ arm64 / Apple Silicon is not built or tested; on those hosts run the CPU image
130
+ under emulation or install the library from source. The `dataeval_flow` package
131
+ ships no compiled extensions of its own, so the library form runs anywhere its
132
+ dependencies (PyTorch, NumPy, SciPy) provide x86-64 wheels.
133
+
134
+ ### Recommended minimum hardware
135
+
136
+ | Resource | Minimum | Recommended | Notes |
137
+ | -------- | --------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
138
+ | CPU | 2 cores | 4+ cores | Dataset loading and statistical analysis are CPU-bound. |
139
+ | Memory | 8 GB | 16+ GB | Datasets and embeddings are held in memory during a run; peak scales with dataset and batch size. **Memory is the primary limit on dataset size.** |
140
+ | Disk | 10 GB | 20+ GB | Several GB for the container image / dependencies, plus dataset and `/cache` storage. |
141
+ | GPU | none (optional) | NVIDIA, ≥ 4 GB VRAM | Optional — used only to accelerate model-based embedding extraction (ONNX / PyTorch). Every workflow runs CPU-only via the `cpu` image or a CPU torch build; a GPU speeds up embedding-heavy workflows (drift / OOD / prioritization) on large datasets. |
142
+
143
+ A GPU is never required. When deploying the container under Kubernetes, request
144
+ at least the minimum CPU/memory above; size memory to your largest dataset.
145
+
146
+ ### Internet access
147
+
148
+ - **Installation** needs network access to PyPI and the PyTorch wheel index (or,
149
+ for the container, to the base image and the Harbor registry).
150
+ - **First run** downloads any datasets referenced from the HuggingFace Hub (and,
151
+ in the tutorials, sample datasets such as MNIST / CPPE-5). Model weights
152
+ referenced by URL are likewise fetched on first use.
153
+ - **Offline / air-gapped operation** is supported once the image, datasets, and
154
+ models are staged locally: point the config at on-disk dataset/model paths and
155
+ set `HF_HUB_OFFLINE=1` (and `HF_DATASETS_OFFLINE=1`). With local inputs the
156
+ batch container makes no outbound network calls of its own at run time.
157
+
158
+ ## Quick Start
159
+
160
+ ```bash
161
+ # 1. Build CUDA 11.8 container
162
+ docker build -f docker/Dockerfile.cu118 -t dataeval:cu118 .
163
+
164
+ # 2. Show help
165
+ docker run dataeval:cu118
166
+
167
+ # 3. Run with data and output
168
+ docker run --gpus all \
169
+ --mount type=bind,source=/path/to/data,target=/dataeval,readonly \
170
+ --mount type=bind,source=/path/to/output,target=/output \
171
+ dataeval:cu118
172
+ ```
173
+
174
+ ## Pulling pre-built images
175
+
176
+ Pre-built, cosign-signed images are published to Harbor for every merge to
177
+ `main` and every release tag. Pull one of these instead of building from source
178
+ if you don't need to modify the code.
179
+
180
+ **Rolling channel** — tracks the latest commit on `main`. The tag is overwritten on every merge.
181
+
182
+ ```bash
183
+ docker pull harbor.jatic.net/aria/dataeval:cu118 # cpu / cu118 / cu128
184
+ ```
185
+
186
+ **Pinned release channel** — immutable, version-tagged images cut from `v*` git tags. Use these for reproducible workloads.
187
+
188
+ ```bash
189
+ docker pull harbor.jatic.net/aria/dataeval:0.1.0-cu118
190
+ ```
191
+
192
+ **Verifying the signature** — every published image is signed with
193
+ [cosign](https://docs.sigstore.dev/cosign/). The public key is committed at
194
+ [docker/cosign.pub](docker/cosign.pub).
195
+
196
+ ```bash
197
+ cosign verify --key docker/cosign.pub harbor.jatic.net/aria/dataeval:cu118
198
+ ```
199
+
200
+ Then drop the `dataeval:cu118` reference in the Quick Start `docker run`
201
+ commands above with the fully-qualified `harbor.jatic.net/aria/dataeval:cu118`
202
+ (or pinned version) and skip step 1.
203
+
204
+ > **Note on feature branches.** Containers are only built and published from
205
+ > `main` and release tags — no image is produced for MRs or topic branches. If
206
+ > you want to run a feature branch as a container, check it out and follow the
207
+ > Quick Start to build locally; the resulting image will pick up the branch's
208
+ > version via `git describe`.
209
+
210
+ ## Requirements
211
+
212
+ | Requirement | Version |
213
+ | ------------- | --------------------- |
214
+ | Docker | >= 20.10 |
215
+ | NVIDIA GPU | Any (for GPU mode) |
216
+ | NVIDIA Driver | >= 520 (for GPU mode) |
217
+ | CUDA | 11.8.0 (for GPU mode) |
218
+
219
+ ### Verify GPU Access
220
+
221
+ ```bash
222
+ docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi
223
+ ```
224
+
225
+ ## Volume Mounts
226
+
227
+ | Path | Mode | Purpose |
228
+ | ----------- | ---- | ----------------------------------------------------- |
229
+ | `/dataeval` | ro | Data directory — datasets, models, configs (required) |
230
+ | `/output` | rw | Results (required) |
231
+ | `/cache` | rw | Computation cache (optional) |
232
+
233
+ ### File Permissions
234
+
235
+ The container runs as a non-root user (`dataeval`, UID 1000). Mounted
236
+ directories for `/output` and `/cache` must be writable by the container
237
+ process. There are two approaches:
238
+
239
+ #### Option 1: Pass your host UID (recommended)
240
+
241
+ Use `--user` to run the container as your host user, so mounted directories are naturally writable:
242
+
243
+ ```bash
244
+ docker run --gpus all \
245
+ --user "$(id -u):$(id -g)" \
246
+ --mount type=bind,source=/path/to/data,target=/dataeval,readonly \
247
+ --mount type=bind,source=/path/to/output,target=/output \
248
+ dataeval:cu118
249
+ ```
250
+
251
+ #### Option 2: Open directory permissions
252
+
253
+ Make the output and cache directories world-writable on the host:
254
+
255
+ ```bash
256
+ chmod 777 /path/to/output /path/to/cache
257
+ ```
258
+
259
+ Then run without `--user`. This is simpler but less secure.
260
+
261
+ ### Custom Data Root
262
+
263
+ The data root path can be overridden via the `DATAEVAL_DATA` environment variable:
264
+
265
+ ```bash
266
+ docker run --gpus all \
267
+ -e DATAEVAL_DATA=/data \
268
+ --mount type=bind,source=/path/to/data,target=/data,readonly \
269
+ --mount type=bind,source=/path/to/output,target=/output \
270
+ dataeval:cu118
271
+ ```
272
+
273
+ ## Environment Variables
274
+
275
+ All runtime environment variables are optional; command-line options take
276
+ precedence over them (see [Input Precedence](#input-precedence) below).
277
+
278
+ | Variable | Purpose | Default |
279
+ | ----------------- | ----------------------------------------------- | --------------------------------------------------------- |
280
+ | `DATAEVAL_DATA` | Input data root — datasets, models, and configs | `/dataeval` in the container; current directory otherwise |
281
+ | `DATAEVAL_OUTPUT` | Directory for results and reports | `/output` in the container |
282
+ | `DATAEVAL_CACHE` | Disk-backed computation cache (optional) | `/cache` when that mount is present and writable |
283
+
284
+ No secret mounts or credentials are required — DataEval Flow uses no API keys,
285
+ tokens, or passwords. (`DATAEVAL_FLOW_VERSION` and `DATAEVAL_NOX_UV_EXTRAS_OVERRIDE`
286
+ are build-time only and are not read at run time.)
287
+
288
+ ## Input Precedence
289
+
290
+ For any input, the resolution order is:
291
+
292
+ 1. **Command-line option** — `--config`, `--data`, `--output`, `--cache`
293
+ 2. **Environment variable** — `DATAEVAL_DATA`, `DATAEVAL_OUTPUT`, `DATAEVAL_CACHE`
294
+ 3. **Built-in default** — the container mount paths above (or the current
295
+ directory outside the container)
296
+
297
+ Dataset and model paths inside a config file are resolved relative to the data
298
+ root; a relative path not found directly is also looked up under the conventional
299
+ `data/` (datasets) and `models/` (models) subfolders of the data root.
300
+
301
+ ## Interface Documentation
302
+
303
+ The container prints its full interface — mounts, environment variables, CLI
304
+ options, precedence, and examples — via its help command, which is also the
305
+ default when the container runs with no pipeline arguments:
306
+
307
+ ```bash
308
+ docker run dataeval:cu118 --help
309
+ ```
310
+
311
+ The library form exposes the same options via `python -m dataeval_flow --help`.
312
+ The published [container reference](https://dataeval-flow.readthedocs.io/en/latest/reference/containers.html)
313
+ documents every input, default, and configuration dependency.
314
+
315
+ ## Configuration
316
+
317
+ Config files (YAML or JSON) can be placed anywhere in your data directory. By
318
+ default, all YAML/JSON files at the root of the data mount are auto-discovered
319
+ and merged.
320
+
321
+ To specify a config path explicitly:
322
+
323
+ ```bash
324
+ # Config folder within data directory
325
+ docker run --gpus all \
326
+ --mount type=bind,source=/path/to/data,target=/dataeval,readonly \
327
+ --mount type=bind,source=/path/to/output,target=/output \
328
+ dataeval:cu118 --config config/
329
+
330
+ # Single config file
331
+ docker run --gpus all \
332
+ --mount type=bind,source=/path/to/data,target=/dataeval,readonly \
333
+ --mount type=bind,source=/path/to/output,target=/output \
334
+ dataeval:cu118 --config params.yaml
335
+ ```
336
+
337
+ Dataset and model paths in config files are resolved relative to the data root (`/dataeval` by default).
338
+
339
+ ## Dataset Formats
340
+
341
+ Currently supported dataset structures:
342
+
343
+ | Format | Structure | Example |
344
+ | --------------- | -------------------------------------------------- | --------------- |
345
+ | **Dataset** | Single split, used directly | `cifar10_test/` |
346
+ | **DatasetDict** | Multiple splits (dict), configured via config YAML | `cifar10_full/` |
347
+
348
+ ## CPU Fallback
349
+
350
+ For machines without NVIDIA GPU:
351
+
352
+ ```bash
353
+ docker build -f docker/Dockerfile.cpu -t dataeval:cpu .
354
+ docker run dataeval:cpu # Shows help
355
+ docker run \
356
+ --mount type=bind,source=/path/to/data,target=/dataeval,readonly \
357
+ --mount type=bind,source=/path/to/output,target=/output \
358
+ dataeval:cpu
359
+ ```
360
+
361
+ ## CLI Modes
362
+
363
+ DataEval Flow has three modes:
364
+
365
+ | Command | Purpose |
366
+ | ---------------------- | ---------------------------------------------------------------- |
367
+ | `dataeval-flow [opts]` | Headless execution — for automation and CI/CD pipelines |
368
+ | `dataeval-flow app` | Interactive TUI dashboard — configure, execute, and view results |
369
+ | `dataeval-flow config` | Simple CLI config builder — create/edit configs without the TUI |
370
+
371
+ ### Interactive TUI (`app`)
372
+
373
+ **Installation:**
374
+
375
+ ```bash
376
+ uv sync --extra app # or: pip install dataeval-flow[app]
377
+ ```
378
+
379
+ **Usage:**
380
+
381
+ ```bash
382
+ # Launch with a blank config
383
+ python -m dataeval_flow app
384
+
385
+ # Load an existing config for editing
386
+ python -m dataeval_flow app --config /path/to/params.yaml
387
+ ```
388
+
389
+ The TUI provides a three-pane dashboard for config editing, task execution, and
390
+ result viewing. It auto-discovers available torchvision transforms, dataeval
391
+ selection classes, and workflow types, generating dynamic parameter forms from
392
+ their schemas.
393
+
394
+ ### Simple CLI Config Builder (`config`)
395
+
396
+ For environments without the TUI dependency:
397
+
398
+ ```bash
399
+ python -m dataeval_flow config
400
+ python -m dataeval_flow config --config /path/to/params.yaml
401
+ ```
402
+
403
+ Configs can be saved as YAML or JSON.
404
+
405
+ ## Dependencies
406
+
407
+ - `dataeval` - Core evaluation library
408
+ - `datamaite` - MAITE protocol dataset loaders
409
+ - `maite` - MAITE protocol library
410
+ - `pydantic` - Structural typing and schema validation
411
+
412
+ ## Troubleshooting
413
+
414
+ ### Build appears stuck at `uv sync`
415
+
416
+ The Docker build may appear frozen during the `uv sync` step:
417
+
418
+ ```text
419
+ => [builder 7/7] RUN uv sync --frozen --no-dev --no-install-project 1139.3s
420
+ ```
421
+
422
+ **This is normal.** The step downloads ~2GB of dependencies (PyTorch, scipy, etc.) with no progress indicator.
423
+
424
+ | Network Speed | Expected Build Time |
425
+ | ------------- | ------------------- |
426
+ | 100 Mbps | ~10 minutes |
427
+ | 30 Mbps | ~20 minutes |
428
+ | 10 Mbps | ~45 minutes |
429
+
430
+ **Tip:** First build is slow; subsequent builds use Docker cache and complete in seconds.
431
+
432
+ ## Running Without Container
433
+
434
+ The `dataeval_flow` package can be used standalone without Docker.
435
+
436
+ **Installation:**
437
+
438
+ See the [Installation guide](https://dataeval-flow.readthedocs.io/en/latest/home/installation.html)
439
+ for the full matrix. In short:
440
+
441
+ `pip` from PyPI (no source checkout). PyTorch arrives transitively via `dataeval`.
442
+ To choose a variant, install `torch` from that variant's index **first**, then install
443
+ DataEval Flow — it accepts the build already present (omit step 1 and you'll get the
444
+ CUDA-bundled manylinux build of torch from PyPI, which is much larger):
445
+
446
+ ```bash
447
+ # 1. Pick your PyTorch build (cpu / cu118 / cu128)
448
+ pip install torch torchvision --index-url https://download.pytorch.org/whl/cu128
449
+
450
+ # 2. Install DataEval Flow
451
+ pip install dataeval-flow
452
+ ```
453
+
454
+ > **Use `--index-url`, not `--extra-index-url`, to pick a CUDA build.**
455
+ > `--extra-index-url` *adds* an index instead of replacing PyPI, and pip then takes the
456
+ > highest version across both. The CUDA indexes lag the latest PyTorch release, so PyPI
457
+ > usually wins and you silently get the default CUDA-bundled build — the install
458
+ > succeeds with no warning. `--index-url` replaces the index outright, so it is
459
+ > reliable. (For CPU only, `pip install dataeval-flow --extra-index-url
460
+ > https://download.pytorch.org/whl/cpu` does work, because the CPU index tracks the
461
+ > latest release.)
462
+
463
+ `torchvision` is not installed by default — it is imported lazily and is only needed
464
+ for preprocessing pipelines, the torchvision dataset adapter, and the TUI's transform
465
+ discovery. Install it together with `torch` in step 1 so both come from the same index.
466
+ Feature extras (`onnx`, `onnx-gpu`, `opencv`, `app`, `ontology`) work normally under
467
+ pip and are independent of the PyTorch variant:
468
+
469
+ ```bash
470
+ pip install "dataeval-flow[onnx,opencv,app]"
471
+ ```
472
+
473
+ > **The `cpu` / `cu118` / `cu128` extras do not select a PyTorch variant under pip.**
474
+ > All three declare the same requirements (`torch`, `torchvision`); what distinguishes
475
+ > them is `[tool.uv.sources]`, which routes those packages to the right wheel index.
476
+ > That is project metadata applied by uv when resolving **from source** — it is not
477
+ > part of the published wheel. Under pip their only real effect is pulling in
478
+ > `torchvision`. Select the variant with `--index-url` under pip, `--torch-backend`
479
+ > under `uv pip`, and use the extras only for source installs.
480
+
481
+ `uv` from PyPI:
482
+
483
+ ```bash
484
+ uv pip install dataeval-flow --torch-backend cpu # or cu118 / cu128 / auto
485
+ ```
486
+
487
+ `uv` from source (default toolchain; uses committed `uv.lock`) — extras apply here:
488
+
489
+ ```bash
490
+ git clone https://github.com/aria-ml/dataeval-flow.git
491
+ cd dataeval-flow
492
+ uv sync --extra cpu # or cu118 / cu128; add --extra onnx --extra opencv --extra app as needed
493
+ ```
494
+
495
+ `poetry` (source checkout; uses committed `poetry.lock`):
496
+
497
+ ```bash
498
+ git clone https://github.com/aria-ml/dataeval-flow.git
499
+ cd dataeval-flow
500
+ poetry install
501
+ ```
502
+
503
+ `conda` / `mamba` (source checkout; uses committed `environment.yml`):
504
+
505
+ ```bash
506
+ git clone https://github.com/aria-ml/dataeval-flow.git
507
+ cd dataeval-flow
508
+ conda env create -f environment.yml
509
+ conda activate dataeval-flow
510
+ pip install -e . # install the package itself; conda manages deps
511
+ ```
512
+
513
+ Notes:
514
+
515
+ - PyTorch is installed from PyPI/`download.pytorch.org` in every path
516
+ (it is no longer maintained on conda-forge).
517
+ - GPU variants (`cu118`, `cu128`) are only wired through `uv` and
518
+ `pip` today; the Poetry/conda paths install the CPU build of PyTorch.
519
+
520
+ **CLI Usage:**
521
+
522
+ ```bash
523
+ python -m dataeval_flow --config /path/to/config --output /path/to/output
524
+ python -m dataeval_flow --data /path/to/data --output /path/to/output
525
+ ```
526
+
527
+ **Python API Usage:**
528
+
529
+ ```python
530
+ from pathlib import Path
531
+ from dataeval_flow import load_config, run_tasks
532
+
533
+ config = load_config(Path("/path/to/data/config.yaml"))
534
+ results = run_tasks(config, data_dir=Path("/path/to/data"))
535
+ print(results[0].report())
536
+ ```
537
+
538
+ **Development:**
539
+
540
+ ```bash
541
+ uvx --with nox-uv nox -s dev # build .venv with the dev toolchain
542
+ source .venv/bin/activate
543
+ nox # run the default sessions
544
+ ```
545
+
546
+ `nox -s dev` prompts for the Python version and device variant, records the choice
547
+ in `.cuda-version` so the other sessions match it, and installs the `onnx` and
548
+ `app` extras alongside. See
549
+ [Development Setup](./CONTRIBUTING.md#development-setup) for the arguments it takes.
550
+
551
+ ## Versioning
552
+
553
+ The package version is **derived from git tags** — there is no hardcoded version
554
+ anywhere in the source tree. `hatch-vcs` reads `git describe --tags` at
555
+ build/install time and writes the resolved version to a generated
556
+ `src/dataeval_flow/_version.py` (gitignored), which `dataeval_flow.__init__`
557
+ imports at runtime.
558
+
559
+ **Release flow for container images:**
560
+
561
+ 1. Push a semver tag (e.g. `v0.2.0`) — this is the single source of truth for the release version.
562
+ 2. The `push:docker` CI job runs `git describe --tags --always --dirty | sed
563
+ 's/^v//'` to resolve `${VERSION}`, then passes `--build-arg
564
+ DATAEVAL_FLOW_VERSION="${VERSION}"` to `docker buildx build` for both the
565
+ `test` and `prod` stages.
566
+ 3. The `prod` stage in [docker/Dockerfile.j2](docker/Dockerfile.j2) redeclares the ARG and:
567
+ - Bakes the resolved version into `/app/src/dataeval_flow/_version.py` so
568
+ `dataeval_flow.__version__` matches the wheel version at runtime.
569
+ - Stamps the OCI `org.opencontainers.image.version` label with the same value.
570
+ 4. The image is pushed to Harbor and cosign-signed.
571
+
572
+ The `ARG DATAEVAL_FLOW_VERSION="…"` default rendered into each committed
573
+ `docker/Dockerfile.<variant>` by `docker/generate.py` is only used for **local**
574
+ `docker build` invocations that don't pass `--build-arg`. Release builds always
575
+ override it, so the committed default is allowed to drift from the latest tag and
576
+ does not need to be regenerated at release time.
577
+
578
+ ## License
579
+
580
+ MIT — see [LICENSE](LICENSE).
581
+
582
+ ## Contributing
583
+
584
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for bug reports and contribution
585
+ guidelines, and [BRANCHING.md](BRANCHING.md) for the branching and release
586
+ strategy.
587
+
588
+ ## Contact
589
+
590
+ For questions or feedback, reach out to <dataeval-flow@ariacoustics.com>.
591
+
592
+ ## Acknowledgement
593
+
594
+ ### CDAO Funding Acknowledgement
595
+
596
+ <!-- start acknowledgement -->
597
+
598
+ This material is based upon work supported by the Chief Digital and Artificial
599
+ Intelligence Office under Contract No. W519TC-23-9-2033. The views and
600
+ conclusions contained herein are those of the author(s) and should not be
601
+ interpreted as necessarily representing the official policies or endorsements,
602
+ either expressed or implied, of the U.S. Government.
603
+
604
+ <!-- end acknowledgement -->