| #!/bin/bash |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| set -euo pipefail |
| cd ~/alkyline |
|
|
| export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True |
|
|
| |
| |
| |
| PATIENCE=3 |
| DATA=data/processed |
| LABELS=data/label_spaces |
| TRAIN_LOG=train_r8.log |
| CKPT_DIR=checkpoints/r8_5class |
|
|
| |
| |
| |
| echo "===== R8: Deleaked 5-class (focal + cosine + LLRD + O-downsample) =====" |
| echo "Start time: $(date)" |
|
|
| opf train "$DATA/r8_5class_train.jsonl" \ |
| --validation-dataset "$DATA/r8_5class_valid.jsonl" \ |
| --label-space-json "$LABELS/cyner_5class.json" \ |
| --output-dir "$CKPT_DIR" \ |
| --overwrite-output \ |
| --epochs 15 --batch-size 4 --grad-accum-steps 2 \ |
| --learning-rate 5e-5 \ |
| --warmup-fraction 0.1 --lr-schedule cosine \ |
| --loss-fn focal --focal-gamma 2.0 \ |
| --llrd-factor 0.9 \ |
| --o-downsample 0.7 \ |
| --device cuda 2>&1 | tee "$TRAIN_LOG" & |
| TRAIN_PID=$! |
|
|
| |
| bash scripts/early_stop_monitor.sh "$TRAIN_LOG" "$PATIENCE" "$TRAIN_PID" & |
| MONITOR_PID=$! |
|
|
| wait $TRAIN_PID 2>/dev/null || true |
| kill $MONITOR_PID 2>/dev/null || true |
|
|
| echo "Training finished: $(date)" |
|
|
| |
| |
| |
| |
| |
| |
| |
| BEST_EPOCH=$(grep '^epoch' "$TRAIN_LOG" \ |
| | awk -F'[ :/=]' '{for(i=1;i<=NF;i++){if($i=="val_loss")print $(i+1)" "$2}}' \ |
| | sort -n | head -1 | awk '{print $2}') |
| echo "Best epoch by val_loss: $BEST_EPOCH" |
|
|
| CKPT="$CKPT_DIR" |
| if [ ! -f "$CKPT/model.safetensors" ] && [ -n "$BEST_EPOCH" ]; then |
| echo "Training killed early — using epoch $BEST_EPOCH checkpoint" |
| CKPT="${CKPT_DIR}/epoch_${BEST_EPOCH}" |
| elif [ -n "$BEST_EPOCH" ] && [ -d "${CKPT_DIR}/epoch_${BEST_EPOCH}" ]; then |
| |
| echo "Using best-epoch checkpoint (epoch $BEST_EPOCH) over final" |
| CKPT="${CKPT_DIR}/epoch_${BEST_EPOCH}" |
| fi |
| echo "Selected checkpoint: $CKPT" |
|
|
| |
| |
| |
| EVAL_FLAGS="--checkpoint $CKPT --decode-mode viterbi --per-class --label-counts --device cuda" |
|
|
| echo "" |
| echo "================================================================" |
| echo " EVALUATION PHASE" |
| echo "================================================================" |
|
|
| |
| echo "" |
| echo "===== Eval R8: Enriched 5-class test (primary benchmark) =====" |
| opf eval "$DATA/enriched_5class_test.jsonl" \ |
| $EVAL_FLAGS 2>&1 | tee eval_r8_enriched.log |
|
|
| |
| echo "" |
| echo "===== Eval R8: CyNER test (supplementary, ~98% overlap) =====" |
| opf eval "$DATA/cyner_test.jsonl" \ |
| $EVAL_FLAGS 2>&1 | tee eval_r8_cyner.log |
|
|
| |
| echo "" |
| echo "===== Eval R8: SecureBERT2 5-class test (supplementary, ~96% overlap) =====" |
| opf eval "$DATA/securebert2_5class_test.jsonl" \ |
| $EVAL_FLAGS 2>&1 | tee eval_r8_sb2.log |
|
|
| |
| echo "" |
| echo "===== Eval R8: APTNER 5-class test (INDEPENDENT — zero leakage) =====" |
| opf eval "$DATA/aptner_5class_test_clean.jsonl" \ |
| $EVAL_FLAGS 2>&1 | tee eval_r8_aptner.log |
|
|
| |
| |
| |
| |
| echo "" |
| echo "===== Viterbi Grid Search (on validation set) =====" |
| python3 scripts/viterbi_grid_search.py \ |
| --checkpoint "$CKPT" \ |
| --val-data "$DATA/r8_5class_valid.jsonl" \ |
| --output results/viterbi_r8_best.json \ |
| --device cuda 2>&1 | tee viterbi_r8.log |
|
|
| |
| |
| |
| echo "" |
| echo "================================================================" |
| echo " R8 COMPLETE — $(date)" |
| echo "================================================================" |
| echo "Checkpoint: $CKPT" |
| echo "Logs: $TRAIN_LOG, eval_r8_{enriched,cyner,sb2,aptner}.log, viterbi_r8.log" |
| echo "" |
| echo "Key results:" |
| echo "--- Enriched (primary) ---" |
| grep -E '(micro|macro|^ )' eval_r8_enriched.log 2>/dev/null | head -20 || true |
| echo "" |
| echo "--- APTNER (independent) ---" |
| grep -E '(micro|macro|^ )' eval_r8_aptner.log 2>/dev/null | head -20 || true |
| echo "================================================================" |
|
|