stormer-scripts / run_decay_only.sh
KyleBae1017's picture
Add run_decay_only.sh (decay-only from pretrain branch ckpts)
d1a6f35 verified
Raw
History Blame Contribute Delete
6.02 kB
#!/usr/bin/env bash
set -euo pipefail
# ============================================================================
# [Decay-only] ์„ ํƒํ•œ Stage1 branch ์ฒดํฌํฌ์ธํŠธ๋กœ๋ถ€ํ„ฐ *decay(annealing)๋งŒ* ์ˆ˜ํ–‰.
# (run_stage2_3_from_ckpt.sh ์˜ (1) decay ๋‹จ๊ณ„๋งŒ ๋–ผ์–ด๋‚ธ ๊ฒƒ. stage2/3 ๋Š” ํ•˜์ง€ ์•Š์Œ.)
#
# - SETTINGS : run_stage1_sweep.sh ์—์„œ ์“ด ๊ฒƒ๊ณผ ๋™์ผํ•œ (hidden-depth-heads) ์„ธํŠธ.
# - EPOCHS : ๋ชฉํ‘œ stage1 "์ด budget"(decay ํฌํ•จ) epoch ๋“ค. SAVE_EVERY ์˜ ๋ฐฐ์ˆ˜์—ฌ์•ผ
# stage1 ์—์„œ ์ €์žฅ๋œ branch ์ฒดํฌํฌ์ธํŠธ์™€ ์ •ํ™•ํžˆ ๋งž์Šต๋‹ˆ๋‹ค.
#
# ๊ฐ (setting, budget) ์กฐํ•ฉ๋งˆ๋‹ค:
# branch ckpt(= interval_epoch_BRANCH_EP.ckpt) ์˜ ๊ฐ€์ค‘์น˜์—์„œ ์‹œ์ž‘ํ•ด
# LR ์„ DECAY_LR -> DECAY_ETA_MIN ์œผ๋กœ DECAY_EPOCHS ๋งŒํผ decay ํ•ฉ๋‹ˆ๋‹ค.
#
# โ€ป decay ๊ธธ์ด๋Š” *๋น„์œจ ๊ธฐ๋ฐ˜*(stage1 ์˜ branch ์ €์žฅ๊ณผ ๋™์ผ ๊ณต์‹):
# DECAY_EPOCHS(E) = ceil(max(DECAY_RATIO*E, MIN_DECAY_EPOCHS))
# BRANCH_EP(E) = E - DECAY_EPOCHS(E)
# ์ด budget E = BRANCH_EP stable + DECAY_EPOCHS decay (๊ธธ์ด E ๋‹จ์ผ WSD run ๊ณผ ๋“ฑ๊ฐ€).
# โš ๏ธ DECAY_RATIO / MIN_DECAY_EPOCHS ๋Š” run_stage1_sweep.sh ์™€ *๋ฐ˜๋“œ์‹œ ๋™์ผ*ํ•ด์•ผ
# BRANCH_EP ๊ฐ€ stage1 ์ด ์ €์žฅํ•œ branch epoch ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
#
# โ€ป ์ถœ๋ ฅ ๊ฒฝ๋กœ/์ด๋ฆ„์€ run_stage2_3_from_ckpt.sh ์˜ decay ๋‹จ๊ณ„์™€ ๋™์ผํ•˜๊ฒŒ ๋งž์ถฐ์„œ,
# ์›ํ•˜๋ฉด ๋‚˜์ค‘์— ๊ทธ ์Šคํฌ๋ฆฝํŠธ๋กœ stage2/3 ๋งŒ ์ด์–ด์„œ ๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
# (๊ทธ ๊ฒฝ์šฐ decay ๋Š” last.ckpt ์ž๋™ resume ์œผ๋กœ ์ฆ‰์‹œ ํ†ต๊ณผ).
# ============================================================================
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"
# ---- stage1 ๊ณผ ๋™์ผํ•œ (hidden-depth-heads) ์„ธํŠธ ----
SETTINGS=(
"128-24-2"
)
# ---- โญ ๋ชฉํ‘œ stage1 "์ด budget"(decay ํฌํ•จ) epoch ๋“ค (SAVE_EVERY ๋ฐฐ์ˆ˜) ----
EPOCHS=(20 40 80 100)
PATCH_SIZE=4
BATCH_SIZE=1
# ---- decay(annealing) ์„ค์ • ----
# โš ๏ธ DECAY_RATIO / MIN_DECAY_EPOCHS ๋Š” run_stage1_sweep.sh ์™€ ๋™์ผํ•˜๊ฒŒ!
DECAY_RATIO=0.1 # decay ๊ธธ์ด ๋น„์œจ (budget ๋Œ€๋น„)
MIN_DECAY_EPOCHS=1 # decay ์ตœ์†Œ ๊ธธ์ด(epoch)
DECAY_LR=5e-4 # decay ์‹œ์ž‘ LR = stage1 ์˜ stable LR ๊ณผ ๋™์ผํ•˜๊ฒŒ
DECAY_TYPE=sqrt # cosine | linear | sqrt
DECAY_ETA_MIN=1e-8 # decay ๋„์ฐฉ LR
# DECAY_EPOCHS(E) = ceil(max(DECAY_RATIO*E, MIN_DECAY_EPOCHS)) (stage1 branch ๊ณต์‹๊ณผ ๋™์ผ)
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 }'
}
# stage1 branch ์ฒดํฌํฌ์ธํŠธ๋ฅผ epoch(=ํ•™์Šตํ•œ epoch ์ˆ˜, 1-index) ์œผ๋กœ๋ถ€ํ„ฐ ์ฐพ๋Š”๋‹ค
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"
# ์•„ํ‚คํ…์ฒ˜๋Š” stage1 ์ฒดํฌํฌ์ธํŠธ์™€ ๋ฐ˜๋“œ์‹œ ๋™์ผํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ชจ๋“  ํ˜ธ์ถœ์— ๋™์ผํ•˜๊ฒŒ ์ „๋‹ฌ
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
# ์ด budget E ์—์„œ ๋น„์œจ decay ๋ฅผ carve-out: stable ์€ (E - DECAY_EPOCHS) ์—์„œ branch.
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}" # ๋ผ๋ฒจ: stable branch epoch + decay ๊ธธ์ด
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 (annealing) : stage1 ckpt -> lr decay -> eta_min
##########################################################
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"