| #!/usr/bin/env bash |
| set -euo pipefail |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| CMD="python train.py" |
| CFG_DECAY="/workspace/stormer/configs/decay_finetune.yaml" |
| DATA_ROOT="/workspace/stormer/wb2_h5df" |
|
|
| S1_RESULTS_ROOT="/workspace/stormer/results/pretrain" |
| DECAY_RESULTS_ROOT="/workspace/stormer/results/decay" |
|
|
| |
| SETTINGS=( |
| "128-24-2" |
| ) |
|
|
| |
| EPOCHS=(20 40 80 100) |
|
|
| PATCH_SIZE=4 |
| BATCH_SIZE=1 |
|
|
| |
| |
| DECAY_RATIO=0.1 |
| MIN_DECAY_EPOCHS=1 |
| DECAY_LR=5e-4 |
| DECAY_TYPE=sqrt |
| DECAY_ETA_MIN=1e-8 |
|
|
| |
| decay_len () { |
| awk -v e="$1" -v r="${DECAY_RATIO}" -v mn="${MIN_DECAY_EPOCHS}" \ |
| 'BEGIN{ d=r*e; if(d<mn) d=mn; c=int(d); if(c < d-1e-9) c++; print c }' |
| } |
|
|
| |
| resolve_s1_ckpt () { |
| local ckpt_dir="$1"; local epoch="$2" |
| local c="${ckpt_dir}/interval_epoch_$(printf '%03d' "${epoch}").ckpt" |
| if [ -f "${c}" ]; then echo "${c}"; return 0; fi |
| { |
| echo "ERROR: stage1 branch epoch '${epoch}' ์ฒดํฌํฌ์ธํธ๋ฅผ ${ckpt_dir} ์์ ๋ชป ์ฐพ์." |
| echo " (DECAY_RATIO/MIN_DECAY_EPOCHS ๊ฐ run_stage1_sweep.sh ์ ๊ฐ์์ง, EPOCHS ๊ฐ SAVE_EVERY ๋ฐฐ์์ธ์ง ํ์ธ)" |
| echo "์ฌ์ฉ ๊ฐ๋ฅํ branch ์ฒดํฌํฌ์ธํธ:" |
| ls -1 "${ckpt_dir}"/interval_epoch_*.ckpt 2>/dev/null || echo " (์์ - stage1 ์ ๋จผ์ ๋๋ ธ๋์ง ํ์ธ)" |
| } >&2 |
| return 1 |
| } |
|
|
| for setting in "${SETTINGS[@]}"; do |
| IFS="-" read -r h d nh <<< "${setting}" |
| RUN_ID="h${h}_d${d}_n${nh}" |
| S1_NAME="pretrain_one_step_${RUN_ID}" |
| S1_CKPT_DIR="${S1_RESULTS_ROOT}/${RUN_ID}/${S1_NAME}/checkpoints" |
|
|
| |
| ARCH_ARGS=( |
| --model.net.init_args.hidden_size "${h}" |
| --model.net.init_args.depth "${d}" |
| --model.net.init_args.num_heads "${nh}" |
| --model.net.patch_size "${PATCH_SIZE}" |
| ) |
|
|
| for EP in "${EPOCHS[@]}"; do |
| |
| DECAY_EPOCHS="$(decay_len "${EP}")" |
| BRANCH_EP=$((EP - DECAY_EPOCHS)) |
| if [ "${BRANCH_EP}" -le 0 ]; then |
| echo "SKIP: EP=${EP} <= DECAY_EPOCHS=${DECAY_EPOCHS} ๋ผ branch ์ง์ (${BRANCH_EP})์ด ์ ํจํ์ง ์์." >&2 |
| continue |
| fi |
|
|
| TAG="${RUN_ID}_ep${BRANCH_EP}_d${DECAY_EPOCHS}" |
| echo "############################################################" |
| echo "# ${TAG} : decay only" |
| echo "# ๋ชฉํ ์ด budget=${EP}ep = stable@${BRANCH_EP}ep + decay ${DECAY_EPOCHS}ep" |
| echo "# decay: ${DECAY_TYPE}, lr ${DECAY_LR} -> ${DECAY_ETA_MIN}" |
| echo "############################################################" |
|
|
| S1_CKPT="$(resolve_s1_ckpt "${S1_CKPT_DIR}" "${BRANCH_EP}")" || exit 1 |
| echo " [ckpt] stage1 branch @ ${BRANCH_EP}ep : ${S1_CKPT}" |
|
|
| |
| |
| |
| DECAY_NAME="decay_${TAG}" |
| DECAY_ROOT="${DECAY_RESULTS_ROOT}/${DECAY_NAME}" |
| echo " --- DECAY (${DECAY_EPOCHS} ep, ${DECAY_TYPE}, lr ${DECAY_LR} -> ${DECAY_ETA_MIN}) ---" |
| ${CMD} \ |
| --config "${CFG_DECAY}" \ |
| --trainer.max_epochs "${DECAY_EPOCHS}" \ |
| --trainer.default_root_dir "${DECAY_ROOT}" \ |
| --trainer.logger.init_args.name "${DECAY_NAME}" \ |
| --model.max_epochs "${DECAY_EPOCHS}" \ |
| --model.lr "${DECAY_LR}" \ |
| --model.eta_min "${DECAY_ETA_MIN}" \ |
| --model.decay_type "${DECAY_TYPE}" \ |
| --model.pretrained_path "${S1_CKPT}" \ |
| "${ARCH_ARGS[@]}" \ |
| --data.root_dir "${DATA_ROOT}" \ |
| --data.steps 1 \ |
| --data.batch_size "${BATCH_SIZE}" |
| DECAY_CKPT="${DECAY_ROOT}/${DECAY_NAME}/checkpoints/last.ckpt" |
| echo " [done] ${TAG}: decayed ckpt -> ${DECAY_CKPT}" |
| done |
| done |
|
|
| echo "ALL DECAY-ONLY RUNS DONE" |
|
|