Skip to content

check_model

CLI module for checking model configuration and running initial tests.

Functions:

  • get_args

    Get the arguments when using from the commandline.

  • main

    Run the main model checking pipeline.

  • run

    Run the model checking script.

get_args

get_args() -> Namespace

Get the arguments when using from the commandline.

Returns:

  • Namespace

    Parsed command line arguments.

Source code in src/stimulus/cli/check_model.py
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
def get_args() -> argparse.Namespace:
    """Get the arguments when using from the commandline.

    Returns:
        Parsed command line arguments.
    """
    parser = argparse.ArgumentParser(description="Launch check_model.")
    parser.add_argument("-d", "--data", type=str, required=True, metavar="FILE", help="Path to input csv file.")
    parser.add_argument("-m", "--model", type=str, required=True, metavar="FILE", help="Path to model file.")
    parser.add_argument(
        "-e",
        "--data_config",
        type=str,
        required=True,
        metavar="FILE",
        help="Path to data config file.",
    )
    parser.add_argument(
        "-c",
        "--model_config",
        type=str,
        required=True,
        metavar="FILE",
        help="Path to yaml config training file.",
    )
    parser.add_argument(
        "-w",
        "--initial_weights",
        type=str,
        required=False,
        nargs="?",
        const=None,
        default=None,
        metavar="FILE",
        help="The path to the initial weights (optional).",
    )

    parser.add_argument(
        "-n",
        "--num_samples",
        type=int,
        required=False,
        nargs="?",
        const=3,
        default=3,
        metavar="NUM_SAMPLES",
        help="Number of samples for tuning. Overwrites tune.tune_params.num_samples in config.",
    )
    parser.add_argument(
        "--ray_results_dirpath",
        type=str,
        required=False,
        nargs="?",
        const=None,
        default=None,
        metavar="DIR_PATH",
        help="Location where ray_results output dir should be written. If None, uses ~/ray_results.",
    )
    parser.add_argument(
        "--debug_mode",
        action="store_true",
        help="Activate debug mode for tuning. Default false, no debug.",
    )

    return parser.parse_args()

main

main(
    model_path: str,
    data_path: str,
    data_config_path: str,
    model_config_path: str,
    initial_weights: str | None = None,
    num_samples: int = 3,
    ray_results_dirpath: str | None = None,
    *,
    debug_mode: bool = False
) -> None

Run the main model checking pipeline.

Parameters:

  • data_path (str) –

    Path to input data file.

  • model_path (str) –

    Path to model file.

  • data_config_path (str) –

    Path to data config file.

  • model_config_path (str) –

    Path to model config file.

  • initial_weights (str | None, default: None ) –

    Optional path to initial weights.

  • num_samples (int, default: 3 ) –

    Number of samples for tuning.

  • ray_results_dirpath (str | None, default: None ) –

    Directory for ray results.

  • debug_mode (bool, default: False ) –

    Whether to run in debug mode.

Source code in src/stimulus/cli/check_model.py
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
def main(
    model_path: str,
    data_path: str,
    data_config_path: str,
    model_config_path: str,
    initial_weights: str | None = None,  # noqa: ARG001
    num_samples: int = 3,
    ray_results_dirpath: str | None = None,
    *,
    debug_mode: bool = False,
) -> None:
    """Run the main model checking pipeline.

    Args:
        data_path: Path to input data file.
        model_path: Path to model file.
        data_config_path: Path to data config file.
        model_config_path: Path to model config file.
        initial_weights: Optional path to initial weights.
        num_samples: Number of samples for tuning.
        ray_results_dirpath: Directory for ray results.
        debug_mode: Whether to run in debug mode.
    """
    with open(data_config_path) as file:
        data_config = yaml.safe_load(file)
        data_config = yaml_data.YamlSubConfigDict(**data_config)

    with open(model_config_path) as file:
        model_config = yaml.safe_load(file)
        model_config = yaml_model_schema.Model(**model_config)

    encoder_loader = loaders.EncoderLoader()
    encoder_loader.initialize_column_encoders_from_config(column_config=data_config.columns)

    logger.info("Dataset loaded successfully.")

    model_class = launch_utils.import_class_from_file(model_path)

    logger.info("Model class loaded successfully.")

    ray_config_loader = yaml_model_schema.YamlRayConfigLoader(model=model_config)
    ray_config_dict = ray_config_loader.get_config().model_dump()
    ray_config_model = ray_config_loader.get_config()

    logger.info("Ray config loaded successfully.")

    sampled_model_params = {
        key: domain.sample() if hasattr(domain, "sample") else domain
        for key, domain in ray_config_dict["network_params"].items()
    }

    logger.info("Sampled model params loaded successfully.")

    model_instance = model_class(**sampled_model_params)

    logger.info("Model instance loaded successfully.")

    torch_dataset = handlertorch.TorchDataset(
        config_path=data_config_path,
        csv_path=data_path,
        encoder_loader=encoder_loader,
    )

    torch_dataloader = DataLoader(torch_dataset, batch_size=10, shuffle=True)

    logger.info("Torch dataloader loaded successfully.")

    # try to run the model on a single batch
    for batch in torch_dataloader:
        input_data, labels, metadata = batch
        # Log shapes of tensors in each dictionary
        for key, tensor in input_data.items():
            logger.debug(f"Input tensor '{key}' shape: {tensor.shape}")
        for key, tensor in labels.items():
            logger.debug(f"Label tensor '{key}' shape: {tensor.shape}")
        for key, list_object in metadata.items():
            logger.debug(f"Metadata lists '{key}' length: {len(list_object)}")
        output = model_instance(**input_data)
        logger.info("model ran successfully on a single batch")
        logger.debug(f"Output shape: {output.shape}")
        break

    logger.info("Model checking single pass completed successfully.")

    # override num_samples
    model_config.tune.tune_params.num_samples = num_samples

    tuner = raytune_learner.TuneWrapper(
        model_config=ray_config_model,
        data_config_path=data_config_path,
        model_class=model_class,
        data_path=data_path,
        encoder_loader=encoder_loader,
        seed=42,
        ray_results_dir=ray_results_dirpath,
        debug=debug_mode,
    )

    logger.info("Tuner initialized successfully.")

    tuner.tune()

    logger.info("Tuning completed successfully.")
    logger.info("Checks complete")

run

run() -> None

Run the model checking script.

Source code in src/stimulus/cli/check_model.py
190
191
192
193
194
195
196
197
198
199
200
201
202
def run() -> None:
    """Run the model checking script."""
    args = get_args()
    main(
        data_path=args.data,
        model_path=args.model,
        data_config_path=args.data_config,
        model_config_path=args.model_config,
        initial_weights=args.initial_weights,
        num_samples=args.num_samples,
        ray_results_dirpath=args.ray_results_dirpath,
        debug_mode=args.debug_mode,
    )