modelmark 0.1.1__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.
- modelmark-0.1.2/PKG-INFO +179 -0
- modelmark-0.1.2/README.md +161 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/pyproject.toml +1 -1
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/common/parser.py +21 -19
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/constants.py +1 -8
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/modelmark.py +6 -6
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/models/conv.py +7 -7
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/models/gru.py +5 -5
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/models/linear.py +5 -5
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/models/lstm.py +8 -8
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/models/transformer.py +11 -11
- modelmark-0.1.2/src/modelmark.egg-info/PKG-INFO +179 -0
- modelmark-0.1.1/PKG-INFO +0 -112
- modelmark-0.1.1/README.md +0 -94
- modelmark-0.1.1/src/modelmark.egg-info/PKG-INFO +0 -112
- {modelmark-0.1.1 → modelmark-0.1.2}/LICENSE +0 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/setup.cfg +0 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/__init__.py +0 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/__main__.py +0 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/common/dataset.py +0 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/common/downloader.py +0 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/common/loader.py +0 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/common/logger.py +0 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/common/report.py +0 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/common/tester.py +0 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/common/utils.py +0 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/config.py +0 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark.egg-info/SOURCES.txt +0 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark.egg-info/dependency_links.txt +0 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark.egg-info/entry_points.txt +0 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark.egg-info/requires.txt +0 -0
- {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark.egg-info/top_level.txt +0 -0
modelmark-0.1.2/PKG-INFO
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: modelmark
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: Benchmark framework for neural network models
|
|
5
|
+
Author: Andrew Larin
|
|
6
|
+
License: MIT
|
|
7
|
+
Requires-Python: >=3.12
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Requires-Dist: numpy>=2.4
|
|
11
|
+
Requires-Dist: pandas>=3.0
|
|
12
|
+
Requires-Dist: torch>=2.12
|
|
13
|
+
Requires-Dist: tqdm>=4.67
|
|
14
|
+
Requires-Dist: playwright>=1.62
|
|
15
|
+
Requires-Dist: rich>=15.0
|
|
16
|
+
Requires-Dist: thop>=0.1
|
|
17
|
+
Dynamic: license-file
|
|
18
|
+
|
|
19
|
+
# ModelMark
|
|
20
|
+
|
|
21
|
+
ModelMark is a CLI benchmarking tool for comparing neural-network models. It runs your models on one or more datasets, records performance and efficiency statistics, and generates an easy-to-embed HTML/PNG report.
|
|
22
|
+
|
|
23
|
+

|
|
24
|
+
|
|
25
|
+
## Table of Contents
|
|
26
|
+
|
|
27
|
+
- [About](#about)
|
|
28
|
+
- [Requirements](#requirements)
|
|
29
|
+
- [Installation](#installation)
|
|
30
|
+
- [Quick Start](#quick-start)
|
|
31
|
+
- [Configuration](#configuration)
|
|
32
|
+
- [How the Benchmark Works](#how-the-benchmark-works)
|
|
33
|
+
- [Reported Metrics](#reported-metrics)
|
|
34
|
+
- [Examples](#examples)
|
|
35
|
+
- [Troubleshooting](#troubleshooting)
|
|
36
|
+
|
|
37
|
+
## About
|
|
38
|
+
|
|
39
|
+
For each benchmark run, ModelMark:
|
|
40
|
+
|
|
41
|
+
1. Selects the next combination of dataset, input/output size, model, and seed.
|
|
42
|
+
2. Seeds the random generators for reproducibility.
|
|
43
|
+
3. Creates the data loader, model, and tester objects.
|
|
44
|
+
4. Trains the model for the configured number of epochs and restores the checkpoint with the lowest validation loss.
|
|
45
|
+
5. Records runtime and efficiency statistics.
|
|
46
|
+
6. Evaluates the model on the dataset using the metrics from the configuration file.
|
|
47
|
+
|
|
48
|
+
After all runs finish, ModelMark aggregates the results and generates a report containing testing results, training statistics, and your machine metadata.
|
|
49
|
+
|
|
50
|
+
## Requirements
|
|
51
|
+
|
|
52
|
+
- OS: Windows or Linux
|
|
53
|
+
- Python: 3.12 or newer
|
|
54
|
+
- Git: required for installation from GitHub
|
|
55
|
+
|
|
56
|
+
## Installation
|
|
57
|
+
|
|
58
|
+
Install ModelMark from PyPI:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
pip install modelmark
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Quick Start
|
|
65
|
+
|
|
66
|
+
1. Run initialization in an empty folder:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
modelmark init
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
This creates two folders:
|
|
73
|
+
- `modelmark_files/` — configuration and log files
|
|
74
|
+
- `models/` — your model files
|
|
75
|
+
|
|
76
|
+
2. Edit the configuration file:
|
|
77
|
+
|
|
78
|
+
`modelmark_files/config.py`
|
|
79
|
+
|
|
80
|
+
It contains three main configuration blocks:
|
|
81
|
+
- `model_config` — model hyperparameters such as number of layers, hidden dimension, kernel size, etc.
|
|
82
|
+
- `data_config` — dataset parameters such as file path, input/output features, train/val ratios, etc.
|
|
83
|
+
- `test_config` — testing options such as optimizer, loss criterion, metrics, learning rate, etc.
|
|
84
|
+
|
|
85
|
+
3. Put the testing models to the `models/` folder.
|
|
86
|
+
|
|
87
|
+
Make sure to import model's class definitions to the `config.py`.
|
|
88
|
+
|
|
89
|
+
Configure `config.model_config` according to your task.
|
|
90
|
+
|
|
91
|
+
5. Download the dataset files (ETT by default):
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
modelmark load
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
6. Run the benchmark:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
modelmark run
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
7. View the generated report:
|
|
104
|
+
- `result.html`
|
|
105
|
+
- `result.png`
|
|
106
|
+
|
|
107
|
+
## Configuration
|
|
108
|
+
|
|
109
|
+
You can adjust the configuration and add your own model files in the `models/` directory to match your benchmarking needs.
|
|
110
|
+
|
|
111
|
+
Make sure your model implementation is compatible with the keys and settings used in your configuration.
|
|
112
|
+
|
|
113
|
+
A detailed configuration example is available at:
|
|
114
|
+
[src/modelmark/config.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/config.py)
|
|
115
|
+
|
|
116
|
+
A detailed example model is available at:
|
|
117
|
+
[src/modelmark/models/linear.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/models/linear.py)
|
|
118
|
+
|
|
119
|
+
## How the Benchmark Works
|
|
120
|
+
|
|
121
|
+
The benchmark consists of:
|
|
122
|
+
|
|
123
|
+
```text
|
|
124
|
+
F × O × M × S
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
where:
|
|
128
|
+
|
|
129
|
+
| Symbol | Meaning | Example |
|
|
130
|
+
|---|---|---|
|
|
131
|
+
| `F` | Number of dataset files in the configuration | `{"ETTh1": ..., "Weather": ...}` → `F = 2` |
|
|
132
|
+
| `O` | Number of input/output size configurations | `[32, 64, 128]` → `O = 3` |
|
|
133
|
+
| `M` | Number of models | `{"Linear": ..., "LSTM": ...}` → `M = 2` |
|
|
134
|
+
| `S` | Number of seeds | `[42, 43, 44]` → `S = 3` |
|
|
135
|
+
|
|
136
|
+
ModelMark repeats the training/evaluation process for each combination and stores the mean result over `S` runs. Using more seeds generally makes the comparison more fair and statistically stable.
|
|
137
|
+
|
|
138
|
+
## Reported Metrics
|
|
139
|
+
|
|
140
|
+
The report includes statistics such as:
|
|
141
|
+
|
|
142
|
+
| Metric | Description |
|
|
143
|
+
|---|---|
|
|
144
|
+
| Time | Average training time per epoch |
|
|
145
|
+
| Params | Total number of model parameters |
|
|
146
|
+
| GFLOPs | Average GFLOPs per batch |
|
|
147
|
+
| Peak Memory | Maximum memory observed during a training iteration |
|
|
148
|
+
|
|
149
|
+
The report also includes the evaluation metrics configured in `test_config` and your machine metadata.
|
|
150
|
+
|
|
151
|
+
## Examples
|
|
152
|
+
|
|
153
|
+
Run `modelmark init`, it will create config at `modelmark_files/config.py` and model's example folder at `models/` with Linear model file inside:
|
|
154
|
+
|
|
155
|
+
- Configuration example: [src/modelmark/config.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/config.py)
|
|
156
|
+
- Linear model example: [src/modelmark/models/linear.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/models/linear.py)
|
|
157
|
+
|
|
158
|
+
## Troubleshooting
|
|
159
|
+
|
|
160
|
+
If something does not work:
|
|
161
|
+
|
|
162
|
+
1. Check the application log:
|
|
163
|
+
`modelmark_files/modelmark.log`
|
|
164
|
+
2. Try restarting ModelMark:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
modelmark restart
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
3. If the issue persists, delete the `modelmark_files` folder and run:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
modelmark init
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
When opening an issue on GitHub, please include the relevant part of your log file.
|
|
177
|
+
|
|
178
|
+
If you have questions or want to inspect the source code, see the
|
|
179
|
+
[ModelMark GitHub repository](https://github.com/gloptim77/ModelMark/tree/main).
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# ModelMark
|
|
2
|
+
|
|
3
|
+
ModelMark is a CLI benchmarking tool for comparing neural-network models. It runs your models on one or more datasets, records performance and efficiency statistics, and generates an easy-to-embed HTML/PNG report.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
|
|
9
|
+
- [About](#about)
|
|
10
|
+
- [Requirements](#requirements)
|
|
11
|
+
- [Installation](#installation)
|
|
12
|
+
- [Quick Start](#quick-start)
|
|
13
|
+
- [Configuration](#configuration)
|
|
14
|
+
- [How the Benchmark Works](#how-the-benchmark-works)
|
|
15
|
+
- [Reported Metrics](#reported-metrics)
|
|
16
|
+
- [Examples](#examples)
|
|
17
|
+
- [Troubleshooting](#troubleshooting)
|
|
18
|
+
|
|
19
|
+
## About
|
|
20
|
+
|
|
21
|
+
For each benchmark run, ModelMark:
|
|
22
|
+
|
|
23
|
+
1. Selects the next combination of dataset, input/output size, model, and seed.
|
|
24
|
+
2. Seeds the random generators for reproducibility.
|
|
25
|
+
3. Creates the data loader, model, and tester objects.
|
|
26
|
+
4. Trains the model for the configured number of epochs and restores the checkpoint with the lowest validation loss.
|
|
27
|
+
5. Records runtime and efficiency statistics.
|
|
28
|
+
6. Evaluates the model on the dataset using the metrics from the configuration file.
|
|
29
|
+
|
|
30
|
+
After all runs finish, ModelMark aggregates the results and generates a report containing testing results, training statistics, and your machine metadata.
|
|
31
|
+
|
|
32
|
+
## Requirements
|
|
33
|
+
|
|
34
|
+
- OS: Windows or Linux
|
|
35
|
+
- Python: 3.12 or newer
|
|
36
|
+
- Git: required for installation from GitHub
|
|
37
|
+
|
|
38
|
+
## Installation
|
|
39
|
+
|
|
40
|
+
Install ModelMark from PyPI:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pip install modelmark
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Quick Start
|
|
47
|
+
|
|
48
|
+
1. Run initialization in an empty folder:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
modelmark init
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
This creates two folders:
|
|
55
|
+
- `modelmark_files/` — configuration and log files
|
|
56
|
+
- `models/` — your model files
|
|
57
|
+
|
|
58
|
+
2. Edit the configuration file:
|
|
59
|
+
|
|
60
|
+
`modelmark_files/config.py`
|
|
61
|
+
|
|
62
|
+
It contains three main configuration blocks:
|
|
63
|
+
- `model_config` — model hyperparameters such as number of layers, hidden dimension, kernel size, etc.
|
|
64
|
+
- `data_config` — dataset parameters such as file path, input/output features, train/val ratios, etc.
|
|
65
|
+
- `test_config` — testing options such as optimizer, loss criterion, metrics, learning rate, etc.
|
|
66
|
+
|
|
67
|
+
3. Put the testing models to the `models/` folder.
|
|
68
|
+
|
|
69
|
+
Make sure to import model's class definitions to the `config.py`.
|
|
70
|
+
|
|
71
|
+
Configure `config.model_config` according to your task.
|
|
72
|
+
|
|
73
|
+
5. Download the dataset files (ETT by default):
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
modelmark load
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
6. Run the benchmark:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
modelmark run
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
7. View the generated report:
|
|
86
|
+
- `result.html`
|
|
87
|
+
- `result.png`
|
|
88
|
+
|
|
89
|
+
## Configuration
|
|
90
|
+
|
|
91
|
+
You can adjust the configuration and add your own model files in the `models/` directory to match your benchmarking needs.
|
|
92
|
+
|
|
93
|
+
Make sure your model implementation is compatible with the keys and settings used in your configuration.
|
|
94
|
+
|
|
95
|
+
A detailed configuration example is available at:
|
|
96
|
+
[src/modelmark/config.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/config.py)
|
|
97
|
+
|
|
98
|
+
A detailed example model is available at:
|
|
99
|
+
[src/modelmark/models/linear.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/models/linear.py)
|
|
100
|
+
|
|
101
|
+
## How the Benchmark Works
|
|
102
|
+
|
|
103
|
+
The benchmark consists of:
|
|
104
|
+
|
|
105
|
+
```text
|
|
106
|
+
F × O × M × S
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
where:
|
|
110
|
+
|
|
111
|
+
| Symbol | Meaning | Example |
|
|
112
|
+
|---|---|---|
|
|
113
|
+
| `F` | Number of dataset files in the configuration | `{"ETTh1": ..., "Weather": ...}` → `F = 2` |
|
|
114
|
+
| `O` | Number of input/output size configurations | `[32, 64, 128]` → `O = 3` |
|
|
115
|
+
| `M` | Number of models | `{"Linear": ..., "LSTM": ...}` → `M = 2` |
|
|
116
|
+
| `S` | Number of seeds | `[42, 43, 44]` → `S = 3` |
|
|
117
|
+
|
|
118
|
+
ModelMark repeats the training/evaluation process for each combination and stores the mean result over `S` runs. Using more seeds generally makes the comparison more fair and statistically stable.
|
|
119
|
+
|
|
120
|
+
## Reported Metrics
|
|
121
|
+
|
|
122
|
+
The report includes statistics such as:
|
|
123
|
+
|
|
124
|
+
| Metric | Description |
|
|
125
|
+
|---|---|
|
|
126
|
+
| Time | Average training time per epoch |
|
|
127
|
+
| Params | Total number of model parameters |
|
|
128
|
+
| GFLOPs | Average GFLOPs per batch |
|
|
129
|
+
| Peak Memory | Maximum memory observed during a training iteration |
|
|
130
|
+
|
|
131
|
+
The report also includes the evaluation metrics configured in `test_config` and your machine metadata.
|
|
132
|
+
|
|
133
|
+
## Examples
|
|
134
|
+
|
|
135
|
+
Run `modelmark init`, it will create config at `modelmark_files/config.py` and model's example folder at `models/` with Linear model file inside:
|
|
136
|
+
|
|
137
|
+
- Configuration example: [src/modelmark/config.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/config.py)
|
|
138
|
+
- Linear model example: [src/modelmark/models/linear.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/models/linear.py)
|
|
139
|
+
|
|
140
|
+
## Troubleshooting
|
|
141
|
+
|
|
142
|
+
If something does not work:
|
|
143
|
+
|
|
144
|
+
1. Check the application log:
|
|
145
|
+
`modelmark_files/modelmark.log`
|
|
146
|
+
2. Try restarting ModelMark:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
modelmark restart
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
3. If the issue persists, delete the `modelmark_files` folder and run:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
modelmark init
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
When opening an issue on GitHub, please include the relevant part of your log file.
|
|
159
|
+
|
|
160
|
+
If you have questions or want to inspect the source code, see the
|
|
161
|
+
[ModelMark GitHub repository](https://github.com/gloptim77/ModelMark/tree/main).
|
|
@@ -21,22 +21,24 @@ class Parser:
|
|
|
21
21
|
formatter_class=argparse.RawTextHelpFormatter,
|
|
22
22
|
description = constants.PARSER_DESC
|
|
23
23
|
)
|
|
24
|
+
|
|
25
|
+
# Create a subparser container
|
|
26
|
+
subparsers = self.parser.add_subparsers(dest="command", required=True)
|
|
24
27
|
|
|
25
|
-
#
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
)
|
|
28
|
+
# Define your action words (subcommands)
|
|
29
|
+
subparsers.add_parser("init", help = "Test init, create the modelmark_files/, customizable config.py file and models/ with examples.")
|
|
30
|
+
subparsers.add_parser("load", help = "Dataset download, create the data/ folder and download ETT dataset there.")
|
|
31
|
+
subparsers.add_parser("run", help = "Run the test.")
|
|
32
|
+
subparsers.add_parser("clear", help = "Remove the modelmark_files folder.")
|
|
33
|
+
subparsers.add_parser("reset", help = "Runs clean and init.")
|
|
34
|
+
subparsers.add_parser("help", help = "Print the info above.")
|
|
35
|
+
|
|
36
|
+
self.args = self.parser.parse_args()
|
|
32
37
|
|
|
33
38
|
# Run without args / help request - print help
|
|
34
39
|
if len(sys.argv) == 1:
|
|
35
40
|
self.parser.print_help()
|
|
36
41
|
sys.exit(1)
|
|
37
|
-
|
|
38
|
-
# Parse argument values
|
|
39
|
-
self.args = self.parser.parse_args()
|
|
40
42
|
|
|
41
43
|
# Setup other
|
|
42
44
|
pd.set_option('display.colheader_justify', 'center')
|
|
@@ -45,38 +47,38 @@ class Parser:
|
|
|
45
47
|
"""Select the task and run"""
|
|
46
48
|
|
|
47
49
|
# Config initialization #
|
|
48
|
-
if self.args.
|
|
50
|
+
if self.args.command == "init":
|
|
49
51
|
self.init_config()
|
|
50
52
|
return 0
|
|
51
53
|
|
|
52
54
|
# Dataset download #
|
|
53
|
-
if self.args.
|
|
55
|
+
if self.args.command == "load":
|
|
54
56
|
download_dataset("ett")
|
|
55
57
|
return 0
|
|
56
58
|
|
|
57
59
|
# Run the test #
|
|
58
|
-
if self.args.
|
|
60
|
+
if self.args.command == "run":
|
|
59
61
|
return None
|
|
60
62
|
|
|
61
63
|
# Clean the config folder #
|
|
62
|
-
if self.args.
|
|
64
|
+
if self.args.command == "clear":
|
|
63
65
|
self.clear_config()
|
|
64
66
|
return 0
|
|
65
67
|
|
|
66
68
|
# Reset the modelmark config #
|
|
67
|
-
if self.args.
|
|
69
|
+
if self.args.command == "reset":
|
|
68
70
|
self.reset_config()
|
|
69
71
|
return 0
|
|
70
72
|
|
|
71
73
|
# Print the modelmark usage #
|
|
72
|
-
if self.args.
|
|
74
|
+
if self.args.command == "help":
|
|
73
75
|
self.parser.print_help()
|
|
74
76
|
return 0
|
|
75
77
|
|
|
76
78
|
# Check if task is correct #
|
|
77
|
-
if self.args.
|
|
78
|
-
logger.error(f"Unknown
|
|
79
|
-
console.print(f"Unknown
|
|
79
|
+
if self.args.command != "run":
|
|
80
|
+
logger.error(f"Unknown command: {self.args.command}, run 'modelmark help' for more info")
|
|
81
|
+
console.print(f"Unknown command: {self.args.command}, run 'modelmark help' for more info", style="red")
|
|
80
82
|
return 1
|
|
81
83
|
|
|
82
84
|
# Otherwise return error
|
|
@@ -24,11 +24,4 @@ USER_MODEL_PATH = USER_DIR / "models" / "linear.py"
|
|
|
24
24
|
PARSER_DESC = """MODELMARK
|
|
25
25
|
|
|
26
26
|
Python tool to measure the performance of a custom neural network model
|
|
27
|
-
and compare it to other popular architectures."""
|
|
28
|
-
PARSER_HELP = """\nModelmark available TASKs:
|
|
29
|
-
init - Test init, create the modelmark_files/, customizable config.py file and models/ with examples.
|
|
30
|
-
load - Dataset download, create the data/ folder and download ETT dataset there.
|
|
31
|
-
run - Run the test.
|
|
32
|
-
clear - Remove the modelmark_files folder.
|
|
33
|
-
reset - Runs clean and init.
|
|
34
|
-
"""
|
|
27
|
+
and compare it to other popular architectures."""
|
|
@@ -4,10 +4,10 @@ ModelMark
|
|
|
4
4
|
This tool will help you to test NN models against each other,
|
|
5
5
|
and form a detailed report that is easy to embed to a website.
|
|
6
6
|
|
|
7
|
-
It can download dataset with
|
|
8
|
-
modelmark
|
|
7
|
+
It can download ETT dataset with
|
|
8
|
+
modelmark load
|
|
9
9
|
It can run the test with
|
|
10
|
-
modelmark
|
|
10
|
+
modelmark run
|
|
11
11
|
|
|
12
12
|
Test consists of F * O * M * S steps, where:
|
|
13
13
|
F - number of dataset files in the config (e.g. ["ETTh1" : ..., "Weather" : ...] means F = 2)
|
|
@@ -31,9 +31,9 @@ ModelMark
|
|
|
31
31
|
|
|
32
32
|
About training stats:
|
|
33
33
|
|
|
34
|
-
Time
|
|
35
|
-
Params
|
|
36
|
-
GFLOPs
|
|
34
|
+
Time - average time per epoch
|
|
35
|
+
Params - total number of model params
|
|
36
|
+
GFLOPs - average per batch
|
|
37
37
|
Peak Memory - max per training iteration
|
|
38
38
|
|
|
39
39
|
---
|
|
@@ -11,8 +11,8 @@ class ConvModel(nn.Module):
|
|
|
11
11
|
# To avoid circular import, now it lives here
|
|
12
12
|
config = load_config()
|
|
13
13
|
|
|
14
|
-
self.
|
|
15
|
-
self.
|
|
14
|
+
self.input_dim = input_dim
|
|
15
|
+
self.output_dim = output_dim
|
|
16
16
|
self.input_len = input_len
|
|
17
17
|
self.output_len = output_len
|
|
18
18
|
|
|
@@ -22,7 +22,7 @@ class ConvModel(nn.Module):
|
|
|
22
22
|
|
|
23
23
|
layers = []
|
|
24
24
|
|
|
25
|
-
in_channels = self.
|
|
25
|
+
in_channels = self.input_dim
|
|
26
26
|
|
|
27
27
|
for _ in range(self.num_layers):
|
|
28
28
|
layers.append(
|
|
@@ -42,8 +42,8 @@ class ConvModel(nn.Module):
|
|
|
42
42
|
# Collapse the sequence dimension to one feature vector
|
|
43
43
|
self.pool = nn.AdaptiveAvgPool1d(1)
|
|
44
44
|
|
|
45
|
-
# Produce exactly context_size *
|
|
46
|
-
self.fc = nn.Linear(self.hidden_size, output_len * self.
|
|
45
|
+
# Produce exactly context_size * output_dim values
|
|
46
|
+
self.fc = nn.Linear(self.hidden_size, output_len * self.output_dim)
|
|
47
47
|
|
|
48
48
|
def forward(self, x):
|
|
49
49
|
"""
|
|
@@ -62,9 +62,9 @@ class ConvModel(nn.Module):
|
|
|
62
62
|
x = self.pool(x)
|
|
63
63
|
# [batch, hidden_size]
|
|
64
64
|
x = x.squeeze(-1)
|
|
65
|
-
# [batch, context_size *
|
|
65
|
+
# [batch, context_size * output_dim]
|
|
66
66
|
x = self.fc(x)
|
|
67
67
|
# Project to output dim and len
|
|
68
|
-
x = x.view(x.size(0), self.output_len, self.
|
|
68
|
+
x = x.view(x.size(0), self.output_len, self.output_dim)
|
|
69
69
|
|
|
70
70
|
return x
|
|
@@ -11,8 +11,8 @@ class GRUModel(nn.Module):
|
|
|
11
11
|
# To avoid circular import, now it lives here
|
|
12
12
|
config = load_config()
|
|
13
13
|
|
|
14
|
-
self.
|
|
15
|
-
self.
|
|
14
|
+
self.input_dim = input_dim
|
|
15
|
+
self.output_dim = output_dim
|
|
16
16
|
self.input_len = input_len
|
|
17
17
|
self.output_len = output_len
|
|
18
18
|
|
|
@@ -20,13 +20,13 @@ class GRUModel(nn.Module):
|
|
|
20
20
|
self.num_layers = config.model_config["GRU"]["num_layers"]
|
|
21
21
|
|
|
22
22
|
self.gru = nn.GRU(
|
|
23
|
-
input_size = self.
|
|
23
|
+
input_size = self.input_dim,
|
|
24
24
|
hidden_size = self.hidden_size,
|
|
25
25
|
num_layers = self.num_layers,
|
|
26
26
|
batch_first = True,
|
|
27
27
|
)
|
|
28
28
|
|
|
29
|
-
self.out = nn.Linear(self.hidden_size, self.output_len * self.
|
|
29
|
+
self.out = nn.Linear(self.hidden_size, self.output_len * self.output_dim)
|
|
30
30
|
|
|
31
31
|
def forward(self, x):
|
|
32
32
|
"""
|
|
@@ -44,6 +44,6 @@ class GRUModel(nn.Module):
|
|
|
44
44
|
|
|
45
45
|
x = self.out(h)
|
|
46
46
|
# Project to output dim and len
|
|
47
|
-
x = x.view(x.size(0), self.output_len, self.
|
|
47
|
+
x = x.view(x.size(0), self.output_len, self.output_dim)
|
|
48
48
|
|
|
49
49
|
return x
|
|
@@ -38,8 +38,8 @@ class Linear(nn.Module):
|
|
|
38
38
|
# It lives here to avoid circular config
|
|
39
39
|
config = load_config()
|
|
40
40
|
|
|
41
|
-
self.
|
|
42
|
-
self.
|
|
41
|
+
self.input_dim = input_dim
|
|
42
|
+
self.output_dim = output_dim
|
|
43
43
|
self.input_len = input_len
|
|
44
44
|
self.output_len = output_len
|
|
45
45
|
|
|
@@ -47,7 +47,7 @@ class Linear(nn.Module):
|
|
|
47
47
|
self.num_layers = config.model_config["Linear"]["num_layers"]
|
|
48
48
|
|
|
49
49
|
layers = [
|
|
50
|
-
nn.Linear(self.
|
|
50
|
+
nn.Linear(self.input_dim, self.hidden_size),
|
|
51
51
|
nn.GELU(),
|
|
52
52
|
]
|
|
53
53
|
|
|
@@ -58,7 +58,7 @@ class Linear(nn.Module):
|
|
|
58
58
|
])
|
|
59
59
|
|
|
60
60
|
self.net = nn.Sequential(*layers)
|
|
61
|
-
self.out = nn.Linear(self.hidden_size, self.
|
|
61
|
+
self.out = nn.Linear(self.hidden_size, self.output_dim * self.output_len)
|
|
62
62
|
|
|
63
63
|
def forward(self, x):
|
|
64
64
|
"""
|
|
@@ -75,6 +75,6 @@ class Linear(nn.Module):
|
|
|
75
75
|
x = x.mean(1)
|
|
76
76
|
x = x.view(x.size(0), -1)
|
|
77
77
|
x = self.out(x)
|
|
78
|
-
x = x.view(x.size(0), self.output_len, self.
|
|
78
|
+
x = x.view(x.size(0), self.output_len, self.output_dim)
|
|
79
79
|
|
|
80
80
|
return x
|
|
@@ -11,8 +11,8 @@ class LSTMModel(nn.Module):
|
|
|
11
11
|
# To avoid circular import, now it lives here
|
|
12
12
|
config = load_config()
|
|
13
13
|
|
|
14
|
-
self.
|
|
15
|
-
self.
|
|
14
|
+
self.input_dim = input_dim
|
|
15
|
+
self.output_dim = output_dim
|
|
16
16
|
self.input_len = input_len
|
|
17
17
|
self.output_len = output_len
|
|
18
18
|
self.hidden_size = config.model_config["LSTM"]["hidden_size"]
|
|
@@ -20,13 +20,13 @@ class LSTMModel(nn.Module):
|
|
|
20
20
|
|
|
21
21
|
# Change nn.GRU to nn.LSTM
|
|
22
22
|
self.lstm = nn.LSTM(
|
|
23
|
-
input_size=self.
|
|
24
|
-
hidden_size=self.hidden_size,
|
|
25
|
-
num_layers=self.num_layers,
|
|
26
|
-
batch_first=True,
|
|
23
|
+
input_size = self.input_dim,
|
|
24
|
+
hidden_size = self.hidden_size,
|
|
25
|
+
num_layers = self.num_layers,
|
|
26
|
+
batch_first = True,
|
|
27
27
|
)
|
|
28
28
|
|
|
29
|
-
self.out = nn.Linear(self.hidden_size, self.output_len * self.
|
|
29
|
+
self.out = nn.Linear(self.hidden_size, self.output_len * self.output_dim)
|
|
30
30
|
|
|
31
31
|
def forward(self, x):
|
|
32
32
|
"""
|
|
@@ -44,6 +44,6 @@ class LSTMModel(nn.Module):
|
|
|
44
44
|
|
|
45
45
|
x = self.out(h)
|
|
46
46
|
# Project to output dim and len
|
|
47
|
-
x = x.view(x.size(0), self.output_len, self.
|
|
47
|
+
x = x.view(x.size(0), self.output_len, self.output_dim)
|
|
48
48
|
|
|
49
49
|
return x
|
|
@@ -11,8 +11,8 @@ class TransformerModel(nn.Module):
|
|
|
11
11
|
# To avoid circular import, now it lives here
|
|
12
12
|
config = load_config()
|
|
13
13
|
|
|
14
|
-
self.
|
|
15
|
-
self.
|
|
14
|
+
self.input_dim = input_dim
|
|
15
|
+
self.output_dim = output_dim
|
|
16
16
|
self.input_len = input_len
|
|
17
17
|
self.output_len = output_len
|
|
18
18
|
self.max_seq_len = input_len
|
|
@@ -23,24 +23,24 @@ class TransformerModel(nn.Module):
|
|
|
23
23
|
self.dropout = config.model_config["Transformer"]["dropout"]
|
|
24
24
|
|
|
25
25
|
# Input projection
|
|
26
|
-
self.input_proj = nn.Linear(self.
|
|
26
|
+
self.input_proj = nn.Linear(self.input_dim, self.hidden_size,)
|
|
27
27
|
|
|
28
28
|
# Learnable positional embedding
|
|
29
29
|
self.pos_embedding = nn.Parameter(torch.zeros(1, self.max_seq_len, self.hidden_size))
|
|
30
30
|
|
|
31
31
|
# Transformer decoder layer
|
|
32
32
|
decoder_layer = nn.TransformerDecoderLayer(
|
|
33
|
-
d_model=self.hidden_size,
|
|
34
|
-
nhead=self.num_heads,
|
|
35
|
-
dim_feedforward=4 * self.hidden_size,
|
|
36
|
-
dropout=self.dropout,
|
|
37
|
-
batch_first=True,
|
|
33
|
+
d_model = self.hidden_size,
|
|
34
|
+
nhead = self.num_heads,
|
|
35
|
+
dim_feedforward = 4 * self.hidden_size,
|
|
36
|
+
dropout = self.dropout,
|
|
37
|
+
batch_first = True,
|
|
38
38
|
)
|
|
39
39
|
|
|
40
|
-
self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=self.num_layers)
|
|
40
|
+
self.decoder = nn.TransformerDecoder(decoder_layer, num_layers = self.num_layers)
|
|
41
41
|
|
|
42
42
|
# Map hidden representation to outputs
|
|
43
|
-
self.out = nn.Linear(self.hidden_size, self.
|
|
43
|
+
self.out = nn.Linear(self.hidden_size, self.output_dim * self.output_len)
|
|
44
44
|
|
|
45
45
|
def forward(self, x):
|
|
46
46
|
"""
|
|
@@ -82,6 +82,6 @@ class TransformerModel(nn.Module):
|
|
|
82
82
|
x = x.mean(1)
|
|
83
83
|
x = x.view(x.size(0), -1)
|
|
84
84
|
x = self.out(x)
|
|
85
|
-
x = x.view(x.size(0), self.output_len, self.
|
|
85
|
+
x = x.view(x.size(0), self.output_len, self.output_dim)
|
|
86
86
|
|
|
87
87
|
return x
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: modelmark
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: Benchmark framework for neural network models
|
|
5
|
+
Author: Andrew Larin
|
|
6
|
+
License: MIT
|
|
7
|
+
Requires-Python: >=3.12
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Requires-Dist: numpy>=2.4
|
|
11
|
+
Requires-Dist: pandas>=3.0
|
|
12
|
+
Requires-Dist: torch>=2.12
|
|
13
|
+
Requires-Dist: tqdm>=4.67
|
|
14
|
+
Requires-Dist: playwright>=1.62
|
|
15
|
+
Requires-Dist: rich>=15.0
|
|
16
|
+
Requires-Dist: thop>=0.1
|
|
17
|
+
Dynamic: license-file
|
|
18
|
+
|
|
19
|
+
# ModelMark
|
|
20
|
+
|
|
21
|
+
ModelMark is a CLI benchmarking tool for comparing neural-network models. It runs your models on one or more datasets, records performance and efficiency statistics, and generates an easy-to-embed HTML/PNG report.
|
|
22
|
+
|
|
23
|
+

|
|
24
|
+
|
|
25
|
+
## Table of Contents
|
|
26
|
+
|
|
27
|
+
- [About](#about)
|
|
28
|
+
- [Requirements](#requirements)
|
|
29
|
+
- [Installation](#installation)
|
|
30
|
+
- [Quick Start](#quick-start)
|
|
31
|
+
- [Configuration](#configuration)
|
|
32
|
+
- [How the Benchmark Works](#how-the-benchmark-works)
|
|
33
|
+
- [Reported Metrics](#reported-metrics)
|
|
34
|
+
- [Examples](#examples)
|
|
35
|
+
- [Troubleshooting](#troubleshooting)
|
|
36
|
+
|
|
37
|
+
## About
|
|
38
|
+
|
|
39
|
+
For each benchmark run, ModelMark:
|
|
40
|
+
|
|
41
|
+
1. Selects the next combination of dataset, input/output size, model, and seed.
|
|
42
|
+
2. Seeds the random generators for reproducibility.
|
|
43
|
+
3. Creates the data loader, model, and tester objects.
|
|
44
|
+
4. Trains the model for the configured number of epochs and restores the checkpoint with the lowest validation loss.
|
|
45
|
+
5. Records runtime and efficiency statistics.
|
|
46
|
+
6. Evaluates the model on the dataset using the metrics from the configuration file.
|
|
47
|
+
|
|
48
|
+
After all runs finish, ModelMark aggregates the results and generates a report containing testing results, training statistics, and your machine metadata.
|
|
49
|
+
|
|
50
|
+
## Requirements
|
|
51
|
+
|
|
52
|
+
- OS: Windows or Linux
|
|
53
|
+
- Python: 3.12 or newer
|
|
54
|
+
- Git: required for installation from GitHub
|
|
55
|
+
|
|
56
|
+
## Installation
|
|
57
|
+
|
|
58
|
+
Install ModelMark from PyPI:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
pip install modelmark
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Quick Start
|
|
65
|
+
|
|
66
|
+
1. Run initialization in an empty folder:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
modelmark init
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
This creates two folders:
|
|
73
|
+
- `modelmark_files/` — configuration and log files
|
|
74
|
+
- `models/` — your model files
|
|
75
|
+
|
|
76
|
+
2. Edit the configuration file:
|
|
77
|
+
|
|
78
|
+
`modelmark_files/config.py`
|
|
79
|
+
|
|
80
|
+
It contains three main configuration blocks:
|
|
81
|
+
- `model_config` — model hyperparameters such as number of layers, hidden dimension, kernel size, etc.
|
|
82
|
+
- `data_config` — dataset parameters such as file path, input/output features, train/val ratios, etc.
|
|
83
|
+
- `test_config` — testing options such as optimizer, loss criterion, metrics, learning rate, etc.
|
|
84
|
+
|
|
85
|
+
3. Put the testing models to the `models/` folder.
|
|
86
|
+
|
|
87
|
+
Make sure to import model's class definitions to the `config.py`.
|
|
88
|
+
|
|
89
|
+
Configure `config.model_config` according to your task.
|
|
90
|
+
|
|
91
|
+
5. Download the dataset files (ETT by default):
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
modelmark load
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
6. Run the benchmark:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
modelmark run
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
7. View the generated report:
|
|
104
|
+
- `result.html`
|
|
105
|
+
- `result.png`
|
|
106
|
+
|
|
107
|
+
## Configuration
|
|
108
|
+
|
|
109
|
+
You can adjust the configuration and add your own model files in the `models/` directory to match your benchmarking needs.
|
|
110
|
+
|
|
111
|
+
Make sure your model implementation is compatible with the keys and settings used in your configuration.
|
|
112
|
+
|
|
113
|
+
A detailed configuration example is available at:
|
|
114
|
+
[src/modelmark/config.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/config.py)
|
|
115
|
+
|
|
116
|
+
A detailed example model is available at:
|
|
117
|
+
[src/modelmark/models/linear.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/models/linear.py)
|
|
118
|
+
|
|
119
|
+
## How the Benchmark Works
|
|
120
|
+
|
|
121
|
+
The benchmark consists of:
|
|
122
|
+
|
|
123
|
+
```text
|
|
124
|
+
F × O × M × S
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
where:
|
|
128
|
+
|
|
129
|
+
| Symbol | Meaning | Example |
|
|
130
|
+
|---|---|---|
|
|
131
|
+
| `F` | Number of dataset files in the configuration | `{"ETTh1": ..., "Weather": ...}` → `F = 2` |
|
|
132
|
+
| `O` | Number of input/output size configurations | `[32, 64, 128]` → `O = 3` |
|
|
133
|
+
| `M` | Number of models | `{"Linear": ..., "LSTM": ...}` → `M = 2` |
|
|
134
|
+
| `S` | Number of seeds | `[42, 43, 44]` → `S = 3` |
|
|
135
|
+
|
|
136
|
+
ModelMark repeats the training/evaluation process for each combination and stores the mean result over `S` runs. Using more seeds generally makes the comparison more fair and statistically stable.
|
|
137
|
+
|
|
138
|
+
## Reported Metrics
|
|
139
|
+
|
|
140
|
+
The report includes statistics such as:
|
|
141
|
+
|
|
142
|
+
| Metric | Description |
|
|
143
|
+
|---|---|
|
|
144
|
+
| Time | Average training time per epoch |
|
|
145
|
+
| Params | Total number of model parameters |
|
|
146
|
+
| GFLOPs | Average GFLOPs per batch |
|
|
147
|
+
| Peak Memory | Maximum memory observed during a training iteration |
|
|
148
|
+
|
|
149
|
+
The report also includes the evaluation metrics configured in `test_config` and your machine metadata.
|
|
150
|
+
|
|
151
|
+
## Examples
|
|
152
|
+
|
|
153
|
+
Run `modelmark init`, it will create config at `modelmark_files/config.py` and model's example folder at `models/` with Linear model file inside:
|
|
154
|
+
|
|
155
|
+
- Configuration example: [src/modelmark/config.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/config.py)
|
|
156
|
+
- Linear model example: [src/modelmark/models/linear.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/models/linear.py)
|
|
157
|
+
|
|
158
|
+
## Troubleshooting
|
|
159
|
+
|
|
160
|
+
If something does not work:
|
|
161
|
+
|
|
162
|
+
1. Check the application log:
|
|
163
|
+
`modelmark_files/modelmark.log`
|
|
164
|
+
2. Try restarting ModelMark:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
modelmark restart
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
3. If the issue persists, delete the `modelmark_files` folder and run:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
modelmark init
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
When opening an issue on GitHub, please include the relevant part of your log file.
|
|
177
|
+
|
|
178
|
+
If you have questions or want to inspect the source code, see the
|
|
179
|
+
[ModelMark GitHub repository](https://github.com/gloptim77/ModelMark/tree/main).
|
modelmark-0.1.1/PKG-INFO
DELETED
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: modelmark
|
|
3
|
-
Version: 0.1.1
|
|
4
|
-
Summary: Benchmark framework for neural network models
|
|
5
|
-
Author: Andrew Larin
|
|
6
|
-
License: MIT
|
|
7
|
-
Requires-Python: >=3.12
|
|
8
|
-
Description-Content-Type: text/markdown
|
|
9
|
-
License-File: LICENSE
|
|
10
|
-
Requires-Dist: numpy>=2.4
|
|
11
|
-
Requires-Dist: pandas>=3.0
|
|
12
|
-
Requires-Dist: torch>=2.12
|
|
13
|
-
Requires-Dist: tqdm>=4.67
|
|
14
|
-
Requires-Dist: playwright>=1.62
|
|
15
|
-
Requires-Dist: rich>=15.0
|
|
16
|
-
Requires-Dist: thop>=0.1
|
|
17
|
-
Dynamic: license-file
|
|
18
|
-
|
|
19
|
-
# ModelMark
|
|
20
|
-
|
|
21
|
-
This tool will help you to test NN models against each other, and form a detailed report that is easy to embed to a website.
|
|
22
|
-
|
|
23
|
-
**Model evaluation report example:**
|
|
24
|
-
|
|
25
|
-
<img src="https://github.com/gloptim77/ModelMark/blob/main/result.png" alt="Evaluation result" width="700">
|
|
26
|
-
|
|
27
|
-
## About:
|
|
28
|
-
|
|
29
|
-
At each testing run iteration, modelmark:
|
|
30
|
-
|
|
31
|
-
1) Selects next dataset, input/output len, model and seed
|
|
32
|
-
2) Seeds the generators for reproducibility
|
|
33
|
-
3) Creates the loader, model and tester objects
|
|
34
|
-
4) Trains the model for E epochs, restores the state with the least validation loss
|
|
35
|
-
5) Tracks the GFLOPs, Memory, Time - all AVG over whole test
|
|
36
|
-
5) Evaluates the model on dataset with metrics from configuration file
|
|
37
|
-
6) Stores the mean result over S runs
|
|
38
|
-
|
|
39
|
-
That way, the more seeds you run, the more "fair" the results are.
|
|
40
|
-
Finally, modelmark will form the report with all the testing results, training stats and your machine metadata.
|
|
41
|
-
|
|
42
|
-
More on training stats:
|
|
43
|
-
|
|
44
|
-
Time - average time per epoch
|
|
45
|
-
Params - total number of model params
|
|
46
|
-
GFLOPs - average per batch
|
|
47
|
-
Peak Memory - max per training iteration
|
|
48
|
-
|
|
49
|
-
Test consists of F * O * M * S runs, where:
|
|
50
|
-
|
|
51
|
-
F - number of dataset files in the config (e.g. ["ETTh1" : ..., "Weather" : ...] - means F = 2)
|
|
52
|
-
O - number of input/output sizes (e.g. [32, 64, 128] means O = 3)
|
|
53
|
-
M - number of models (e.g. ["Linear" : ..., "LSTM" : ...] - means M = 2)
|
|
54
|
-
S - number of seeds (e.g. [42, 43, 44] - means S = 2)
|
|
55
|
-
|
|
56
|
-
# Requirements:
|
|
57
|
-
|
|
58
|
-
OS: Windows or Linux
|
|
59
|
-
Python: 3.12+
|
|
60
|
-
|
|
61
|
-
# Usage:
|
|
62
|
-
|
|
63
|
-
1) Install the package
|
|
64
|
-
|
|
65
|
-
pip install "modelmark @ git+https://github.com/gloptim77/ModelMark.git"
|
|
66
|
-
|
|
67
|
-
2) Run the initialization in an empty folder
|
|
68
|
-
|
|
69
|
-
modelmark -t init
|
|
70
|
-
|
|
71
|
-
3.1) It will create two folders "modelmark_files" and "models"
|
|
72
|
-
|
|
73
|
-
In modelmark_files/config.py there are 3 main configs:
|
|
74
|
-
|
|
75
|
-
model_config = {...} - Models hyperparameters (number of layers, hidden dim, kernel size, etc.)
|
|
76
|
-
data_config = {...} - Dataset parameters (path to file, input/output features, train/val ratios, etc.)
|
|
77
|
-
test_config = {...} - Testing options (optimizer, loss criterion, metrics, learning rate, etc.)
|
|
78
|
-
|
|
79
|
-
3.2) (Optional) download the ETT dataset files
|
|
80
|
-
|
|
81
|
-
modelmark -t load
|
|
82
|
-
|
|
83
|
-
4) When your config, model and data are ready, you can run the testing
|
|
84
|
-
|
|
85
|
-
modelmark -t run
|
|
86
|
-
|
|
87
|
-
5) When the test is over, report results will be in files "result.html" and "result.png"
|
|
88
|
-
|
|
89
|
-
Example of the model: "src/modelmark/models/linear.py"
|
|
90
|
-
Example of the config: "src/modelmark/config.py"
|
|
91
|
-
|
|
92
|
-
You will find the detailed config example with description at [src/modelmark/config.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/config.py).
|
|
93
|
-
|
|
94
|
-
Example Linear model with detailed description at [src/modelmark/models/linear.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/models/linear.py).
|
|
95
|
-
|
|
96
|
-
You can change the config and add your model files to suit your test requirements.
|
|
97
|
-
|
|
98
|
-
(But make sure that config and models are compatible)
|
|
99
|
-
|
|
100
|
-
If you have questions or want to check the source code, go to [ModelMark Github](https://github.com/gloptim77/ModelMark/tree/main).
|
|
101
|
-
|
|
102
|
-
## Troubleshooting
|
|
103
|
-
|
|
104
|
-
- **If something doesn't work**
|
|
105
|
-
|
|
106
|
-
- Please open an issue and attach your application logs (found at "modelmark_files/modelmark.log") so I can help you troubleshoot.
|
|
107
|
-
- Try to restart
|
|
108
|
-
```python
|
|
109
|
-
modelmark -t restart
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
- Try to manually delete "modelmark_files" and return to Usage->2)
|
modelmark-0.1.1/README.md
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
# ModelMark
|
|
2
|
-
|
|
3
|
-
This tool will help you to test NN models against each other, and form a detailed report that is easy to embed to a website.
|
|
4
|
-
|
|
5
|
-
**Model evaluation report example:**
|
|
6
|
-
|
|
7
|
-
<img src="https://github.com/gloptim77/ModelMark/blob/main/result.png" alt="Evaluation result" width="700">
|
|
8
|
-
|
|
9
|
-
## About:
|
|
10
|
-
|
|
11
|
-
At each testing run iteration, modelmark:
|
|
12
|
-
|
|
13
|
-
1) Selects next dataset, input/output len, model and seed
|
|
14
|
-
2) Seeds the generators for reproducibility
|
|
15
|
-
3) Creates the loader, model and tester objects
|
|
16
|
-
4) Trains the model for E epochs, restores the state with the least validation loss
|
|
17
|
-
5) Tracks the GFLOPs, Memory, Time - all AVG over whole test
|
|
18
|
-
5) Evaluates the model on dataset with metrics from configuration file
|
|
19
|
-
6) Stores the mean result over S runs
|
|
20
|
-
|
|
21
|
-
That way, the more seeds you run, the more "fair" the results are.
|
|
22
|
-
Finally, modelmark will form the report with all the testing results, training stats and your machine metadata.
|
|
23
|
-
|
|
24
|
-
More on training stats:
|
|
25
|
-
|
|
26
|
-
Time - average time per epoch
|
|
27
|
-
Params - total number of model params
|
|
28
|
-
GFLOPs - average per batch
|
|
29
|
-
Peak Memory - max per training iteration
|
|
30
|
-
|
|
31
|
-
Test consists of F * O * M * S runs, where:
|
|
32
|
-
|
|
33
|
-
F - number of dataset files in the config (e.g. ["ETTh1" : ..., "Weather" : ...] - means F = 2)
|
|
34
|
-
O - number of input/output sizes (e.g. [32, 64, 128] means O = 3)
|
|
35
|
-
M - number of models (e.g. ["Linear" : ..., "LSTM" : ...] - means M = 2)
|
|
36
|
-
S - number of seeds (e.g. [42, 43, 44] - means S = 2)
|
|
37
|
-
|
|
38
|
-
# Requirements:
|
|
39
|
-
|
|
40
|
-
OS: Windows or Linux
|
|
41
|
-
Python: 3.12+
|
|
42
|
-
|
|
43
|
-
# Usage:
|
|
44
|
-
|
|
45
|
-
1) Install the package
|
|
46
|
-
|
|
47
|
-
pip install "modelmark @ git+https://github.com/gloptim77/ModelMark.git"
|
|
48
|
-
|
|
49
|
-
2) Run the initialization in an empty folder
|
|
50
|
-
|
|
51
|
-
modelmark -t init
|
|
52
|
-
|
|
53
|
-
3.1) It will create two folders "modelmark_files" and "models"
|
|
54
|
-
|
|
55
|
-
In modelmark_files/config.py there are 3 main configs:
|
|
56
|
-
|
|
57
|
-
model_config = {...} - Models hyperparameters (number of layers, hidden dim, kernel size, etc.)
|
|
58
|
-
data_config = {...} - Dataset parameters (path to file, input/output features, train/val ratios, etc.)
|
|
59
|
-
test_config = {...} - Testing options (optimizer, loss criterion, metrics, learning rate, etc.)
|
|
60
|
-
|
|
61
|
-
3.2) (Optional) download the ETT dataset files
|
|
62
|
-
|
|
63
|
-
modelmark -t load
|
|
64
|
-
|
|
65
|
-
4) When your config, model and data are ready, you can run the testing
|
|
66
|
-
|
|
67
|
-
modelmark -t run
|
|
68
|
-
|
|
69
|
-
5) When the test is over, report results will be in files "result.html" and "result.png"
|
|
70
|
-
|
|
71
|
-
Example of the model: "src/modelmark/models/linear.py"
|
|
72
|
-
Example of the config: "src/modelmark/config.py"
|
|
73
|
-
|
|
74
|
-
You will find the detailed config example with description at [src/modelmark/config.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/config.py).
|
|
75
|
-
|
|
76
|
-
Example Linear model with detailed description at [src/modelmark/models/linear.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/models/linear.py).
|
|
77
|
-
|
|
78
|
-
You can change the config and add your model files to suit your test requirements.
|
|
79
|
-
|
|
80
|
-
(But make sure that config and models are compatible)
|
|
81
|
-
|
|
82
|
-
If you have questions or want to check the source code, go to [ModelMark Github](https://github.com/gloptim77/ModelMark/tree/main).
|
|
83
|
-
|
|
84
|
-
## Troubleshooting
|
|
85
|
-
|
|
86
|
-
- **If something doesn't work**
|
|
87
|
-
|
|
88
|
-
- Please open an issue and attach your application logs (found at "modelmark_files/modelmark.log") so I can help you troubleshoot.
|
|
89
|
-
- Try to restart
|
|
90
|
-
```python
|
|
91
|
-
modelmark -t restart
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
- Try to manually delete "modelmark_files" and return to Usage->2)
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: modelmark
|
|
3
|
-
Version: 0.1.1
|
|
4
|
-
Summary: Benchmark framework for neural network models
|
|
5
|
-
Author: Andrew Larin
|
|
6
|
-
License: MIT
|
|
7
|
-
Requires-Python: >=3.12
|
|
8
|
-
Description-Content-Type: text/markdown
|
|
9
|
-
License-File: LICENSE
|
|
10
|
-
Requires-Dist: numpy>=2.4
|
|
11
|
-
Requires-Dist: pandas>=3.0
|
|
12
|
-
Requires-Dist: torch>=2.12
|
|
13
|
-
Requires-Dist: tqdm>=4.67
|
|
14
|
-
Requires-Dist: playwright>=1.62
|
|
15
|
-
Requires-Dist: rich>=15.0
|
|
16
|
-
Requires-Dist: thop>=0.1
|
|
17
|
-
Dynamic: license-file
|
|
18
|
-
|
|
19
|
-
# ModelMark
|
|
20
|
-
|
|
21
|
-
This tool will help you to test NN models against each other, and form a detailed report that is easy to embed to a website.
|
|
22
|
-
|
|
23
|
-
**Model evaluation report example:**
|
|
24
|
-
|
|
25
|
-
<img src="https://github.com/gloptim77/ModelMark/blob/main/result.png" alt="Evaluation result" width="700">
|
|
26
|
-
|
|
27
|
-
## About:
|
|
28
|
-
|
|
29
|
-
At each testing run iteration, modelmark:
|
|
30
|
-
|
|
31
|
-
1) Selects next dataset, input/output len, model and seed
|
|
32
|
-
2) Seeds the generators for reproducibility
|
|
33
|
-
3) Creates the loader, model and tester objects
|
|
34
|
-
4) Trains the model for E epochs, restores the state with the least validation loss
|
|
35
|
-
5) Tracks the GFLOPs, Memory, Time - all AVG over whole test
|
|
36
|
-
5) Evaluates the model on dataset with metrics from configuration file
|
|
37
|
-
6) Stores the mean result over S runs
|
|
38
|
-
|
|
39
|
-
That way, the more seeds you run, the more "fair" the results are.
|
|
40
|
-
Finally, modelmark will form the report with all the testing results, training stats and your machine metadata.
|
|
41
|
-
|
|
42
|
-
More on training stats:
|
|
43
|
-
|
|
44
|
-
Time - average time per epoch
|
|
45
|
-
Params - total number of model params
|
|
46
|
-
GFLOPs - average per batch
|
|
47
|
-
Peak Memory - max per training iteration
|
|
48
|
-
|
|
49
|
-
Test consists of F * O * M * S runs, where:
|
|
50
|
-
|
|
51
|
-
F - number of dataset files in the config (e.g. ["ETTh1" : ..., "Weather" : ...] - means F = 2)
|
|
52
|
-
O - number of input/output sizes (e.g. [32, 64, 128] means O = 3)
|
|
53
|
-
M - number of models (e.g. ["Linear" : ..., "LSTM" : ...] - means M = 2)
|
|
54
|
-
S - number of seeds (e.g. [42, 43, 44] - means S = 2)
|
|
55
|
-
|
|
56
|
-
# Requirements:
|
|
57
|
-
|
|
58
|
-
OS: Windows or Linux
|
|
59
|
-
Python: 3.12+
|
|
60
|
-
|
|
61
|
-
# Usage:
|
|
62
|
-
|
|
63
|
-
1) Install the package
|
|
64
|
-
|
|
65
|
-
pip install "modelmark @ git+https://github.com/gloptim77/ModelMark.git"
|
|
66
|
-
|
|
67
|
-
2) Run the initialization in an empty folder
|
|
68
|
-
|
|
69
|
-
modelmark -t init
|
|
70
|
-
|
|
71
|
-
3.1) It will create two folders "modelmark_files" and "models"
|
|
72
|
-
|
|
73
|
-
In modelmark_files/config.py there are 3 main configs:
|
|
74
|
-
|
|
75
|
-
model_config = {...} - Models hyperparameters (number of layers, hidden dim, kernel size, etc.)
|
|
76
|
-
data_config = {...} - Dataset parameters (path to file, input/output features, train/val ratios, etc.)
|
|
77
|
-
test_config = {...} - Testing options (optimizer, loss criterion, metrics, learning rate, etc.)
|
|
78
|
-
|
|
79
|
-
3.2) (Optional) download the ETT dataset files
|
|
80
|
-
|
|
81
|
-
modelmark -t load
|
|
82
|
-
|
|
83
|
-
4) When your config, model and data are ready, you can run the testing
|
|
84
|
-
|
|
85
|
-
modelmark -t run
|
|
86
|
-
|
|
87
|
-
5) When the test is over, report results will be in files "result.html" and "result.png"
|
|
88
|
-
|
|
89
|
-
Example of the model: "src/modelmark/models/linear.py"
|
|
90
|
-
Example of the config: "src/modelmark/config.py"
|
|
91
|
-
|
|
92
|
-
You will find the detailed config example with description at [src/modelmark/config.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/config.py).
|
|
93
|
-
|
|
94
|
-
Example Linear model with detailed description at [src/modelmark/models/linear.py](https://github.com/gloptim77/ModelMark/blob/main/src/modelmark/models/linear.py).
|
|
95
|
-
|
|
96
|
-
You can change the config and add your model files to suit your test requirements.
|
|
97
|
-
|
|
98
|
-
(But make sure that config and models are compatible)
|
|
99
|
-
|
|
100
|
-
If you have questions or want to check the source code, go to [ModelMark Github](https://github.com/gloptim77/ModelMark/tree/main).
|
|
101
|
-
|
|
102
|
-
## Troubleshooting
|
|
103
|
-
|
|
104
|
-
- **If something doesn't work**
|
|
105
|
-
|
|
106
|
-
- Please open an issue and attach your application logs (found at "modelmark_files/modelmark.log") so I can help you troubleshoot.
|
|
107
|
-
- Try to restart
|
|
108
|
-
```python
|
|
109
|
-
modelmark -t restart
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
- Try to manually delete "modelmark_files" and return to Usage->2)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|