From ad5199966b0e43fbbcfafa61b7bd04378ef239c5 Mon Sep 17 00:00:00 2001 From: Kobi Felton Date: Fri, 9 Jun 2023 10:40:33 +0100 Subject: [PATCH] Run paper table (#135) * Update make file * Add analysis notebook * Enable resuming and skipping training * Update performance plotting * Add scripts * Make final tables * Add dataset version * Upgrade dataset version * Add dataset version to cli and update makefile --- Makefile | 54 +- .../condition_prediction/run.py | 114 ++- .../condition_prediction/utils.py | 39 +- notebooks/clean_wandb.ipynb | 105 +++ notebooks/plot_model_performance_wandb.ipynb | 799 ++++++++++++++++++ notebooks/update_wandb_runs.py | 83 ++ 6 files changed, 1136 insertions(+), 58 deletions(-) create mode 100644 notebooks/clean_wandb.ipynb create mode 100644 notebooks/plot_model_performance_wandb.ipynb create mode 100644 notebooks/update_wandb_runs.py diff --git a/Makefile b/Makefile index c72ca7ab..ae598fec 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ clean_default_num_agent=3 clean_default_num_cat=1 clean_default_num_reag=2 WANDB_ENTITY=ceb-sre +dataset_version=v5 mypy_orderly: @@ -165,7 +166,7 @@ run_python_310: train_model: - python -m condition_prediction --train_data_path="data/orderly/datasets/orderly_no_trust_with_map_train.parquet" --test_data_path="data/orderly/datasets/orderly_no_trust_with_map_test.parquet" --output_folder_path="models/no_trust_with_map" --train_fraction=1 --train_val_split=0.8 --overwrite=True --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 + python -m condition_prediction --train_data_path="data/orderly/datasets_$(dataset_version)/orderly_no_trust_with_map_train.parquet" --test_data_path="data/orderly/datasets_$(dataset_version)/orderly_no_trust_with_map_test.parquet" --output_folder_path="models/no_trust_with_map" --train_fraction=1 --train_val_split=0.8 --overwrite=True --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 @@ -242,40 +243,40 @@ paper_5 : paper_plot_uspto_no_trust_filtered_min_frequency_of_occurrence_10_100 # 6. clean (final) paper_gen_uspto_no_trust_no_map: #requires: paper_extract_uspto_no_trust - python -m orderly.clean --output_path="data/orderly/datasets/orderly_no_trust_no_map.parquet" --ord_extraction_path="data/orderly/uspto_no_trust/extracted_ords" --molecules_to_remove_path="data/orderly/uspto_no_trust/all_molecule_names.csv" --min_frequency_of_occurrence=100 --map_rare_molecules_to_other=False --set_unresolved_names_to_none_if_mapped_rxn_str_exists_else_del_rxn=True --remove_rxn_with_unresolved_names=False --set_unresolved_names_to_none=False --num_product=1 --num_reactant=2 --num_solv=2 --num_agent=3 --num_cat=0 --num_reag=0 --consistent_yield=True --scramble=True --train_test_split_fraction=0.9 + python -m orderly.clean --output_path="data/orderly/datasets_$(dataset_version)/orderly_no_trust_no_map.parquet" --ord_extraction_path="data/orderly/uspto_no_trust/extracted_ords" --molecules_to_remove_path="data/orderly/uspto_no_trust/all_molecule_names.csv" --min_frequency_of_occurrence=100 --map_rare_molecules_to_other=False --set_unresolved_names_to_none_if_mapped_rxn_str_exists_else_del_rxn=True --remove_rxn_with_unresolved_names=False --set_unresolved_names_to_none=False --num_product=1 --num_reactant=2 --num_solv=2 --num_agent=3 --num_cat=0 --num_reag=0 --consistent_yield=True --scramble=True --train_test_split_fraction=0.9 paper_gen_uspto_no_trust_with_map: #requires: paper_extract_uspto_no_trust - python -m orderly.clean --output_path="data/orderly/datasets/orderly_no_trust_with_map.parquet" --ord_extraction_path="data/orderly/uspto_no_trust/extracted_ords" --molecules_to_remove_path="data/orderly/uspto_no_trust/all_molecule_names.csv" --min_frequency_of_occurrence=100 --map_rare_molecules_to_other=True --set_unresolved_names_to_none_if_mapped_rxn_str_exists_else_del_rxn=True --remove_rxn_with_unresolved_names=False --set_unresolved_names_to_none=False --num_product=1 --num_reactant=2 --num_solv=2 --num_agent=3 --num_cat=0 --num_reag=0 --consistent_yield=True --scramble=True --train_test_split_fraction=0.9 + python -m orderly.clean --output_path="data/orderly/datasets_$(dataset_version)/orderly_no_trust_with_map.parquet" --ord_extraction_path="data/orderly/uspto_no_trust/extracted_ords" --molecules_to_remove_path="data/orderly/uspto_no_trust/all_molecule_names.csv" --min_frequency_of_occurrence=100 --map_rare_molecules_to_other=True --set_unresolved_names_to_none_if_mapped_rxn_str_exists_else_del_rxn=True --remove_rxn_with_unresolved_names=False --set_unresolved_names_to_none=False --num_product=1 --num_reactant=2 --num_solv=2 --num_agent=3 --num_cat=0 --num_reag=0 --consistent_yield=True --scramble=True --train_test_split_fraction=0.9 paper_gen_uspto_with_trust_with_map: #requires: paper_extract_uspto_with_trust - python -m orderly.clean --output_path="data/orderly/datasets/orderly_with_trust_with_map.parquet" --ord_extraction_path="data/orderly/uspto_with_trust/extracted_ords" --molecules_to_remove_path="data/orderly/uspto_with_trust/all_molecule_names.csv" --min_frequency_of_occurrence=100 --map_rare_molecules_to_other=True --set_unresolved_names_to_none_if_mapped_rxn_str_exists_else_del_rxn=True --remove_rxn_with_unresolved_names=False --set_unresolved_names_to_none=False --num_product=1 --num_reactant=2 --num_solv=2 --num_agent=0 --num_cat=1 --num_reag=2 --consistent_yield=True --scramble=True --train_test_split_fraction=0.9 + python -m orderly.clean --output_path="data/orderly/datasets_$(dataset_version)/orderly_with_trust_with_map.parquet" --ord_extraction_path="data/orderly/uspto_with_trust/extracted_ords" --molecules_to_remove_path="data/orderly/uspto_with_trust/all_molecule_names.csv" --min_frequency_of_occurrence=100 --map_rare_molecules_to_other=True --set_unresolved_names_to_none_if_mapped_rxn_str_exists_else_del_rxn=True --remove_rxn_with_unresolved_names=False --set_unresolved_names_to_none=False --num_product=1 --num_reactant=2 --num_solv=2 --num_agent=0 --num_cat=1 --num_reag=2 --consistent_yield=True --scramble=True --train_test_split_fraction=0.9 paper_gen_uspto_with_trust_no_map: #requires: paper_extract_uspto_with_trust - python -m orderly.clean --output_path="data/orderly/datasets/orderly_with_trust_no_map.parquet" --ord_extraction_path="data/orderly/uspto_with_trust/extracted_ords" --molecules_to_remove_path="data/orderly/uspto_with_trust/all_molecule_names.csv" --min_frequency_of_occurrence=100 --map_rare_molecules_to_other=False --set_unresolved_names_to_none_if_mapped_rxn_str_exists_else_del_rxn=True --remove_rxn_with_unresolved_names=False --set_unresolved_names_to_none=False --num_product=1 --num_reactant=2 --num_solv=2 --num_agent=0 --num_cat=1 --num_reag=2 --consistent_yield=True --scramble=True --train_test_split_fraction=0.9 + python -m orderly.clean --output_path="data/orderly/datasets_$(dataset_version)/orderly_with_trust_no_map.parquet" --ord_extraction_path="data/orderly/uspto_with_trust/extracted_ords" --molecules_to_remove_path="data/orderly/uspto_with_trust/all_molecule_names.csv" --min_frequency_of_occurrence=100 --map_rare_molecules_to_other=False --set_unresolved_names_to_none_if_mapped_rxn_str_exists_else_del_rxn=True --remove_rxn_with_unresolved_names=False --set_unresolved_names_to_none=False --num_product=1 --num_reactant=2 --num_solv=2 --num_agent=0 --num_cat=1 --num_reag=2 --consistent_yield=True --scramble=True --train_test_split_fraction=0.9 paper_6: paper_gen_uspto_no_trust_no_map paper_gen_uspto_no_trust_with_map paper_gen_uspto_with_trust_with_map paper_gen_uspto_with_trust_no_map # 7. gen fp fp_no_trust_no_map_test: - python -m orderly.gen_fp --clean_data_folder_path="data/orderly/datasets/orderly_no_trust_no_map_test.parquet" --fp_size=2048 --overwrite=False + python -m orderly.gen_fp --clean_data_folder_path="data/orderly/datasets_$(dataset_version)/orderly_no_trust_no_map_test.parquet" --fp_size=2048 --overwrite=False fp_no_trust_no_map_train: - python -m orderly.gen_fp --clean_data_folder_path="data/orderly/datasets/orderly_no_trust_no_map_train.parquet" --fp_size=2048 --overwrite=False + python -m orderly.gen_fp --clean_data_folder_path="data/orderly/datasets_$(dataset_version)/orderly_no_trust_no_map_train.parquet" --fp_size=2048 --overwrite=False fp_no_trust_with_map_test: - python -m orderly.gen_fp --clean_data_folder_path="data/orderly/datasets/orderly_no_trust_with_map_test.parquet" --fp_size=2048 --overwrite=False + python -m orderly.gen_fp --clean_data_folder_path="data/orderly/datasets_$(dataset_version)/orderly_no_trust_with_map_test.parquet" --fp_size=2048 --overwrite=False fp_no_trust_with_map_train: - python -m orderly.gen_fp --clean_data_folder_path="data/orderly/datasets/orderly_no_trust_with_map_train.parquet" --fp_size=2048 --overwrite=False + python -m orderly.gen_fp --clean_data_folder_path="data/orderly/datasets_$(dataset_version)/orderly_no_trust_with_map_train.parquet" --fp_size=2048 --overwrite=False fp_with_trust_with_map_test: - python -m orderly.gen_fp --clean_data_folder_path="data/orderly/datasets/orderly_with_trust_with_map_test.parquet" --fp_size=2048 --overwrite=False + python -m orderly.gen_fp --clean_data_folder_path="data/orderly/datasets_$(dataset_version)/orderly_with_trust_with_map_test.parquet" --fp_size=2048 --overwrite=False fp_with_trust_with_map_train: - python -m orderly.gen_fp --clean_data_folder_path="data/orderly/datasets/orderly_with_trust_with_map_train.parquet" --fp_size=2048 --overwrite=False + python -m orderly.gen_fp --clean_data_folder_path="data/orderly/datasets_$(dataset_version)/orderly_with_trust_with_map_train.parquet" --fp_size=2048 --overwrite=False fp_with_trust_no_map_test: - python -m orderly.gen_fp --clean_data_folder_path="data/orderly/datasets/orderly_with_trust_no_map_test.parquet" --fp_size=2048 --overwrite=False + python -m orderly.gen_fp --clean_data_folder_path="data/orderly/datasets_$(dataset_version)/orderly_with_trust_no_map_test.parquet" --fp_size=2048 --overwrite=False fp_with_trust_no_map_train: - python -m orderly.gen_fp --clean_data_folder_path="data/orderly/datasets/orderly_with_trust_no_map_train.parquet" --fp_size=2048 --overwrite=False + python -m orderly.gen_fp --clean_data_folder_path="data/orderly/datasets_$(dataset_version)/orderly_with_trust_no_map_train.parquet" --fp_size=2048 --overwrite=False paper_7: fp_no_trust_no_map_test fp_no_trust_no_map_train fp_no_trust_with_map_test fp_no_trust_with_map_train fp_with_trust_with_map_test fp_with_trust_with_map_train fp_with_trust_no_map_test fp_with_trust_no_map_train @@ -288,36 +289,39 @@ paper_gen_all: paper_1 paper_2 paper_3 paper_4 paper_5 paper_6 paper_7 #Remember to switch env here (must contain TF, e.g. tf_mac_m1) # Full dataset no_trust_no_map_train: - python -m condition_prediction --train_data_path="data/orderly/datasets/orderly_no_trust_no_map_train.parquet" --test_data_path="data/orderly/datasets/orderly_no_trust_no_map_test.parquet" --output_folder_path="models/no_trust_no_map" --train_fraction=1 --train_val_split=0.8 --overwrite=False --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 --wandb_entity=WANDB_ENTITY + python -m condition_prediction --train_data_path="data/orderly/datasets_$(dataset_version)/orderly_no_trust_no_map_train.parquet" --test_data_path="data/orderly/datasets_$(dataset_version)/orderly_no_trust_no_map_test.parquet" --output_folder_path="models/no_trust_no_map" --train_fraction=1 --train_val_split=0.8 --overwrite=False --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 --wandb_entity=$(WANDB_ENTITY) --dataset_version=$(datset_version) no_trust_with_map_train: - python -m condition_prediction --train_data_path="data/orderly/datasets/orderly_no_trust_with_map_train.parquet" --test_data_path="data/orderly/datasets/orderly_no_trust_with_map_test.parquet" --output_folder_path="models/no_trust_with_map" --train_fraction=1 --train_val_split=0.8 --overwrite=False --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 --wandb_entity=WANDB_ENTITY + python -m condition_prediction --train_data_path="data/orderly/datasets_$(dataset_version)/orderly_no_trust_with_map_train.parquet" --test_data_path="data/orderly/datasets_$(dataset_version)/orderly_no_trust_with_map_test.parquet" --output_folder_path="models/no_trust_with_map" --train_fraction=1 --train_val_split=0.8 --overwrite=False --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 --wandb_entity=$(WANDB_ENTITY) --dataset_version=$(datset_version) with_trust_no_map_train: - python -m condition_prediction --train_data_path="data/orderly/datasets/orderly_with_trust_no_map_train.parquet" --test_data_path="data/orderly/datasets/orderly_with_trust_no_map_test.parquet" --output_folder_path="models/with_trust_no_map" --train_fraction=1 --train_val_split=0.8 --overwrite=False --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 --wandb_entity=WANDB_ENTITY + python -m condition_prediction --train_data_path="data/orderly/datasets_$(dataset_version)/orderly_with_trust_no_map_train.parquet" --test_data_path="data/orderly/datasets_$(dataset_version)/orderly_with_trust_no_map_test.parquet" --output_folder_path="models/with_trust_no_map" --train_fraction=1 --train_val_split=0.8 --overwrite=False --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 --wandb_entity=$(WANDB_ENTITY) --dataset_version=$(datset_version) with_trust_with_map_train: - python -m condition_prediction --train_data_path="data/orderly/datasets/orderly_with_trust_with_map_train.parquet" --test_data_path="data/orderly/datasets/orderly_with_trust_with_map_test.parquet" --output_folder_path="models/with_trust_with_map" --train_fraction=1 --train_val_split=0.8 --overwrite=False --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 --wandb_entity=WANDB_ENTITY + python -m condition_prediction --train_data_path="data/orderly/datasets_$(dataset_version)/orderly_with_trust_with_map_train.parquet" --test_data_path="data/orderly/datasets_$(dataset_version)/orderly_with_trust_with_map_test.parquet" --output_folder_path="models/with_trust_with_map" --train_fraction=1 --train_val_split=0.8 --overwrite=False --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 --wandb_entity=$(WANDB_ENTITY) --dataset_version=$(datset_version) # 20% of data no_trust_no_map_train_20: - python -m condition_prediction --train_data_path="data/orderly/datasets/orderly_no_trust_no_map_train.parquet" --test_data_path="data/orderly/datasets/orderly_no_trust_no_map_test.parquet" --output_folder_path="models/no_trust_no_map_20" --train_fraction=0.2 --train_val_split=0.8 --overwrite=False --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 --wandb_entity=WANDB_ENTITY + python -m condition_prediction --train_data_path="data/orderly/datasets_$(dataset_version)/orderly_no_trust_no_map_train.parquet" --test_data_path="data/orderly/datasets_$(dataset_version)/orderly_no_trust_no_map_test.parquet" --output_folder_path="models/no_trust_no_map_20" --train_fraction=0.2 --train_val_split=0.8 --overwrite=False --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 --wandb_entity=$(WANDB_ENTITY) --dataset_version=$(datset_version) no_trust_with_map_train_20: - python -m condition_prediction --train_data_path="data/orderly/datasets/orderly_no_trust_with_map_train.parquet" --test_data_path="data/orderly/datasets/orderly_no_trust_with_map_test.parquet" --output_folder_path="models/no_trust_with_map_20" --train_fraction=0.2 --train_val_split=0.8 --overwrite=False --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 --wandb_entity=WANDB_ENTITY + python -m condition_prediction --train_data_path="data/orderly/datasets_$(dataset_version)/orderly_no_trust_with_map_train.parquet" --test_data_path="data/orderly/datasets_$(dataset_version)/orderly_no_trust_with_map_test.parquet" --output_folder_path="models/no_trust_with_map_20" --train_fraction=0.2 --train_val_split=0.8 --overwrite=False --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 --wandb_entity=$(WANDB_ENTITY) --dataset_version=$(datset_version) with_trust_no_map_train_20: - python -m condition_prediction --train_data_path="data/orderly/datasets/orderly_with_trust_no_map_train.parquet" --test_data_path="data/orderly/datasets/orderly_with_trust_no_map_test.parquet" --output_folder_path="models/with_trust_no_map_20" --train_fraction=0.2 --train_val_split=0.8 --overwrite=False --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 --wandb_entity=WANDB_ENTITY + python -m condition_prediction --train_data_path="data/orderly/datasets_$(dataset_version)/orderly_with_trust_no_map_train.parquet" --test_data_path="data/orderly/datasets_$(dataset_version)/orderly_with_trust_no_map_test.parquet" --output_folder_path="models/with_trust_no_map_20" --train_fraction=0.2 --train_val_split=0.8 --overwrite=False --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 --wandb_entity=$(WANDB_ENTITY) --dataset_version=$(datset_version) with_trust_with_map_train_20: - python -m condition_prediction --train_data_path="data/orderly/datasets/orderly_with_trust_with_map_train.parquet" --test_data_path="data/orderly/datasets/orderly_with_trust_with_map_test.parquet" --output_folder_path="models/with_trust_with_map_20" --train_fraction=0.2 --train_val_split=0.8 --overwrite=False --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 --wandb_entity=WANDB_ENTITY + python -m condition_prediction --train_data_path="data/orderly/datasets_$(dataset_version)/orderly_with_trust_with_map_train.parquet" --test_data_path="data/orderly/datasets_$(dataset_version)/orderly_with_trust_with_map_test.parquet" --output_folder_path="models/with_trust_with_map_20" --train_fraction=0.2 --train_val_split=0.8 --overwrite=False --epochs=20 --evaluate_on_test_data=True --early_stopping_patience=5 --wandb_entity=WANDB_ENTITY # Sweeps RANDOM_SEEDS = 12345 54321 98765 -TRAIN_FRACS = 0.2 0.4 0.6 0.8 1.0 -DATASETS_PATH = /project/studios/orderly-preprocessing/ORDerly/data/orderly/datasets/ -DATASETS = no_trust_no_map no_trust_with_map with_trust_no_map with_trust_with_map +TRAIN_FRACS = 1.0 0.2 0.4 0.6 0.8 +# Path on lightning +# DATASETS_PATH = /project/studios/orderly-preprocessing/ORDerly/data/orderly/datasets_$(dataset_version)/ +# Normal path +DATASETS_PATH = ORDerly/data/orderly/datasets_$(dataset_version)/ +DATASETS = no_trust_with_map no_trust_no_map with_trust_with_map with_trust_no_map dataset_size_sweep: @for random_seed in ${RANDOM_SEEDS}; \ do \ @@ -325,7 +329,7 @@ dataset_size_sweep: do \ for train_frac in ${TRAIN_FRACS}; \ do \ - rm -rf .tf_cache* && python -m condition_prediction --train_data_path=${DATASETS_PATH}/orderly_$${dataset}_train.parquet --test_data_path=${DATASETS_PATH}/orderly_$${dataset}_test.parquet --output_folder_path=models/$${dataset} --train_fraction=$${train_frac} --train_val_split=0.8 --random_seed=$${random_seed} --overwrite=True --batch_size=512 --epochs=100 --early_stopping_patience=0 --evaluate_on_test_data=True --wandb_entity=$(WANDB_ENTITY); \ + rm -rf .tf_cache* && python -m condition_prediction --train_data_path=${DATASETS_PATH}/orderly_$${dataset}_train.parquet --test_data_path=${DATASETS_PATH}/orderly_$${dataset}_test.parquet --output_folder_path=models/$${dataset} --dataset_version=$(datset_version) --train_fraction=$${train_frac} --train_val_split=0.8 --random_seed=$${random_seed} --overwrite=True --batch_size=512 --epochs=100 --train_mode=0 --early_stopping_patience=0 --evaluate_on_test_data=True --wandb_entity=$(WANDB_ENTITY) ; \ done \ done \ done diff --git a/condition_prediction/condition_prediction/run.py b/condition_prediction/condition_prediction/run.py index 82b04532..5cd98b1f 100644 --- a/condition_prediction/condition_prediction/run.py +++ b/condition_prediction/condition_prediction/run.py @@ -11,16 +11,15 @@ LOG = logging.getLogger(__name__) -from functools import partial import numpy as np import pandas as pd import tensorflow as tf +import wandb from click_loglevel import LogLevel from keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau from wandb.keras import WandbMetricsLogger, WandbModelCheckpoint -import wandb from condition_prediction.constants import HARD_SELECTION, SOFT_SELECTION, TEACHER_FORCE from condition_prediction.data_generator import ( get_datasets, @@ -34,6 +33,7 @@ ) from condition_prediction.utils import ( TrainingMetrics, + download_model_from_wandb, frequency_informed_accuracy, get_grouped_scores, get_grouped_scores_top_n, @@ -93,8 +93,13 @@ class ConditionPrediction: wandb_entity: Optional[str] = None wandb_tags: Optional[List[str]] = None wandb_group: Optional[str] = None + wandb_run_id: Optional[str] = None + resume: bool = False + resume_from_best: bool = False verbosity: int = 2 random_seed: int = 12345 + skip_training: bool = False + dataset_version: str = "v5" def __post_init__(self) -> None: pass @@ -131,6 +136,7 @@ def run_model_arguments(self) -> None: random_seed=self.random_seed, epochs=self.epochs, train_mode=self.train_mode, + skip_training=self.skip_training, fp_size=self.fp_size, dropout=self.dropout, hidden_size_1=self.hidden_size_1, @@ -154,7 +160,11 @@ def run_model_arguments(self) -> None: wandb_logging=self.wandb_logging, wandb_tags=self.wandb_tags, wandb_group=self.wandb_group, + wandb_run_id=self.wandb_run_id, + resume=self.resume, + resume_from_best=self.resume_from_best, verbosity=self.verbosity, + dataset_version=self.dataset_version, ) @staticmethod @@ -269,38 +279,38 @@ def evaluate_model(model, dataset, encoders): solvent_scores_top1 = get_grouped_scores( ground_truth[:2], predictions[:2], encoders[:2] ) - metrics["test_solvent_accuracy_top1"] = np.mean(solvent_scores_top1) + metrics["solvent_accuracy_top1"] = np.mean(solvent_scores_top1) # 3 agents scores agent_scores_top1 = get_grouped_scores( ground_truth[2:], predictions[2:], encoders[2:] ) - metrics["test_three_agents_accuracy_top1"] = np.mean(agent_scores_top1) + metrics["three_agents_accuracy_top1"] = np.mean(agent_scores_top1) # Overall scores overall_scores_top1 = np.stack( [solvent_scores_top1, agent_scores_top1], axis=1 ).all(axis=1) - metrics["test_overall_accuracy_top1"] = np.mean(overall_scores_top1) + metrics["overall_accuracy_top1"] = np.mean(overall_scores_top1) # Top 3 accuracies # Solvent score solvent_scores_top3 = get_grouped_scores_top_n( ground_truth[:2], predictions[:2], encoders[:2], 3 ) - metrics["test_solvent_accuracy_top3"] = np.mean(solvent_scores_top3) + metrics["solvent_accuracy_top3"] = np.mean(solvent_scores_top3) # 3 agents scores agent_scores_top3 = get_grouped_scores_top_n( ground_truth[2:], predictions[2:], encoders[2:], 3 ) - metrics["test_three_agents_accuracy_top3"] = np.mean(agent_scores_top3) + metrics["three_agents_accuracy_top3"] = np.mean(agent_scores_top3) # Overall scores overall_scores_top3 = np.stack( [solvent_scores_top3, agent_scores_top3], axis=1 ).all(axis=1) - metrics["test_overall_accuracy_top3"] = np.mean(overall_scores_top3) + metrics["overall_accuracy_top3"] = np.mean(overall_scores_top3) return metrics @@ -340,7 +350,11 @@ def run_model( wandb_tags: Optional[List[str]] = None, wandb_group: Optional[str] = None, verbosity: int = 2, - dataset_version: str = "v4", + dataset_version: str = "v5", + skip_training: bool = False, + wandb_run_id: Optional[str] = None, + resume: bool = False, + resume_from_best: bool = False, ) -> None: """ Run condition prediction training @@ -563,6 +577,8 @@ def run_model( tags=wandb_tags, group=wandb_group, config=config, + id=wandb_run_id if resume else None, + resume="allow" if resume else None, # sync_tensorboard=True, ) callbacks.extend( @@ -580,31 +596,58 @@ def run_model( save_weights_only=True, ) ) - - use_multiprocessing = True if workers > 0 else False - h = None last_checkpoint_filepath = output_folder_path / "weights.last.hdf5" - try: - h = model.fit( - train_dataset, - epochs=epochs, - verbose=verbosity, - validation_data=val_dataset_for_train, - callbacks=callbacks, - use_multiprocessing=use_multiprocessing, - workers=workers, + if resume and wandb_run_id is not None: + # Download the model weights from wandb + api = wandb.Api() + run = api.run(f"{wandb_entity}/{wandb_project}/{wandb_run_id}") + + # Download best model + download_model_from_wandb( + run, + alias="best", + root=output_folder_path, ) - except KeyboardInterrupt: - LOG.info( - "Keyboard interrupt detected. Stopping training and doing evaluation." + download_model_from_wandb( + run, + alias="last_epoch", + root=output_folder_path, ) - finally: - model.save_weights(last_checkpoint_filepath) + + # Update weights + if resume_from_best: + model.load_weights(best_checkpoint_filepath) + else: + model.load_weights(last_checkpoint_filepath) update_teacher_forcing_model_weights( update_model=pred_model, to_copy_model=model ) - # Upload the best and last model model - if wandb_logging: + + use_multiprocessing = True if workers > 0 else False + h = None + if not skip_training: + try: + h = model.fit( + train_dataset, + epochs=epochs, + verbose=verbosity, + validation_data=val_dataset_for_train, + callbacks=callbacks, + use_multiprocessing=use_multiprocessing, + workers=workers, + ) + except KeyboardInterrupt: + LOG.info( + "Keyboard interrupt detected. Stopping training and doing evaluation." + ) + finally: + model.save_weights(last_checkpoint_filepath) + update_teacher_forcing_model_weights( + update_model=pred_model, to_copy_model=model + ) + + # Upload the best and last model + if wandb_logging and not skip_training: # Save and upload last model artifact = wandb.Artifact( # type: ignore name=f"run_{wandb_run.id}_model", # type: ignore @@ -623,6 +666,10 @@ def run_model( # Train and val metrics train_val_metrics_dict = {} + model.load_weights(last_checkpoint_filepath) + update_teacher_forcing_model_weights( + update_model=pred_model, to_copy_model=model + ) train_val_metrics_dict["trust_labelling"] = trust_labelling train_val_metrics_dict.update( { @@ -697,7 +744,6 @@ def run_model( test_metrics_file_path = output_folder_path / "test_metrics.json" with open(test_metrics_file_path, "w") as file: json.dump(jsonify_dict(test_metrics_dict), file) - if wandb_logging: # Log data artifact = wandb.Artifact( # type: ignore @@ -757,6 +803,12 @@ def run_model( type=int, help="Training mode. 0 for Teacher force, 1 for hard seleciton, 2 for soft selection", ) +@click.option( + "--dataset_version", + default="v5", + type=str, + help="The version of the dataset", +) @click.option( "--epochs", default=20, @@ -932,6 +984,7 @@ def main_click( output_folder_path: pathlib.Path, train_fraction: float, train_val_split: float, + dataset_version: str, random_seed: int, epochs: int, train_mode: int, @@ -989,6 +1042,7 @@ def main_click( train_fraction=train_fraction, train_val_split=train_val_split, random_seed=random_seed, + dataset_version=dataset_version, epochs=epochs, train_mode=train_mode, early_stopping_patience=early_stopping_patience, @@ -1028,6 +1082,7 @@ def main( output_folder_path: pathlib.Path, train_fraction: float, train_val_split: float, + dataset_version: str, epochs: int, random_seed: int, train_mode: int, @@ -1134,6 +1189,7 @@ def main( output_folder_path=output_folder_path, train_fraction=train_fraction, train_val_split=train_val_split, + dataset_version=dataset_version, random_seed=random_seed, generate_fingerprints=generate_fingerprints, fp_size=fp_size, diff --git a/condition_prediction/condition_prediction/utils.py b/condition_prediction/condition_prediction/utils.py index 4003f902..7220189f 100644 --- a/condition_prediction/condition_prediction/utils.py +++ b/condition_prediction/condition_prediction/utils.py @@ -1,18 +1,19 @@ +import math import os import socket from collections import Counter from copy import deepcopy from datetime import datetime from datetime import datetime as dt -from typing import List +from itertools import product +from pathlib import Path +from typing import List, Tuple import matplotlib.pyplot as plt import numpy as np from keras import callbacks from sklearn.preprocessing import OneHotEncoder - -from itertools import product -import math +from wandb.sdk.wandb_run import Run def log_dir(prefix="", comment=""): @@ -392,3 +393,33 @@ def listtonumpy(a, copy=True): if transform_all: a = np.array(a) return a + + +def download_model_from_wandb( + run: Run, alias="best", weights_file="weights.best.hdf5", root=None +) -> Tuple[Path, str]: + """Download best model from wandb + + Arguments + ---------- + run: wandb.Run + + + Returns + ------- + Path to best model checkpoint + + """ + # Get best checkpoint + artifacts = run.logged_artifacts() # type: ignore + ckpt_path = None + artifact_name = None + for artifact in artifacts: + if artifact.type == "model" and alias in artifact.aliases: + ckpt_path = artifact.download(root=root) + artifact_name = artifact.name + if ckpt_path is None or artifact_name is None: + raise ValueError("No checkpoint found with alias: {}".format(alias)) + ckpt_path = Path(ckpt_path) / weights_file + + return ckpt_path, artifact_name diff --git a/notebooks/clean_wandb.ipynb b/notebooks/clean_wandb.ipynb new file mode 100644 index 00000000..a29762a3 --- /dev/null +++ b/notebooks/clean_wandb.ipynb @@ -0,0 +1,105 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import wandb\n", + "from tqdm import tqdm\n", + "from datetime import datetime" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "api = wandb.Api()\n", + "wandb_entity=\"ceb-sre\"\n", + "wandb_project=\"orderly\"\n", + "runs = api.runs(\n", + " f\"{wandb_entity}/{wandb_project}\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 7/7 [00:21<00:00, 3.06s/it]\n" + ] + } + ], + "source": [ + "for run in tqdm(runs):\n", + " artifacts = run.logged_artifacts()\n", + " for artifact in artifacts:\n", + " if artifact.type == \"model\":\n", + " artifact.delete(delete_aliases=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 3476/3476 [00:52<00:00, 65.98it/s]\n" + ] + } + ], + "source": [ + "start_date = datetime(2023, 4, 1)\n", + "date_format = \"%Y-%m-%dT%H:%M:%S\"\n", + "for run in tqdm(runs):\n", + " date_str = runs[0].createdAt\n", + " date_obj = datetime.strptime(date_str, date_format)\n", + " artifacts = run.logged_artifacts()\n", + " if date_obj < start_date:\n", + " for artifact in artifacts:\n", + " if artifact.type == \"model\":\n", + " artifact.delete(delete_aliases=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.11" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/plot_model_performance_wandb.ipynb b/notebooks/plot_model_performance_wandb.ipynb new file mode 100644 index 00000000..f5d04b57 --- /dev/null +++ b/notebooks/plot_model_performance_wandb.ipynb @@ -0,0 +1,799 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-06-07 14:34:45.262124: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", + "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2023-06-07 14:34:45.985455: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n", + "2023-06-07 14:34:49.711563: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:996] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", + "2023-06-07 14:34:49.734714: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:996] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", + "2023-06-07 14:34:49.735672: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:996] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n" + ] + } + ], + "source": [ + "from condition_prediction.run import ConditionPrediction\n", + "import wandb\n", + "from tqdm import tqdm\n", + "from datetime import datetime\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pathlib\n", + "from tqdm import tqdm\n", + "import gc" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "api = wandb.Api()\n", + "wandb_entity=\"ceb-sre\"\n", + "wandb_project=\"orderly\"" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Prefetch buffer size: -1\n", + "Prefetch buffer size: -1\n", + "Prefetch buffer size: -1\n" + ] + }, + { + "data": { + "text/html": [ + "Tracking run with wandb version 0.15.4" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Run data is saved locally in /home/zeus/content/wandb/run-20230607_021600-zbx7fqj5" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Resuming run fast-sound-304 to Weights & Biases (docs)
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View project at https://wandb.ai/ceb-sre/orderly" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run at https://wandb.ai/ceb-sre/orderly/runs/zbx7fqj5" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[34m\u001b[1mwandb\u001b[0m: Downloading large artifact run_zbx7fqj5_model:v1, 67.03MB. 1 files... \n", + "\u001b[34m\u001b[1mwandb\u001b[0m: 1 of 1 files downloaded. \n", + "Done. 0:0:1.0\n", + "\u001b[34m\u001b[1mwandb\u001b[0m: Downloading large artifact run_zbx7fqj5_model:v0, 67.03MB. 1 files... \n", + "\u001b[34m\u001b[1mwandb\u001b[0m: 1 of 1 files downloaded. \n", + "Done. 0:0:1.2\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "139/139 [==============================] - 2s 10ms/step\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-06-07 02:16:06.394389: I tensorflow/core/grappler/optimizers/data/replicate_on_split.cc:32] Running replicate on split optimization\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "139/139 [==============================] - 1s 10ms/step\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-06-07 02:17:33.114064: I tensorflow/core/grappler/optimizers/data/replicate_on_split.cc:32] Running replicate on split optimization\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "73/73 [==============================] - 2s 16ms/step - loss: 14.3971 - mol1_loss: 2.5769 - mol2_loss: 2.3048 - mol3_loss: 3.0256 - mol4_loss: 4.0312 - mol5_loss: 2.4585 - mol1_acc: 0.2945 - mol1_top3: 0.5576 - mol1_top5: 0.6933 - mol2_acc: 0.5355 - mol2_top3: 0.6867 - mol2_top5: 0.7460 - mol3_acc: 0.2804 - mol3_top3: 0.5287 - mol3_top5: 0.6506 - mol4_acc: 0.3250 - mol4_top3: 0.4592 - mol4_top5: 0.5393 - mol5_acc: 0.7476 - mol5_top3: 0.8141 - mol5_top5: 0.8418\n", + "73/73 [==============================] - 1s 10ms/step\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-06-07 02:19:00.864700: I tensorflow/core/grappler/optimizers/data/replicate_on_split.cc:32] Running replicate on split optimization\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "73/73 [==============================] - 1s 11ms/step\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-06-07 02:19:40.395855: I tensorflow/core/grappler/optimizers/data/replicate_on_split.cc:32] Running replicate on split optimization\n" + ] + }, + { + "data": { + "text/html": [ + "Waiting for W&B process to finish... (success)." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

Run summary:


epoch/epoch99
epoch/learning_rate0.01
epoch/loss1.09914
epoch/mol1_acc0.91118
epoch/mol1_loss0.2798
epoch/mol1_top30.98683
epoch/mol1_top50.99557
epoch/mol2_acc0.93469
epoch/mol2_loss0.20221
epoch/mol2_top30.99249
epoch/mol2_top50.99727
epoch/mol3_acc0.9036
epoch/mol3_loss0.31104
epoch/mol3_top30.985
epoch/mol3_top50.99469
epoch/mol4_acc0.93643
epoch/mol4_loss0.20053
epoch/mol4_top30.99228
epoch/mol4_top50.9974
epoch/mol5_acc0.96917
epoch/mol5_loss0.10558
epoch/mol5_top30.99613
epoch/mol5_top50.9987
epoch/time_per_step0.04884
epoch/training_throughput10482.20503
epoch/val_loss22.84926
epoch/val_mol1_acc0.26352
epoch/val_mol1_loss6.14518
epoch/val_mol1_top30.48875
epoch/val_mol1_top50.61298
epoch/val_mol2_acc0.46446
epoch/val_mol2_loss4.19288
epoch/val_mol2_top30.70539
epoch/val_mol2_top50.79343
epoch/val_mol3_acc0.27778
epoch/val_mol3_loss6.79353
epoch/val_mol3_top30.4941
epoch/val_mol3_top50.5984
epoch/val_mol4_acc0.54362
epoch/val_mol4_loss4.00107
epoch/val_mol4_top30.74025
epoch/val_mol4_top50.80768
epoch/val_mol5_acc0.81986
epoch/val_mol5_loss1.71659
epoch/val_mol5_top30.92357
epoch/val_mol5_top50.94678
frequency_informed_agent_accuracy0.08395
frequency_informed_agent_accuracy_top_10.08395
frequency_informed_agent_accuracy_top_30.18618
frequency_informed_overall_accuracy0.01638
frequency_informed_overall_accuracy_top_10.01638
frequency_informed_overall_accuracy_top_30.03929
frequency_informed_solvent_accuracy0.08808
frequency_informed_solvent_accuracy_top_10.08808
frequency_informed_solvent_accuracy_top_30.22639
loss14.38841
mol1_acc0.29105
mol1_loss2.57782
mol1_top30.55775
mol1_top50.69565
mol2_acc0.53309
mol2_loss2.30201
mol2_top30.68826
mol2_top50.74633
mol3_acc0.28063
mol3_loss3.02522
mol3_top30.52925
mol3_top50.65029
mol4_acc0.3285
mol4_loss4.02904
mol4_top30.45636
mol4_top50.53967
mol5_acc0.74852
mol5_loss2.45431
mol5_top30.81477
mol5_top50.84318
trust_labellingFalse

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run fast-sound-304 at: https://wandb.ai/ceb-sre/orderly/runs/zbx7fqj5
Synced 3 W&B file(s), 0 media file(s), 2 artifact file(s) and 1 other file(s)" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Find logs at: ./wandb/run-20230607_021600-zbx7fqj5/logs" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "BASE_PATH = pathlib.Path(\"/project/studios/orderly-preprocessing/ORDerly/\")\n", + "DATASETS_PATH = BASE_PATH / \"data/orderly/datasets/\"\n", + "MODEL_PATH = pathlib.Path(\"ORDerly/models/\")\n", + "dataset = \"no_trust_with_map\"\n", + "filters = {\n", + " # \"state\": \"crashed\",\n", + " \"config.output_folder_path\": {\n", + " \"$in\": [\n", + " f\"models/{dataset}\",\n", + " str(MODEL_PATH / dataset),\n", + " f\"/Users/Kobi/Documents/Research/phd_code/ORDerly/models/{dataset}\",\n", + " ],\n", + " },\n", + " \"config.random_seed\": 12345,\n", + " \"config.train_fraction\": 0.2,\n", + " \"config.dataset_version\": \"v4\",\n", + " \"config.train_mode\": 0, # Teacher forcing\n", + "}\n", + "# filters = {\n", + "# \"id\": {\"$in\": [\"zl4inibc\", \"mdwxixa4\", \"zbx7fqj5\"]}\n", + "# }\n", + "runs = api.runs(f\"{wandb_entity}/{wandb_project}\", filters=filters)\n", + "# if not len(runs) == 5: # For 5 training fractions\n", + "# raise ValueError(f\"Not 5 runs for {dataset} (found {len(runs)}, seed {random_seed})\")\n", + "\n", + "for run in runs:\n", + " config = dict(run.config)\n", + " train_data_path = pathlib.Path(\n", + " f\"{DATASETS_PATH}/orderly_{dataset}_train.parquet\"\n", + " )\n", + " test_data_path = pathlib.Path(\n", + " f\"{DATASETS_PATH}/orderly_{dataset}_test.parquet\"\n", + " )\n", + " fp_directory = train_data_path.parent / \"fingerprints\"\n", + " train_fp_path = fp_directory / (train_data_path.stem + \".npy\")\n", + " test_fp_path = fp_directory / (test_data_path.stem + \".npy\")\n", + " output_folder_path = MODEL_PATH / dataset\n", + " output_folder_path.mkdir(parents=True, exist_ok=True)\n", + " tags = dataset.split(\"_\")\n", + " tags = [f\"{tags[0]}_{tags[1]}\", f\"{tags[2]}_{tags[3]}\"]\n", + " config.update(\n", + " {\n", + " \"train_data_path\": train_data_path,\n", + " \"test_data_path\": test_data_path,\n", + " \"train_fp_path\": train_fp_path,\n", + " \"test_fp_path\": test_fp_path,\n", + " \"output_folder_path\": output_folder_path,\n", + " \"skip_training\": True,\n", + " \"resume\": True,\n", + " \"resume_from_best\": True,\n", + " \"generate_fingerprints\": False,\n", + " \"wandb_run_id\": run.id,\n", + " \"wandb_tags\": tags,\n", + " }\n", + " )\n", + " del config[\"n_val\"]\n", + " del config[\"n_test\"]\n", + " del config[\"n_train\"]\n", + " del config[\"dataset_version\"]\n", + " instance = ConditionPrediction(**config)\n", + " instance.run_model_arguments()\n", + " wandb.finish()\n", + " gc.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(runs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Table for dataset v4" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Solvents & 47 // 58 // \\textcolor{lessgreen}{21\\%} & 50 // 61 // \\textcolor{lessgreen}{22\\%} & 23 // 42 // \\textcolor{lessgreen}{26\\%} & 24 // 45 // \\textcolor{lessgreen}{28\\%} \\\\ \n", + "Agents & 54 // 70 // \\textcolor{lessgreen}{35\\%} & 58 // 72 // \\textcolor{lessgreen}{32\\%} & 19 // 39 // \\textcolor{lessgreen}{25\\%} & 21 // 42 // \\textcolor{lessgreen}{27\\%} \\\\ \n", + "Solvents \\& Agents & 31 // 44 // \\textcolor{lessgreen}{19\\%} & 33 // 47 // \\textcolor{lessgreen}{21\\%} & 4 // 21 // \\textcolor{lessgreen}{18\\%} & 5 // 24 // \\textcolor{lessgreen}{21\\%} \\\\\n" + ] + } + ], + "source": [ + "DATASETS = [\"with_trust_with_map\",\"with_trust_no_map\",\"no_trust_with_map\", \"no_trust_no_map\"]\n", + "lines = [\"Solvents\", \"Agents\", \"Solvents \\& Agents\"]\n", + "top_n = 3\n", + "for dataset in DATASETS:\n", + " filters = {\n", + " \"state\": \"finished\",\n", + " \"config.output_folder_path\": f\"models/{dataset}\",\n", + " \"config.random_seed\": 54321,\n", + " \"config.train_fraction\": 1.0,\n", + " \"config.train_mode\": 0, # Teacher forcing\n", + " \"config.dataset_version\": {\"$in\": [\"v4\", \"v5\"]}\n", + " }\n", + " runs = api.runs(\n", + " f\"{wandb_entity}/{wandb_project}\",\n", + " filters=filters\n", + " )\n", + " run = runs[0]\n", + " if len(runs)>0:\n", + " for r in runs:\n", + " if run.config[\"dataset_version\"] == \"v5\":\n", + " run = r\n", + " break\n", + "\n", + " # Get model solvent, agent and overall accuracy\n", + " test_best = run.summary[\"test_best\"]\n", + " solvent_accuracy = test_best[f\"solvent_accuracy_top{top_n}\"]\n", + " agent_accuracy = test_best[f\"three_agents_accuracy_top{top_n}\"]\n", + " overall_accuracy = test_best[f\"overall_accuracy_top{top_n}\"]\n", + "\n", + " # Get frequency informed solvent, agent and overall accuracy\n", + " fi_solvent_accuracy = run.summary[f\"frequency_informed_solvent_accuracy_top_{top_n}\"]\n", + " fi_agent_accuracy = run.summary[f\"frequency_informed_agent_accuracy_top_{top_n}\"]\n", + " fi_overall_accuracy = run.summary[f\"frequency_informed_overall_accuracy_top_{top_n}\"]\n", + "\n", + " # Improvement\n", + " solvent_improvement = (solvent_accuracy-fi_solvent_accuracy)/(1-fi_solvent_accuracy)\n", + " solvent_improvement_color = \"lessgreen\" if solvent_improvement>0 else \"red\"\n", + " agent_improvement = (agent_accuracy-fi_agent_accuracy)/(1-fi_agent_accuracy)\n", + " agent_improvement_color = \"lessgreen\" if agent_improvement>0 else \"red\"\n", + " overall_improvement = (overall_accuracy-fi_overall_accuracy)/(1-fi_overall_accuracy)\n", + " overall_improvement_color = \"lessgreen\" if overall_improvement>0 else \"red\"\n", + "\n", + " # Create table lines\n", + " lines[0] += f\" & {fi_solvent_accuracy*100:.0f} // {solvent_accuracy*100:.0f} // \\\\textcolor{{{solvent_improvement_color}}}{{{solvent_improvement*100:.0f}\\%}} \"\n", + " lines[1] += f\" & {fi_agent_accuracy*100:.0f} // {agent_accuracy*100:.0f} // \\\\textcolor{{{agent_improvement_color}}}{{{agent_improvement*100:.0f}\\%}} \"\n", + " lines[2] += f\" & {fi_overall_accuracy*100:.0f} // {overall_accuracy*100:.0f} // \\\\textcolor{{{overall_improvement_color}}}{{{overall_improvement*100:.0f}\\%}} \"\n", + "print(\"\\\\\\\\ \\n\".join(lines) + \"\\\\\\\\\")" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "DATASETS = [\"no_trust_no_map\", \"no_trust_with_map\"]\n", + "LABELS = {\n", + " \"with_trust_with_map\": r\"Labelling, rare $\\rightarrow$ other\",\n", + " \"with_trust_no_map\": r\"Labelling, rare $\\rightarrow$ delete rxn\",\n", + " \"no_trust_with_map\": r\"Reaction string, rare $\\rightarrow$ other\",\n", + " \"no_trust_no_map\": r\"Reaction string, rare $\\rightarrow$ delete rxn\",\n", + "}\n", + "TRAIN_FRACS = [0.2, 0.4, 0.6, 0.8, 1.0]\n", + "fig, ax = plt.subplots(1)\n", + "markers = [\"o\", \"d\", \"s\", \"^\"]\n", + "top_n = 3\n", + "colors = {\n", + " \"no_trust_with_map\": \"#5C4682\",\n", + " \"no_trust_no_map\": \"#5e813f\",\n", + "}\n", + "for i, dataset in enumerate(DATASETS):\n", + " overall_accuracies = []\n", + " n_train = []\n", + " for train_fraction in TRAIN_FRACS:\n", + " filters = {\n", + " \"state\": \"finished\",\n", + " \"config.output_folder_path\": f\"models/{dataset}\",\n", + " # \"config.random_seed\": {\"$in\": [12345, 54321, 98765]},\n", + " \"config.random_seed\": 54321,\n", + " \"config.train_fraction\": train_fraction,\n", + " \"config.train_mode\": 0, # Teacher forcing\n", + " \"config.dataset_version\": {\"$in\": [\"v4\", \"v5\"]}\n", + " }\n", + " runs = api.runs(\n", + " f\"{wandb_entity}/{wandb_project}\",\n", + " filters=filters\n", + " )\n", + " run = runs[0]\n", + " if len(runs)>0:\n", + " for r in runs:\n", + " if run.config[\"dataset_version\"] == \"v5\":\n", + " run = r\n", + " break\n", + "\n", + " # Get overall accuracy\n", + " acc_local = []\n", + " for run in runs:\n", + " overall_accuracy = run.summary[f\"test_best\"][f\"overall_accuracy_top{top_n}\"]\n", + " fi_overall_accuracy = run.summary[f\"frequency_informed_overall_accuracy_top_{top_n}\"]\n", + " overall_improvement = (overall_accuracy-fi_overall_accuracy)/(1-fi_overall_accuracy)\n", + " acc_local.append(overall_improvement)\n", + " overall_accuracies.append(np.mean(overall_improvement)*100)\n", + " n_train.append(run.config[\"n_train\"])\n", + " \n", + " # Add line to plot\n", + " label = LABELS[dataset]\n", + " ax.plot(\n", + " # TRAIN_FRACS,\n", + " np.array(n_train)/ 1e3, \n", + " overall_accuracies, \n", + " label=label, \n", + " linewidth=3.5, \n", + " marker=markers[i], \n", + " markersize=10,\n", + " color=colors[dataset]\n", + " )\n", + "\n", + "# Formatting\n", + "axis_fontsize = 16\n", + "heading_fontsize = 18\n", + "ax.legend(loc=\"lower right\", fontsize=axis_fontsize)\n", + "ax.set_xlabel(\"Train set size (thousands)\", fontsize=heading_fontsize)\n", + "ax.set_ylabel(\"Overall AIB (%)\", fontsize=heading_fontsize)\n", + "# ax.set_xticks(TRAIN_FRACS)\n", + "# ax.set_xticklabels(ax.gefontsize=axis_fontsize)\n", + "ax.tick_params(labelsize=axis_fontsize)\n", + "# ax.ticklabel_format( style='sci',scilimits=(4,4))\n", + "ylabels = np.arange(8, 22, 2)\n", + "ax.set_yticks(ylabels)\n", + "ax.set_yticklabels([f\"{ylabel:.0f}\" for ylabel in ylabels], fontsize=axis_fontsize)\n", + "fig.tight_layout()\n", + "fig.savefig(\"scaling_behavior.png\", dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "len(runs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "train_fraction" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'with_trust_no_map'" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Solvents & 34 // 52 // \\textcolor{lessgreen}{28\\%} & 34 // 53 // \\textcolor{lessgreen}{30\\%} & 24 // 45 // \\textcolor{lessgreen}{28\\%} & 23 // 42 // \\textcolor{lessgreen}{26\\%} \\\\ \n", + "Agents & 43 // 65 // \\textcolor{lessgreen}{39\\%} & 43 // 67 // \\textcolor{lessgreen}{43\\%} & 21 // 42 // \\textcolor{lessgreen}{27\\%} & 19 // 39 // \\textcolor{lessgreen}{25\\%} \\\\ \n", + "Solvents \\& Agents & 18 // 39 // \\textcolor{lessgreen}{26\\%} & 19 // 41 // \\textcolor{lessgreen}{27\\%} & 5 // 24 // \\textcolor{lessgreen}{21\\%} & 4 // 21 // \\textcolor{lessgreen}{18\\%} \\\\\n" + ] + } + ], + "source": [ + "DATASETS = [\"with_trust_with_map\",\"with_trust_no_map\", \"no_trust_no_map\", \"no_trust_with_map\"]\n", + "lines = [\"Solvents\", \"Agents\", \"Solvents \\& Agents\"]\n", + "top_n = 3\n", + "for dataset in DATASETS:\n", + " filters = {\n", + " \"state\": \"finished\",\n", + " \"config.output_folder_path\": f\"models/{dataset}\",\n", + " \"config.random_seed\": 54321,\n", + " \"config.train_fraction\": 1.0,\n", + " \"config.train_mode\": 0, # Teacher forcing\n", + " }\n", + " runs = api.runs(\n", + " f\"{wandb_entity}/{wandb_project}\",\n", + " filters=filters\n", + " )\n", + " assert len(runs) == 1\n", + " run = runs[0]\n", + "\n", + " # Get model solvent, agent and overall accuracy\n", + " test_best = run.summary[\"test_best\"]\n", + " solvent_accuracy = test_best[f\"solvent_accuracy_top{top_n}\"]\n", + " agent_accuracy = test_best[f\"three_agents_accuracy_top{top_n}\"]\n", + " overall_accuracy = test_best[f\"overall_accuracy_top{top_n}\"]\n", + "\n", + " # Get frequency informed solvent, agent and overall accuracy\n", + " fi_solvent_accuracy = run.summary[f\"frequency_informed_solvent_accuracy_top_{top_n}\"]\n", + " fi_agent_accuracy = run.summary[f\"frequency_informed_agent_accuracy_top_{top_n}\"]\n", + " fi_overall_accuracy = run.summary[f\"frequency_informed_overall_accuracy_top_{top_n}\"]\n", + "\n", + " # Improvement\n", + " solvent_improvement = (solvent_accuracy-fi_solvent_accuracy)/(1-fi_solvent_accuracy)\n", + " solvent_improvement_color = \"lessgreen\" if solvent_improvement>0 else \"red\"\n", + " agent_improvement = (agent_accuracy-fi_agent_accuracy)/(1-fi_agent_accuracy)\n", + " agent_improvement_color = \"lessgreen\" if agent_improvement>0 else \"red\"\n", + " overall_improvement = (overall_accuracy-fi_overall_accuracy)/(1-fi_overall_accuracy)\n", + " overall_improvement_color = \"lessgreen\" if overall_improvement>0 else \"red\"\n", + "\n", + " # Create table lines\n", + " lines[0] += f\" & {fi_solvent_accuracy*100:.0f} // {solvent_accuracy*100:.0f} // \\\\textcolor{{{solvent_improvement_color}}}{{{solvent_improvement*100:.0f}\\%}} \"\n", + " lines[1] += f\" & {fi_agent_accuracy*100:.0f} // {agent_accuracy*100:.0f} // \\\\textcolor{{{agent_improvement_color}}}{{{agent_improvement*100:.0f}\\%}} \"\n", + " lines[2] += f\" & {fi_overall_accuracy*100:.0f} // {overall_accuracy*100:.0f} // \\\\textcolor{{{overall_improvement_color}}}{{{overall_improvement*100:.0f}\\%}} \"\n", + "print(\"\\\\\\\\ \\n\".join(lines) + \"\\\\\\\\\")" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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EydOlKTuJnPEvQ4LC1OAGjRoUL4f9mazWe3bt88usYuSsfe9fvrppxWg7rrrLhUfH5+nbPPmzcpgMChA7nc5++CDD9TUqVPVp59+qo4fP65CQ0PLlNQdPnxYaZqm9Hq92rJli/V4amqq6tGjhwLU0KFD7RW+UkqSunLRpk0bBai5c+fmK9uzZ48ClMlkUgkJCWW+1sqVK61/5WdmZpa5PVEyjrzX69atU4CaNm2aWrZsmSR1N5m97/X27dsVoJo1aybfuxWMve91s2bNFKA+//xzm+W9evVSgFq4cGGZ4hZlM3r06DIldbm97o8++mi+srNnzyqdTqcAdfz48bKGaiVj6hzswoULHDhwAICRI0fmK+/YsSO1a9cmIyODLVu2lPl6rVq1AuDatWvExcWVuT1RfI6813FxcTz++OM0atRIxlVVAI6410uWLAFg8uTJODk52S9YUSaOuNfOzs7FqlejRo3iByoqlMzMTDZv3gzYft+EhITQoUMHANavX2+360pS52BHjhwBoHr16tStW9dmndatW+epWxanT58GwGg0Ur169TK3J4rPkfd64sSJxMXF8dFHHxX7F4JwHHvfa7PZzI4dOwDo3LkzMTExLF68mIkTJzJ58mSWL1/umEHVokiO+L7u168fAPPnz+fKlSt5yrZs2cLOnTvx9/dnwIABpQ1b3GSnTp0iLS0N+Of9cSN7/u7PZbBbS8KmM2fOABAcHFxgndq1a+epW1pKKV5//XUA+vfvXyFWt76VOOper1mzhv/9739MmjTJ+peduLnsfa//+usva9L2888/869//StfEjdt2jTWrFlD9+7dSxu2KAVHfF8///zz/PLLL2zdutXaY+Pl5UV4eDiHDh2iQ4cOfPTRR8XawF1UTLnvBS8vL6pVq2azjr1+919PeuocLDk5GQA3N7cC67i7uwOQlJRUpmvNmTOHffv24e7uzn/+858ytSVKzhH3OiYmhieeeIL69evz2muvlT1IYRf2vtfx8fHW/48bN4677rqLAwcOkJyczK+//sq9997L5cuXGThwoLU3XpQPR3xfu7m5sWnTJqZOnUpqaipbt25l7dq1HDp0CB8fH3r27ElgYGDZgxc3TXn+7r+eJHVVxIoVK3jllVfQ6XR8/PHHNGzY8GaHJOzgscce4+rVq3z44Ye4urre7HCEg6jrdmsMDAxk69at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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "DATASETS = [\"with_trust_with_map\",\"with_trust_no_map\", \"no_trust_no_map\", \"no_trust_with_map\"]\n", + "LABELS = {\n", + " \"with_trust_with_map\": r\"Labelling, rare $\\rightarrow$ other\",\n", + " \"with_trust_no_map\": r\"Labelling, rare $\\rightarrow$ delete rxn\",\n", + " \"no_trust_no_map\": r\"Reaction string, rare $\\rightarrow$ other\",\n", + " \"no_trust_with_map\": r\"Reaction string, rare $\\rightarrow$ delete rxn\",\n", + "}\n", + "TRAIN_FRACS = [0.2, 0.4, 0.6, 0.8, 1.0]\n", + "fig, ax = plt.subplots(1)\n", + "markers = [\"o\", \"d\", \"s\", \"^\"]\n", + "top_n = 3\n", + "for i, dataset in enumerate(DATASETS):\n", + " overall_accuracies = []\n", + " for train_fraction in TRAIN_FRACS:\n", + " filters = {\n", + " \"state\": \"finished\",\n", + " \"config.output_folder_path\": f\"models/{dataset}\",\n", + " # \"config.random_seed\": {\"$in\": [12345, 54321, 98765]},\n", + " \"config.random_seed\": 54321,\n", + " \"config.train_fraction\": train_fraction,\n", + " \"config.train_mode\": 0, # Teacher forcing\n", + " }\n", + " runs = api.runs(\n", + " f\"{wandb_entity}/{wandb_project}\",\n", + " filters=filters\n", + " )\n", + " assert len(runs) == 1\n", + " run = runs[0]\n", + "\n", + " # Get overall accuracy\n", + " acc_local = []\n", + " for run in runs:\n", + " overall_accuracy = run.summary[f\"test_best\"][f\"overall_accuracy_top{top_n}\"]\n", + " fi_overall_accuracy = run.summary[f\"frequency_informed_overall_accuracy_top_{top_n}\"]\n", + " overall_improvement = (overall_accuracy-fi_overall_accuracy)/(1-fi_overall_accuracy)\n", + " acc_local.append(overall_improvement)\n", + " overall_accuracies.append(np.mean(overall_improvement)*100)\n", + " \n", + " # Add line to plot\n", + " label = LABELS[dataset]\n", + " ax.plot(\n", + " TRAIN_FRACS, \n", + " overall_accuracies, \n", + " label=label, \n", + " linewidth=3.5, \n", + " marker=markers[i], \n", + " markersize=10,\n", + " )\n", + "\n", + "# Formatting\n", + "axis_fontsize = 16\n", + "heading_fontsize = 18\n", + "ax.legend(loc=\"upper left\", fontsize=axis_fontsize)\n", + "ax.set_xlabel(\"Training set fraction\", fontsize=heading_fontsize)\n", + "ax.set_ylabel(\"Overall Improvement\", fontsize=heading_fontsize)\n", + "ax.set_xticks(TRAIN_FRACS)\n", + "ax.set_xticklabels(TRAIN_FRACS, fontsize=axis_fontsize)\n", + "# ylabels = np.arange(0.1, 0.35, 0.05)\n", + "# ax.set_yticks(ylabels)\n", + "# ax.set_yticklabels([f\"{ylabel:0.2f}\" for ylabel in ylabels], fontsize=axis_fontsize)\n", + "fig.tight_layout()\n", + "fig.savefig(\"scaling_behavior.png\", dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(runs)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_fraction" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'with_trust_no_map'" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.11" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/update_wandb_runs.py b/notebooks/update_wandb_runs.py new file mode 100644 index 00000000..44ccf201 --- /dev/null +++ b/notebooks/update_wandb_runs.py @@ -0,0 +1,83 @@ +from condition_prediction.run import ConditionPrediction +import wandb +from tqdm import tqdm +from datetime import datetime +import matplotlib.pyplot as plt +import numpy as np +import pathlib +from tqdm import tqdm +import gc + +api = wandb.Api() +wandb_entity = "ceb-sre" +wandb_project = "orderly" + +# Loop through all relevant runs on wandb to get run_ids, datasets and random seeds +# For each rerun the conditionprediction with skip_training=True and resume=True +DATASETS = [ + "with_trust_with_map", + "with_trust_no_map", + "no_trust_no_map", + "no_trust_with_map", +] +BASE_PATH = pathlib.Path("/project/studios/orderly-preprocessing/ORDerly/") +DATASETS_PATH = BASE_PATH / "data/orderly/datasets/" +MODEL_PATH = pathlib.Path("models/") +configs = [] +# for random_seed in [98765]: +for dataset in DATASETS: + filters = { + "state": "finished", + "config.output_folder_path": { + "$in": [ + f"models/{dataset}", + str(MODEL_PATH / dataset), + f"/Users/Kobi/Documents/Research/phd_code/ORDerly/models/{dataset}", + ], + }, + # "config.random_seed": random_seed, + # "config.train_fraction": 1.0, + # Switching back to v3 for the paper + "config.dataset_version": "v3", + # "config.train_mode": 0, # Teacher forcing + } + runs = api.runs(f"{wandb_entity}/{wandb_project}", filters=filters) + # if not len(runs) == 5: # For 5 training fractions + # raise ValueError(f"Not 5 runs for {dataset} (found {len(runs)}, seed {random_seed})") + + for run in runs: + config = dict(run.config) + train_data_path = pathlib.Path( + f"{DATASETS_PATH}/orderly_{dataset}_train.parquet" + ) + test_data_path = pathlib.Path(f"{DATASETS_PATH}/orderly_{dataset}_test.parquet") + fp_directory = train_data_path.parent / "fingerprints" + train_fp_path = fp_directory / (train_data_path.stem + ".npy") + test_fp_path = fp_directory / (test_data_path.stem + ".npy") + output_folder_path = MODEL_PATH / dataset + output_folder_path.mkdir(parents=True, exist_ok=True) + tags = dataset.split("_") + tags = [f"{tags[0]}_{tags[1]}", f"{tags[2]}_{tags[3]}"] + config.update( + { + "train_data_path": train_data_path, + "test_data_path": test_data_path, + "train_fp_path": train_fp_path, + "test_fp_path": test_fp_path, + "output_folder_path": output_folder_path, + "skip_training": True, + "resume": True, + "resume_from_best": True, + "generate_fingerprints": False, + "wandb_run_id": run.id, + "wandb_tags": tags, + } + ) + configs.append(config) + del config["n_val"] + del config["n_test"] + del config["n_train"] + instance = ConditionPrediction(**config) + instance.run_model_arguments() + wandb.finish() + gc.collect()