| | """ |
| | Sample script to generate multiple random experiment runs. |
| | Creates 4 different runs, each recording 100 steps of metrics. |
| | """ |
| |
|
| | import math |
| | import random |
| |
|
| | import aspara |
| |
|
| |
|
| | def generate_metrics_with_trend( |
| | step: int, |
| | total_steps: int, |
| | base_values: dict[str, float], |
| | noise_levels: dict[str, float], |
| | trends: dict[str, float], |
| | ) -> dict[str, float]: |
| | """ |
| | Generate metrics with trend and noise. |
| | |
| | Args: |
| | step: Current step |
| | total_steps: Total number of steps |
| | base_values: Initial values for each metric |
| | noise_levels: Noise level for each metric |
| | trends: Final change amount for each metric |
| | |
| | Returns: |
| | Generated metrics |
| | """ |
| | progress = step / total_steps |
| | metrics = {} |
| |
|
| | for metric_name, base_value in base_values.items(): |
| | |
| | trend_factor = progress * (1.0 + 0.2 * math.log(1 + 5 * progress)) |
| | trend_change = trends[metric_name] * trend_factor |
| |
|
| | |
| | noise = ( |
| | noise_levels[metric_name] * math.sin(step * 0.2) * 0.3 |
| | + noise_levels[metric_name] * random.gauss(0, 0.5) |
| | ) |
| |
|
| | |
| | value = base_value + trend_change + noise |
| |
|
| | |
| | if "accuracy" in metric_name: |
| | value = max(0.0, min(1.0, value)) |
| | elif "loss" in metric_name: |
| | value = max(0.01, value) |
| |
|
| | metrics[metric_name] = value |
| |
|
| | return metrics |
| |
|
| |
|
| | def create_run_config(run_id: int) -> tuple[dict[str, float], dict[str, float], dict[str, float]]: |
| | """ |
| | Create configuration for each run. |
| | |
| | Args: |
| | run_id: Run number |
| | |
| | Returns: |
| | Tuple of (initial values, noise levels, trends) |
| | """ |
| | |
| | base_values = { |
| | "accuracy": 0.3 + random.uniform(-0.1, 0.1), |
| | "loss": 1.0 + random.uniform(-0.2, 0.2), |
| | "val_accuracy": 0.25 + random.uniform(-0.1, 0.1), |
| | "val_loss": 1.1 + random.uniform(-0.2, 0.2), |
| | } |
| |
|
| | |
| | noise_levels = { |
| | "accuracy": 0.02 + 0.01 * run_id, |
| | "loss": 0.05 + 0.02 * run_id, |
| | "val_accuracy": 0.03 + 0.01 * run_id, |
| | "val_loss": 0.07 + 0.02 * run_id, |
| | } |
| |
|
| | |
| | trends = { |
| | "accuracy": 0.5 + random.uniform(-0.1, 0.1), |
| | "loss": -0.8 + random.uniform(-0.1, 0.1), |
| | "val_accuracy": 0.45 + random.uniform(-0.1, 0.1), |
| | "val_loss": -0.75 + random.uniform(-0.1, 0.1), |
| | } |
| |
|
| | return base_values, noise_levels, trends |
| |
|
| |
|
| | def generate_run( |
| | project: str, |
| | run_id: int, |
| | total_steps: int = 100, |
| | project_tags: list[str] | None = None, |
| | run_name: str | None = None, |
| | ) -> None: |
| | """ |
| | Generate an experiment run with the specified ID. |
| | |
| | Args: |
| | project: Project name |
| | run_id: Run number |
| | total_steps: Number of steps to generate |
| | project_tags: Common tags for the project |
| | run_name: Run name (generated from run_id if not specified) |
| | """ |
| | |
| | if run_name is None: |
| | run_name = f"random_training_run_{run_id}" |
| |
|
| | print(f"Starting generation of run {run_id} for project '{project}'! ({run_name})") |
| |
|
| | |
| | base_values, noise_levels, trends = create_run_config(run_id) |
| |
|
| | |
| | fruits = ["apple", "pear", "orange", "grape", "banana", "mango"] |
| | num_fruit_tags = random.randint(1, len(fruits)) |
| | run_tags = random.sample(fruits, k=num_fruit_tags) |
| |
|
| | aspara.init( |
| | project=project, |
| | name=run_name, |
| | config={ |
| | "learning_rate": 0.01 * (1 + 0.2 * run_id), |
| | "batch_size": 32 * (1 + run_id % 2), |
| | "optimizer": ["adam", "sgd", "rmsprop", "adagrad"][run_id % 4], |
| | "model_type": "mlp", |
| | "hidden_layers": [128, 64, 32], |
| | "dropout": 0.2 + 0.05 * run_id, |
| | "epochs": 10, |
| | "run_id": run_id, |
| | }, |
| | tags=run_tags, |
| | project_tags=project_tags, |
| | ) |
| |
|
| | |
| | print(f"Generating metrics for {total_steps} steps...") |
| | for step in range(total_steps): |
| | |
| | metrics = generate_metrics_with_trend(step, total_steps, base_values, noise_levels, trends) |
| |
|
| | |
| | aspara.log(metrics, step=step) |
| |
|
| | |
| | if step % 10 == 0 or step == total_steps - 1: |
| | print(f" Step {step}/{total_steps - 1}: accuracy={metrics['accuracy']:.3f}, loss={metrics['loss']:.3f}") |
| |
|
| | |
| | aspara.finish() |
| |
|
| | print(f"Completed generation of run {run_id} for project '{project}'!") |
| |
|
| |
|
| | def main() -> None: |
| | """Main function: Generate multiple runs.""" |
| | steps_per_run = 100 |
| |
|
| | |
| | project_names = [ |
| | "Project_Phoenix", |
| | "Operation_Midnight", |
| | "Genesis_Initiative", |
| | "Project_Prometheus", |
| | ] |
| |
|
| | |
| | sf_titles = [ |
| | "AKIRA", |
| | "Ghost_in_the_Shell", |
| | "Planetes", |
| | "Steins_Gate", |
| | "Paprika", |
| | "Blade_Runner", |
| | "Dune", |
| | "Neuromancer", |
| | "Foundation", |
| | "The_Martian", |
| | "Interstellar", |
| | "Solaris", |
| | "Hyperion", |
| | "Snow_Crash", |
| | "Contact", |
| | "Arrival", |
| | "Gravity", |
| | "Moon", |
| | "Ex_Machina", |
| | "Tenet", |
| | ] |
| |
|
| | print(f"Generating {len(project_names)} projects!") |
| | print(f" Each project has 4-5 runs! ({steps_per_run} steps per run)") |
| | animals = ["dog", "cat", "rabbit", "coala", "bear", "goat"] |
| |
|
| | |
| | shuffled_sf_titles = sf_titles.copy() |
| | random.shuffle(shuffled_sf_titles) |
| | sf_title_index = 0 |
| |
|
| | |
| | for project_name in project_names: |
| | |
| | num_project_tags = random.randint(1, len(animals)) |
| | project_tags = random.sample(animals, k=num_project_tags) |
| |
|
| | num_runs = random.randint(4, 5) |
| | for run_id in range(num_runs): |
| | |
| | run_name = shuffled_sf_titles[sf_title_index % len(shuffled_sf_titles)] |
| | sf_title_index += 1 |
| | generate_run(project_name, run_id, steps_per_run, project_tags, run_name) |
| | print("") |
| |
|
| | print("All runs have been generated!") |
| | print(" Check them out on the dashboard!") |
| |
|
| |
|
| | if __name__ == "__main__": |
| | main() |
| |
|