#!/usr/bin/env bash
# Chapter 6 spam-classification fine-tuning of GPT-2 124M; metrics are parsed from the script's output.
set -o pipefail
cd ch06/01_main-chapter-code || exit 1
echo "KVERITAS_PHASE name=finetune"
python -u gpt_class_finetune.py 2>&1 | tee ../../../finetune.out | while IFS= read -r line; do
  if [[ $line =~ Step\ 0*([0-9]+)\)\:\ Train\ loss\ ([0-9.]+),\ Val\ loss\ ([0-9.]+) ]]; then
    echo "KVERITAS_METRIC name=train_loss value=${BASH_REMATCH[2]} step=${BASH_REMATCH[1]}"
    echo "KVERITAS_METRIC name=val_loss value=${BASH_REMATCH[3]} step=${BASH_REMATCH[1]}"
  elif [[ $line =~ Training\ accuracy:\ ([0-9.]+)%.*Validation\ accuracy:\ ([0-9.]+)% ]]; then
    epoch=$((${epoch:-0} + 1))
    echo "KVERITAS_METRIC name=train_accuracy value=${BASH_REMATCH[1]} step=$epoch"
    echo "KVERITAS_METRIC name=val_accuracy value=${BASH_REMATCH[2]} step=$epoch"
  fi
done
out=../../../finetune.out
acc=$(grep -oP 'Training accuracy: \K[0-9.]+(?=%)' $out | tail -1)
val=$(grep -oP 'Validation accuracy: \K[0-9.]+(?=%)' $out | tail -1)
mins=$(grep -oP 'Training completed in \K[0-9.]+' $out)
echo "KVERITAS_METRIC name=training_minutes value=$mins"
echo "KVERITAS_CLAIM metric=final_train_accuracy value=$acc"
echo "KVERITAS_CLAIM metric=final_val_accuracy value=$val"
