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.
Files changed (32) hide show
  1. modelmark-0.1.2/PKG-INFO +179 -0
  2. modelmark-0.1.2/README.md +161 -0
  3. {modelmark-0.1.1 → modelmark-0.1.2}/pyproject.toml +1 -1
  4. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/common/parser.py +21 -19
  5. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/constants.py +1 -8
  6. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/modelmark.py +6 -6
  7. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/models/conv.py +7 -7
  8. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/models/gru.py +5 -5
  9. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/models/linear.py +5 -5
  10. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/models/lstm.py +8 -8
  11. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/models/transformer.py +11 -11
  12. modelmark-0.1.2/src/modelmark.egg-info/PKG-INFO +179 -0
  13. modelmark-0.1.1/PKG-INFO +0 -112
  14. modelmark-0.1.1/README.md +0 -94
  15. modelmark-0.1.1/src/modelmark.egg-info/PKG-INFO +0 -112
  16. {modelmark-0.1.1 → modelmark-0.1.2}/LICENSE +0 -0
  17. {modelmark-0.1.1 → modelmark-0.1.2}/setup.cfg +0 -0
  18. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/__init__.py +0 -0
  19. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/__main__.py +0 -0
  20. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/common/dataset.py +0 -0
  21. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/common/downloader.py +0 -0
  22. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/common/loader.py +0 -0
  23. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/common/logger.py +0 -0
  24. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/common/report.py +0 -0
  25. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/common/tester.py +0 -0
  26. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/common/utils.py +0 -0
  27. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark/config.py +0 -0
  28. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark.egg-info/SOURCES.txt +0 -0
  29. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark.egg-info/dependency_links.txt +0 -0
  30. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark.egg-info/entry_points.txt +0 -0
  31. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark.egg-info/requires.txt +0 -0
  32. {modelmark-0.1.1 → modelmark-0.1.2}/src/modelmark.egg-info/top_level.txt +0 -0
@@ -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
+ ![Evaluation result](https://raw.githubusercontent.com/gloptim77/ModelMark/refs/heads/main/result.png)
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
+ ![Evaluation result](https://raw.githubusercontent.com/gloptim77/ModelMark/refs/heads/main/result.png)
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).
@@ -7,7 +7,7 @@ modelmark = "modelmark.modelmark:run"
7
7
 
8
8
  [project]
9
9
  name = "modelmark"
10
- version = "0.1.1"
10
+ version = "0.1.2"
11
11
  description = "Benchmark framework for neural network models"
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.12"
@@ -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
- # Add arguments
26
- self.parser.add_argument(
27
- "-t", "--task",
28
- type = str,
29
- default = "help",
30
- help = constants.PARSER_HELP
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.task == "init":
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.task == "load":
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.task == "run":
60
+ if self.args.command == "run":
59
61
  return None
60
62
 
61
63
  # Clean the config folder #
62
- if self.args.task == "clear":
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.task == "reset":
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.task == "help":
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.task != "run":
78
- logger.error(f"Unknown task: {self.args.task}, run 'modelmark' for more info")
79
- console.print(f"Unknown task: {self.args.task}, run 'modelmark' for more info", style="red")
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 -t load
7
+ It can download ETT dataset with
8
+ modelmark load
9
9
  It can run the test with
10
- modelmark -t run
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 - average time per epoch
35
- Params - total number of model params
36
- GFLOPs - average per batch
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.input_size = input_dim
15
- self.output_size = output_dim
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.input_size
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 * output_size values
46
- self.fc = nn.Linear(self.hidden_size, output_len * self.output_size)
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 * output_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.output_size)
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.input_size = input_dim
15
- self.output_size = output_dim
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.input_size,
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.output_size)
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.output_size)
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.input_size = input_dim
42
- self.output_size = output_dim
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.input_size, self.hidden_size),
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.output_size * self.output_len)
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.output_size)
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.input_size = input_dim
15
- self.output_size = output_dim
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.input_size,
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.output_size)
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.output_size)
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.input_size = input_dim
15
- self.output_size = output_dim
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.input_size, self.hidden_size,)
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.output_size * self.output_len)
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.output_size)
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
+ ![Evaluation result](https://raw.githubusercontent.com/gloptim77/ModelMark/refs/heads/main/result.png)
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