dataeval-flow 0.1.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 (94) hide show
  1. dataeval_flow-0.1.0/.gitignore +54 -0
  2. dataeval_flow-0.1.0/LICENSE +21 -0
  3. dataeval_flow-0.1.0/PKG-INFO +305 -0
  4. dataeval_flow-0.1.0/README.md +230 -0
  5. dataeval_flow-0.1.0/pyproject.toml +277 -0
  6. dataeval_flow-0.1.0/src/dataeval_flow/__init__.py +93 -0
  7. dataeval_flow-0.1.0/src/dataeval_flow/__main__.py +149 -0
  8. dataeval_flow-0.1.0/src/dataeval_flow/_app/__init__.py +5 -0
  9. dataeval_flow-0.1.0/src/dataeval_flow/_app/_model/__init__.py +5 -0
  10. dataeval_flow-0.1.0/src/dataeval_flow/_app/_model/_coerce.py +126 -0
  11. dataeval_flow-0.1.0/src/dataeval_flow/_app/_model/_discover.py +171 -0
  12. dataeval_flow-0.1.0/src/dataeval_flow/_app/_model/_execution.py +108 -0
  13. dataeval_flow-0.1.0/src/dataeval_flow/_app/_model/_introspect.py +280 -0
  14. dataeval_flow-0.1.0/src/dataeval_flow/_app/_model/_item.py +213 -0
  15. dataeval_flow-0.1.0/src/dataeval_flow/_app/_model/_registry.py +255 -0
  16. dataeval_flow-0.1.0/src/dataeval_flow/_app/_model/_state.py +322 -0
  17. dataeval_flow-0.1.0/src/dataeval_flow/_app/_model/_undo.py +61 -0
  18. dataeval_flow-0.1.0/src/dataeval_flow/_app/_panes/__init__.py +35 -0
  19. dataeval_flow-0.1.0/src/dataeval_flow/_app/_panes/_config_pane.py +173 -0
  20. dataeval_flow-0.1.0/src/dataeval_flow/_app/_panes/_result_pane.py +125 -0
  21. dataeval_flow-0.1.0/src/dataeval_flow/_app/_panes/_task_pane.py +91 -0
  22. dataeval_flow-0.1.0/src/dataeval_flow/_app/_panes/_widgets.py +111 -0
  23. dataeval_flow-0.1.0/src/dataeval_flow/_app/_screens/__init__.py +25 -0
  24. dataeval_flow-0.1.0/src/dataeval_flow/_app/_screens/_base.py +242 -0
  25. dataeval_flow-0.1.0/src/dataeval_flow/_app/_screens/_detail.py +333 -0
  26. dataeval_flow-0.1.0/src/dataeval_flow/_app/_screens/_model.py +102 -0
  27. dataeval_flow-0.1.0/src/dataeval_flow/_app/_screens/_params.py +80 -0
  28. dataeval_flow-0.1.0/src/dataeval_flow/_app/_screens/_pathpicker.py +68 -0
  29. dataeval_flow-0.1.0/src/dataeval_flow/_app/_screens/_section.py +621 -0
  30. dataeval_flow-0.1.0/src/dataeval_flow/_app/_screens/_settings.py +183 -0
  31. dataeval_flow-0.1.0/src/dataeval_flow/_app/_viewmodel/__init__.py +15 -0
  32. dataeval_flow-0.1.0/src/dataeval_flow/_app/_viewmodel/_builder_vm.py +272 -0
  33. dataeval_flow-0.1.0/src/dataeval_flow/_app/_viewmodel/_model_vm.py +70 -0
  34. dataeval_flow-0.1.0/src/dataeval_flow/_app/_viewmodel/_rendering.py +189 -0
  35. dataeval_flow-0.1.0/src/dataeval_flow/_app/_viewmodel/_result_vm.py +210 -0
  36. dataeval_flow-0.1.0/src/dataeval_flow/_app/_viewmodel/_section_vm.py +224 -0
  37. dataeval_flow-0.1.0/src/dataeval_flow/_app/app.py +742 -0
  38. dataeval_flow-0.1.0/src/dataeval_flow/_app/cli.py +592 -0
  39. dataeval_flow-0.1.0/src/dataeval_flow/_logging.py +102 -0
  40. dataeval_flow-0.1.0/src/dataeval_flow/cache.py +1355 -0
  41. dataeval_flow-0.1.0/src/dataeval_flow/config/__init__.py +80 -0
  42. dataeval_flow-0.1.0/src/dataeval_flow/config/_loader.py +79 -0
  43. dataeval_flow-0.1.0/src/dataeval_flow/config/_merge.py +92 -0
  44. dataeval_flow-0.1.0/src/dataeval_flow/config/_models.py +115 -0
  45. dataeval_flow-0.1.0/src/dataeval_flow/config/_paths.py +85 -0
  46. dataeval_flow-0.1.0/src/dataeval_flow/config/schemas/__init__.py +112 -0
  47. dataeval_flow-0.1.0/src/dataeval_flow/config/schemas/_dataset.py +111 -0
  48. dataeval_flow-0.1.0/src/dataeval_flow/config/schemas/_extractor.py +119 -0
  49. dataeval_flow-0.1.0/src/dataeval_flow/config/schemas/_metadata.py +28 -0
  50. dataeval_flow-0.1.0/src/dataeval_flow/config/schemas/_preprocessor.py +18 -0
  51. dataeval_flow-0.1.0/src/dataeval_flow/config/schemas/_selection.py +100 -0
  52. dataeval_flow-0.1.0/src/dataeval_flow/config/schemas/_task.py +89 -0
  53. dataeval_flow-0.1.0/src/dataeval_flow/config/schemas/_workflow.py +135 -0
  54. dataeval_flow-0.1.0/src/dataeval_flow/dataset.py +635 -0
  55. dataeval_flow-0.1.0/src/dataeval_flow/embeddings.py +135 -0
  56. dataeval_flow-0.1.0/src/dataeval_flow/metadata.py +48 -0
  57. dataeval_flow-0.1.0/src/dataeval_flow/preprocessing.py +141 -0
  58. dataeval_flow-0.1.0/src/dataeval_flow/py.typed +0 -0
  59. dataeval_flow-0.1.0/src/dataeval_flow/runner.py +118 -0
  60. dataeval_flow-0.1.0/src/dataeval_flow/selection.py +50 -0
  61. dataeval_flow-0.1.0/src/dataeval_flow/workflow/__init__.py +328 -0
  62. dataeval_flow-0.1.0/src/dataeval_flow/workflow/_text_report.py +511 -0
  63. dataeval_flow-0.1.0/src/dataeval_flow/workflow/base.py +69 -0
  64. dataeval_flow-0.1.0/src/dataeval_flow/workflow/orchestrator.py +454 -0
  65. dataeval_flow-0.1.0/src/dataeval_flow/workflows/__init__.py +1 -0
  66. dataeval_flow-0.1.0/src/dataeval_flow/workflows/analysis/__init__.py +38 -0
  67. dataeval_flow-0.1.0/src/dataeval_flow/workflows/analysis/outputs.py +202 -0
  68. dataeval_flow-0.1.0/src/dataeval_flow/workflows/analysis/params.py +114 -0
  69. dataeval_flow-0.1.0/src/dataeval_flow/workflows/analysis/workflow.py +1313 -0
  70. dataeval_flow-0.1.0/src/dataeval_flow/workflows/cleaning/__init__.py +23 -0
  71. dataeval_flow-0.1.0/src/dataeval_flow/workflows/cleaning/outputs.py +200 -0
  72. dataeval_flow-0.1.0/src/dataeval_flow/workflows/cleaning/params.py +160 -0
  73. dataeval_flow-0.1.0/src/dataeval_flow/workflows/cleaning/report.py +304 -0
  74. dataeval_flow-0.1.0/src/dataeval_flow/workflows/cleaning/workflow.py +794 -0
  75. dataeval_flow-0.1.0/src/dataeval_flow/workflows/drift/__init__.py +1 -0
  76. dataeval_flow-0.1.0/src/dataeval_flow/workflows/drift/outputs.py +144 -0
  77. dataeval_flow-0.1.0/src/dataeval_flow/workflows/drift/params.py +332 -0
  78. dataeval_flow-0.1.0/src/dataeval_flow/workflows/drift/report.py +201 -0
  79. dataeval_flow-0.1.0/src/dataeval_flow/workflows/drift/workflow.py +647 -0
  80. dataeval_flow-0.1.0/src/dataeval_flow/workflows/ood/__init__.py +1 -0
  81. dataeval_flow-0.1.0/src/dataeval_flow/workflows/ood/outputs.py +134 -0
  82. dataeval_flow-0.1.0/src/dataeval_flow/workflows/ood/params.py +161 -0
  83. dataeval_flow-0.1.0/src/dataeval_flow/workflows/ood/report.py +311 -0
  84. dataeval_flow-0.1.0/src/dataeval_flow/workflows/ood/workflow.py +728 -0
  85. dataeval_flow-0.1.0/src/dataeval_flow/workflows/prioritization/__init__.py +1 -0
  86. dataeval_flow-0.1.0/src/dataeval_flow/workflows/prioritization/outputs.py +122 -0
  87. dataeval_flow-0.1.0/src/dataeval_flow/workflows/prioritization/params.py +124 -0
  88. dataeval_flow-0.1.0/src/dataeval_flow/workflows/prioritization/report.py +117 -0
  89. dataeval_flow-0.1.0/src/dataeval_flow/workflows/prioritization/workflow.py +587 -0
  90. dataeval_flow-0.1.0/src/dataeval_flow/workflows/splitting/__init__.py +25 -0
  91. dataeval_flow-0.1.0/src/dataeval_flow/workflows/splitting/outputs.py +101 -0
  92. dataeval_flow-0.1.0/src/dataeval_flow/workflows/splitting/params.py +61 -0
  93. dataeval_flow-0.1.0/src/dataeval_flow/workflows/splitting/report.py +485 -0
  94. dataeval_flow-0.1.0/src/dataeval_flow/workflows/splitting/workflow.py +371 -0
@@ -0,0 +1,54 @@
1
+ # Environment
2
+ .env
3
+ .venv/
4
+ __pycache__/
5
+ *.pyc
6
+ *.pyo
7
+
8
+ # IDE
9
+ .vscode/
10
+ .idea/
11
+ *.swp
12
+ *.swo
13
+
14
+ # Build artifacts
15
+ *.egg-info/
16
+ dist/
17
+ build/
18
+
19
+ # Cache
20
+ .pytest_cache/
21
+ .ruff_cache/
22
+ .mypy_cache/
23
+ .cache/
24
+ .dataeval_cache/
25
+
26
+ # Test/Build output
27
+ output/
28
+ .coverage
29
+ .coverage.*
30
+
31
+ # Generated notebooks (source of truth is MyST markdown)
32
+ *.ipynb
33
+
34
+ # Nox
35
+ .nox/
36
+ .cuda-version
37
+
38
+ # OS
39
+ .DS_Store
40
+ Thumbs.db
41
+
42
+ # Claude Code
43
+ .claude/
44
+
45
+ # Docker (local builds)
46
+ *.tar
47
+
48
+ # Logs
49
+ *.log
50
+
51
+ # Data (should be mounted, not committed)
52
+ docs/source/notebooks/**/
53
+ /data/
54
+ /output/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 ARiA
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,305 @@
1
+ Metadata-Version: 2.4
2
+ Name: dataeval-flow
3
+ Version: 0.1.0
4
+ Summary: DataEval Workflows container for data evaluation
5
+ Project-URL: Repository, https://gitlab.jatic.net/jatic/aria/dataeval-flow
6
+ License-Expression: MIT
7
+ License-File: LICENSE
8
+ Classifier: Development Status :: 3 - Alpha
9
+ Classifier: Intended Audience :: Science/Research
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.10
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: Topic :: Scientific/Engineering
17
+ Classifier: Typing :: Typed
18
+ Requires-Python: <3.14,>=3.10
19
+ Requires-Dist: dataeval==1.0.4
20
+ Requires-Dist: datasets>=4.0.0
21
+ Requires-Dist: maite-datasets>=0.0.12
22
+ Requires-Dist: pydantic>=2.0
23
+ Requires-Dist: pyyaml>=6.0
24
+ Provides-Extra: all-cpu
25
+ Requires-Dist: onnx>=1.15; extra == 'all-cpu'
26
+ Requires-Dist: onnxruntime>=1.20; extra == 'all-cpu'
27
+ Requires-Dist: opencv-python-headless>=4.8.0; extra == 'all-cpu'
28
+ Requires-Dist: textual>=3.0; extra == 'all-cpu'
29
+ Requires-Dist: torch>=2.2.0; extra == 'all-cpu'
30
+ Requires-Dist: torchvision>=0.17.0; extra == 'all-cpu'
31
+ Provides-Extra: all-cu118
32
+ Requires-Dist: onnx>=1.15; extra == 'all-cu118'
33
+ Requires-Dist: onnxruntime-gpu>=1.20; extra == 'all-cu118'
34
+ Requires-Dist: opencv-python-headless>=4.8.0; extra == 'all-cu118'
35
+ Requires-Dist: textual>=3.0; extra == 'all-cu118'
36
+ Requires-Dist: torch>=2.2.0; extra == 'all-cu118'
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
+ Provides-Extra: all-cu128
46
+ Requires-Dist: onnx>=1.15; extra == 'all-cu128'
47
+ Requires-Dist: onnxruntime-gpu>=1.23.2; extra == 'all-cu128'
48
+ Requires-Dist: opencv-python-headless>=4.8.0; extra == 'all-cu128'
49
+ Requires-Dist: textual>=3.0; extra == 'all-cu128'
50
+ Requires-Dist: torch>=2.2.0; extra == 'all-cu128'
51
+ Requires-Dist: torchvision>=0.17.0; extra == 'all-cu128'
52
+ Provides-Extra: app
53
+ Requires-Dist: textual>=3.0; extra == 'app'
54
+ Provides-Extra: cpu
55
+ Requires-Dist: torch>=2.2.0; extra == 'cpu'
56
+ Requires-Dist: torchvision>=0.17.0; extra == 'cpu'
57
+ Provides-Extra: cu118
58
+ Requires-Dist: torch>=2.2.0; extra == 'cu118'
59
+ 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
+ Provides-Extra: cu128
64
+ Requires-Dist: torch>=2.2.0; extra == 'cu128'
65
+ Requires-Dist: torchvision>=0.17.0; extra == 'cu128'
66
+ Provides-Extra: onnx
67
+ Requires-Dist: onnx>=1.15; extra == 'onnx'
68
+ Requires-Dist: onnxruntime>=1.20; extra == 'onnx'
69
+ Provides-Extra: onnx-gpu
70
+ Requires-Dist: onnx>=1.15; extra == 'onnx-gpu'
71
+ Requires-Dist: onnxruntime-gpu>=1.20; extra == 'onnx-gpu'
72
+ Provides-Extra: opencv
73
+ Requires-Dist: opencv-python-headless>=4.8.0; extra == 'opencv'
74
+ Description-Content-Type: text/markdown
75
+
76
+ # DataEval Workflows
77
+
78
+ Workflow orchestration for DataEval with GPU support.
79
+
80
+ ## Quick Start
81
+
82
+ ```bash
83
+ # 1. Build CUDA 11.8 container
84
+ docker build -f docker/Dockerfile.cu118 -t dataeval:cu118 .
85
+
86
+ # 2. Show help
87
+ docker run dataeval:cu118
88
+
89
+ # 3. Run with data and output
90
+ docker run --gpus all \
91
+ --mount type=bind,source=/path/to/data,target=/dataeval,readonly \
92
+ --mount type=bind,source=/path/to/output,target=/output \
93
+ dataeval:cu118
94
+ ```
95
+
96
+ ## Requirements
97
+
98
+ | Requirement | Version |
99
+ |-------------|---------|
100
+ | Docker | >= 20.10 |
101
+ | NVIDIA GPU | Any (for GPU mode) |
102
+ | NVIDIA Driver | >= 520 (for GPU mode) |
103
+ | CUDA | 11.8.0 (for GPU mode) |
104
+
105
+ ### Verify GPU Access
106
+
107
+ ```bash
108
+ docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi
109
+ ```
110
+
111
+ ## Volume Mounts
112
+
113
+ | Path | Mode | Purpose |
114
+ |------|------|---------|
115
+ | `/dataeval` | ro | Data directory — datasets, models, configs (required) |
116
+ | `/output` | rw | Results (required) |
117
+ | `/cache` | rw | Computation cache (optional) |
118
+
119
+ ### File Permissions
120
+
121
+ The container runs as a non-root user (`dataeval`, UID 1000). Mounted directories for `/output` and `/cache` must be writable by the container process. There are two approaches:
122
+
123
+ #### Option 1: Pass your host UID (recommended)
124
+
125
+ Use `--user` to run the container as your host user, so mounted directories are naturally writable:
126
+
127
+ ```bash
128
+ docker run --gpus all \
129
+ --user "$(id -u):$(id -g)" \
130
+ --mount type=bind,source=/path/to/data,target=/dataeval,readonly \
131
+ --mount type=bind,source=/path/to/output,target=/output \
132
+ dataeval:cu118
133
+ ```
134
+
135
+ #### Option 2: Open directory permissions
136
+
137
+ Make the output and cache directories world-writable on the host:
138
+
139
+ ```bash
140
+ chmod 777 /path/to/output /path/to/cache
141
+ ```
142
+
143
+ Then run without `--user`. This is simpler but less secure.
144
+
145
+ ### Custom Data Root
146
+
147
+ The data root path can be overridden via the `DATAEVAL_DATA` environment variable:
148
+
149
+ ```bash
150
+ docker run --gpus all \
151
+ -e DATAEVAL_DATA=/data \
152
+ --mount type=bind,source=/path/to/data,target=/data,readonly \
153
+ --mount type=bind,source=/path/to/output,target=/output \
154
+ dataeval:cu118
155
+ ```
156
+
157
+ ## Configuration
158
+
159
+ Config files (YAML or JSON) can be placed anywhere in your data directory. By default, all YAML/JSON files at the root of the data mount are auto-discovered and merged.
160
+
161
+ To specify a config path explicitly:
162
+
163
+ ```bash
164
+ # Config folder within data directory
165
+ docker run --gpus all \
166
+ --mount type=bind,source=/path/to/data,target=/dataeval,readonly \
167
+ --mount type=bind,source=/path/to/output,target=/output \
168
+ dataeval:cu118 --config config/
169
+
170
+ # Single config file
171
+ docker run --gpus all \
172
+ --mount type=bind,source=/path/to/data,target=/dataeval,readonly \
173
+ --mount type=bind,source=/path/to/output,target=/output \
174
+ dataeval:cu118 --config params.yaml
175
+ ```
176
+
177
+ Dataset and model paths in config files are resolved relative to the data root (`/dataeval` by default).
178
+
179
+ ## Dataset Formats
180
+
181
+ Currently supported dataset structures:
182
+
183
+ | Format | Structure | Example |
184
+ |--------|-----------|---------|
185
+ | **Dataset** | Single split, used directly | `cifar10_test/` |
186
+ | **DatasetDict** | Multiple splits (dict), configured via config YAML | `cifar10_full/` |
187
+
188
+ ## CPU Fallback
189
+
190
+ For machines without NVIDIA GPU:
191
+
192
+ ```bash
193
+ docker build -f docker/Dockerfile.cpu -t dataeval:cpu .
194
+ docker run dataeval:cpu # Shows help
195
+ docker run \
196
+ --mount type=bind,source=/path/to/data,target=/dataeval,readonly \
197
+ --mount type=bind,source=/path/to/output,target=/output \
198
+ dataeval:cpu
199
+ ```
200
+
201
+ ## CLI Modes
202
+
203
+ DataEval Flow has three modes:
204
+
205
+ | Command | Purpose |
206
+ | ---------------------- | ---------------------------------------------------------------- |
207
+ | `dataeval-flow [opts]` | Headless execution — for automation and CI/CD pipelines |
208
+ | `dataeval-flow app` | Interactive TUI dashboard — configure, execute, and view results |
209
+ | `dataeval-flow config` | Simple CLI config builder — create/edit configs without the TUI |
210
+
211
+ ### Interactive TUI (`app`)
212
+
213
+ **Installation:**
214
+
215
+ ```bash
216
+ uv sync --extra app # or: pip install dataeval-flow[app]
217
+ ```
218
+
219
+ **Usage:**
220
+
221
+ ```bash
222
+ # Launch with a blank config
223
+ python -m dataeval_flow app
224
+
225
+ # Load an existing config for editing
226
+ python -m dataeval_flow app --config /path/to/params.yaml
227
+ ```
228
+
229
+ The TUI provides a three-pane dashboard for config editing, task execution, and result viewing. It auto-discovers available torchvision transforms, dataeval selection classes, and workflow types, generating dynamic parameter forms from their schemas.
230
+
231
+ ### Simple CLI Config Builder (`config`)
232
+
233
+ For environments without the TUI dependency:
234
+
235
+ ```bash
236
+ python -m dataeval_flow config
237
+ python -m dataeval_flow config --config /path/to/params.yaml
238
+ ```
239
+
240
+ Configs can be saved as YAML or JSON.
241
+
242
+ ## Dependencies
243
+
244
+ - `dataeval` - Core evaluation library
245
+ - `datasets` - Huggingface library
246
+ - `maite-datasets` - MAITE protocol adapter
247
+ - `maite` - MAITE protocol library
248
+ - `pydantic` - Structural typing and schema validation
249
+
250
+ ## Troubleshooting
251
+
252
+ ### Build appears stuck at `uv sync`
253
+
254
+ The Docker build may appear frozen during the `uv sync` step:
255
+
256
+ ```
257
+ => [builder 7/7] RUN uv sync --frozen --no-dev --no-install-project 1139.3s
258
+ ```
259
+
260
+ **This is normal.** The step downloads ~2GB of dependencies (PyTorch, scipy, etc.) with no progress indicator.
261
+
262
+ | Network Speed | Expected Build Time |
263
+ |---------------|---------------------|
264
+ | 100 Mbps | ~10 minutes |
265
+ | 30 Mbps | ~20 minutes |
266
+ | 10 Mbps | ~45 minutes |
267
+
268
+ **Tip:** First build is slow; subsequent builds use Docker cache and complete in seconds.
269
+
270
+ ## Running Without Container
271
+
272
+ The `dataeval_flow` package can be used standalone without Docker.
273
+
274
+ **Installation:**
275
+ ```bash
276
+ git clone https://gitlab.jatic.net/jatic/aria/dataeval-flow.git
277
+ cd dataeval-flow
278
+ uv sync
279
+ ```
280
+
281
+ **CLI Usage:**
282
+ ```bash
283
+ python -m dataeval_flow --config /path/to/config --output /path/to/output
284
+ python -m dataeval_flow --data /path/to/data --output /path/to/output
285
+ ```
286
+
287
+ **Python API Usage:**
288
+ ```python
289
+ from pathlib import Path
290
+ from dataeval_flow import load_config, run_tasks
291
+
292
+ config = load_config(Path("/path/to/data/config.yaml"))
293
+ results = run_tasks(config, data_dir=Path("/path/to/data"))
294
+ print(results[0].report())
295
+ ```
296
+
297
+ **Development:**
298
+ ```bash
299
+ uv sync --group dev
300
+ nox
301
+ ```
302
+
303
+ ## License
304
+
305
+ MIT
@@ -0,0 +1,230 @@
1
+ # DataEval Workflows
2
+
3
+ Workflow orchestration for DataEval with GPU support.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ # 1. Build CUDA 11.8 container
9
+ docker build -f docker/Dockerfile.cu118 -t dataeval:cu118 .
10
+
11
+ # 2. Show help
12
+ docker run dataeval:cu118
13
+
14
+ # 3. Run with data and output
15
+ docker run --gpus all \
16
+ --mount type=bind,source=/path/to/data,target=/dataeval,readonly \
17
+ --mount type=bind,source=/path/to/output,target=/output \
18
+ dataeval:cu118
19
+ ```
20
+
21
+ ## Requirements
22
+
23
+ | Requirement | Version |
24
+ |-------------|---------|
25
+ | Docker | >= 20.10 |
26
+ | NVIDIA GPU | Any (for GPU mode) |
27
+ | NVIDIA Driver | >= 520 (for GPU mode) |
28
+ | CUDA | 11.8.0 (for GPU mode) |
29
+
30
+ ### Verify GPU Access
31
+
32
+ ```bash
33
+ docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi
34
+ ```
35
+
36
+ ## Volume Mounts
37
+
38
+ | Path | Mode | Purpose |
39
+ |------|------|---------|
40
+ | `/dataeval` | ro | Data directory — datasets, models, configs (required) |
41
+ | `/output` | rw | Results (required) |
42
+ | `/cache` | rw | Computation cache (optional) |
43
+
44
+ ### File Permissions
45
+
46
+ The container runs as a non-root user (`dataeval`, UID 1000). Mounted directories for `/output` and `/cache` must be writable by the container process. There are two approaches:
47
+
48
+ #### Option 1: Pass your host UID (recommended)
49
+
50
+ Use `--user` to run the container as your host user, so mounted directories are naturally writable:
51
+
52
+ ```bash
53
+ docker run --gpus all \
54
+ --user "$(id -u):$(id -g)" \
55
+ --mount type=bind,source=/path/to/data,target=/dataeval,readonly \
56
+ --mount type=bind,source=/path/to/output,target=/output \
57
+ dataeval:cu118
58
+ ```
59
+
60
+ #### Option 2: Open directory permissions
61
+
62
+ Make the output and cache directories world-writable on the host:
63
+
64
+ ```bash
65
+ chmod 777 /path/to/output /path/to/cache
66
+ ```
67
+
68
+ Then run without `--user`. This is simpler but less secure.
69
+
70
+ ### Custom Data Root
71
+
72
+ The data root path can be overridden via the `DATAEVAL_DATA` environment variable:
73
+
74
+ ```bash
75
+ docker run --gpus all \
76
+ -e DATAEVAL_DATA=/data \
77
+ --mount type=bind,source=/path/to/data,target=/data,readonly \
78
+ --mount type=bind,source=/path/to/output,target=/output \
79
+ dataeval:cu118
80
+ ```
81
+
82
+ ## Configuration
83
+
84
+ Config files (YAML or JSON) can be placed anywhere in your data directory. By default, all YAML/JSON files at the root of the data mount are auto-discovered and merged.
85
+
86
+ To specify a config path explicitly:
87
+
88
+ ```bash
89
+ # Config folder within data directory
90
+ docker run --gpus all \
91
+ --mount type=bind,source=/path/to/data,target=/dataeval,readonly \
92
+ --mount type=bind,source=/path/to/output,target=/output \
93
+ dataeval:cu118 --config config/
94
+
95
+ # Single config file
96
+ docker run --gpus all \
97
+ --mount type=bind,source=/path/to/data,target=/dataeval,readonly \
98
+ --mount type=bind,source=/path/to/output,target=/output \
99
+ dataeval:cu118 --config params.yaml
100
+ ```
101
+
102
+ Dataset and model paths in config files are resolved relative to the data root (`/dataeval` by default).
103
+
104
+ ## Dataset Formats
105
+
106
+ Currently supported dataset structures:
107
+
108
+ | Format | Structure | Example |
109
+ |--------|-----------|---------|
110
+ | **Dataset** | Single split, used directly | `cifar10_test/` |
111
+ | **DatasetDict** | Multiple splits (dict), configured via config YAML | `cifar10_full/` |
112
+
113
+ ## CPU Fallback
114
+
115
+ For machines without NVIDIA GPU:
116
+
117
+ ```bash
118
+ docker build -f docker/Dockerfile.cpu -t dataeval:cpu .
119
+ docker run dataeval:cpu # Shows help
120
+ docker run \
121
+ --mount type=bind,source=/path/to/data,target=/dataeval,readonly \
122
+ --mount type=bind,source=/path/to/output,target=/output \
123
+ dataeval:cpu
124
+ ```
125
+
126
+ ## CLI Modes
127
+
128
+ DataEval Flow has three modes:
129
+
130
+ | Command | Purpose |
131
+ | ---------------------- | ---------------------------------------------------------------- |
132
+ | `dataeval-flow [opts]` | Headless execution — for automation and CI/CD pipelines |
133
+ | `dataeval-flow app` | Interactive TUI dashboard — configure, execute, and view results |
134
+ | `dataeval-flow config` | Simple CLI config builder — create/edit configs without the TUI |
135
+
136
+ ### Interactive TUI (`app`)
137
+
138
+ **Installation:**
139
+
140
+ ```bash
141
+ uv sync --extra app # or: pip install dataeval-flow[app]
142
+ ```
143
+
144
+ **Usage:**
145
+
146
+ ```bash
147
+ # Launch with a blank config
148
+ python -m dataeval_flow app
149
+
150
+ # Load an existing config for editing
151
+ python -m dataeval_flow app --config /path/to/params.yaml
152
+ ```
153
+
154
+ The TUI provides a three-pane dashboard for config editing, task execution, and result viewing. It auto-discovers available torchvision transforms, dataeval selection classes, and workflow types, generating dynamic parameter forms from their schemas.
155
+
156
+ ### Simple CLI Config Builder (`config`)
157
+
158
+ For environments without the TUI dependency:
159
+
160
+ ```bash
161
+ python -m dataeval_flow config
162
+ python -m dataeval_flow config --config /path/to/params.yaml
163
+ ```
164
+
165
+ Configs can be saved as YAML or JSON.
166
+
167
+ ## Dependencies
168
+
169
+ - `dataeval` - Core evaluation library
170
+ - `datasets` - Huggingface library
171
+ - `maite-datasets` - MAITE protocol adapter
172
+ - `maite` - MAITE protocol library
173
+ - `pydantic` - Structural typing and schema validation
174
+
175
+ ## Troubleshooting
176
+
177
+ ### Build appears stuck at `uv sync`
178
+
179
+ The Docker build may appear frozen during the `uv sync` step:
180
+
181
+ ```
182
+ => [builder 7/7] RUN uv sync --frozen --no-dev --no-install-project 1139.3s
183
+ ```
184
+
185
+ **This is normal.** The step downloads ~2GB of dependencies (PyTorch, scipy, etc.) with no progress indicator.
186
+
187
+ | Network Speed | Expected Build Time |
188
+ |---------------|---------------------|
189
+ | 100 Mbps | ~10 minutes |
190
+ | 30 Mbps | ~20 minutes |
191
+ | 10 Mbps | ~45 minutes |
192
+
193
+ **Tip:** First build is slow; subsequent builds use Docker cache and complete in seconds.
194
+
195
+ ## Running Without Container
196
+
197
+ The `dataeval_flow` package can be used standalone without Docker.
198
+
199
+ **Installation:**
200
+ ```bash
201
+ git clone https://gitlab.jatic.net/jatic/aria/dataeval-flow.git
202
+ cd dataeval-flow
203
+ uv sync
204
+ ```
205
+
206
+ **CLI Usage:**
207
+ ```bash
208
+ python -m dataeval_flow --config /path/to/config --output /path/to/output
209
+ python -m dataeval_flow --data /path/to/data --output /path/to/output
210
+ ```
211
+
212
+ **Python API Usage:**
213
+ ```python
214
+ from pathlib import Path
215
+ from dataeval_flow import load_config, run_tasks
216
+
217
+ config = load_config(Path("/path/to/data/config.yaml"))
218
+ results = run_tasks(config, data_dir=Path("/path/to/data"))
219
+ print(results[0].report())
220
+ ```
221
+
222
+ **Development:**
223
+ ```bash
224
+ uv sync --group dev
225
+ nox
226
+ ```
227
+
228
+ ## License
229
+
230
+ MIT