Add missing training runs script
This commit is contained in:
130
run_missing_training_runs.sh
Executable file
130
run_missing_training_runs.sh
Executable file
@@ -0,0 +1,130 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Linux bash 5.2+ training-only script.
|
||||||
|
#
|
||||||
|
# Based on the existing runs, the objective/time/death-distribution checks are
|
||||||
|
# already covered. The remaining gap for the current proof chain is the
|
||||||
|
# extra-info ablation under the final candidate model:
|
||||||
|
#
|
||||||
|
# all_future + relative time + mixed death/risk head
|
||||||
|
#
|
||||||
|
# This script only launches those missing training jobs. It intentionally does
|
||||||
|
# not call evaluate_*.py and does not add extra random seeds.
|
||||||
|
|
||||||
|
cd "$(dirname "${BASH_SOURCE[0]}")"
|
||||||
|
|
||||||
|
PYTHON_BIN="${PYTHON_BIN:-python}"
|
||||||
|
DEVICE="${DEVICE:-cuda}"
|
||||||
|
NUM_WORKERS="${NUM_WORKERS:-4}"
|
||||||
|
PROGRESS_INTERVAL="${PROGRESS_INTERVAL:-20}"
|
||||||
|
|
||||||
|
TIME_MODE="relative"
|
||||||
|
DIST_MODE="mixed"
|
||||||
|
SEED="42"
|
||||||
|
VALIDATION_QUERY_SEED="42"
|
||||||
|
|
||||||
|
COMMON_ARGS=(
|
||||||
|
--data_prefix ukb
|
||||||
|
--labels_file labels.csv
|
||||||
|
--seed "${SEED}"
|
||||||
|
--validation_query_seed "${VALIDATION_QUERY_SEED}"
|
||||||
|
--train_eid_file ukb_train_eid.csv
|
||||||
|
--val_eid_file ukb_val_eid.csv
|
||||||
|
--test_eid_file ukb_test_eid.csv
|
||||||
|
--min_history_events 1
|
||||||
|
--min_future_events 1
|
||||||
|
--n_embd 120
|
||||||
|
--n_head 10
|
||||||
|
--n_hist_layer 12
|
||||||
|
--n_tab_layer 4
|
||||||
|
--n_bins 16
|
||||||
|
--extra_pool_reduce mean
|
||||||
|
--dropout 0.0
|
||||||
|
--batch_size 256
|
||||||
|
--base_lr 0.0003
|
||||||
|
--weight_decay 0.1
|
||||||
|
--betas 0.9 0.99
|
||||||
|
--grad_clip 1.0
|
||||||
|
--max_epochs 200
|
||||||
|
--warmup_epochs 10
|
||||||
|
--patience 15
|
||||||
|
--min_lr_ratio 0.1
|
||||||
|
--num_workers "${NUM_WORKERS}"
|
||||||
|
--device "${DEVICE}"
|
||||||
|
--progress_interval "${PROGRESS_INTERVAL}"
|
||||||
|
)
|
||||||
|
|
||||||
|
already_trained() {
|
||||||
|
local extra_file="$1"
|
||||||
|
"${PYTHON_BIN}" - "$TIME_MODE" "$DIST_MODE" "$extra_file" "$SEED" "$VALIDATION_QUERY_SEED" <<'PY'
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
time_mode, dist_mode, extra_file, seed, validation_query_seed = sys.argv[1:6]
|
||||||
|
extra_name = Path(extra_file).name
|
||||||
|
|
||||||
|
for config_path in Path("runs").glob("*/train_config.json"):
|
||||||
|
try:
|
||||||
|
cfg = json.loads(config_path.read_text(encoding="utf-8"))
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
|
||||||
|
observed_query_seed = cfg.get(
|
||||||
|
"all_future_validation_query_seed",
|
||||||
|
cfg.get("validation_query_seed", -1),
|
||||||
|
)
|
||||||
|
|
||||||
|
if (
|
||||||
|
cfg.get("model_target_mode") == "all_future"
|
||||||
|
and cfg.get("time_mode") == time_mode
|
||||||
|
and cfg.get("dist_mode") == dist_mode
|
||||||
|
and Path(str(cfg.get("extra_info_types_file", ""))).name == extra_name
|
||||||
|
and int(cfg.get("seed", -1)) == int(seed)
|
||||||
|
and int(observed_query_seed) == int(validation_query_seed)
|
||||||
|
):
|
||||||
|
print(config_path.parent)
|
||||||
|
raise SystemExit(0)
|
||||||
|
|
||||||
|
raise SystemExit(1)
|
||||||
|
PY
|
||||||
|
}
|
||||||
|
|
||||||
|
train_if_missing() {
|
||||||
|
local label="$1"
|
||||||
|
local extra_file="$2"
|
||||||
|
|
||||||
|
if [[ ! -f "${extra_file}" ]]; then
|
||||||
|
echo "ERROR: missing extra-info type file: ${extra_file}" >&2
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> Checking ${label}: ${TIME_MODE} ${DIST_MODE} all_future with ${extra_file}"
|
||||||
|
if existing_run="$(already_trained "$extra_file")"; then
|
||||||
|
echo " skip: already trained at ${existing_run}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " train: ${label}"
|
||||||
|
"${PYTHON_BIN}" train_all_future.py \
|
||||||
|
"${COMMON_ARGS[@]}" \
|
||||||
|
--time_mode "${TIME_MODE}" \
|
||||||
|
--dist_mode "${DIST_MODE}" \
|
||||||
|
--extra_info_types_file "${extra_file}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Already present in runs/:
|
||||||
|
# - next-token objective checks under SAB, plus older absolute extra ablations
|
||||||
|
# - all-future absolute/relative x exponential/weibull/mixed under SAB
|
||||||
|
#
|
||||||
|
# Still needed:
|
||||||
|
# - final all-future relative+mixed extra-info ablations beyond the existing
|
||||||
|
# SAB baseline. These close the disease-only question without expanding seed
|
||||||
|
# count or running downstream evaluation.
|
||||||
|
train_if_missing "true_disease_only" "extra_info_types_none.txt"
|
||||||
|
train_if_missing "assessment_only_extra" "extra_info_types_assessment_only.txt"
|
||||||
|
train_if_missing "exposure_only_extra" "extra_info_types_exposure_only.txt"
|
||||||
|
train_if_missing "all_extra_info" "extra_info_types_all.txt"
|
||||||
|
|
||||||
|
echo "All requested training-only missing configurations are done."
|
||||||
Reference in New Issue
Block a user