| #!/bin/bash |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| set -u |
| hostname |
| nvidia-smi -L |
| echo "[$(date)] ARM=${ARM:-unset}" |
|
|
| ARM="${ARM:?set ARM=flat|datacur|latent|latent_bt via --export=ALL,ARM=...}" |
| NAME="w12_${ARM}" |
|
|
| SCRATCH_ROOT=/scratch/users/gatmiry/llm-reasoning-logic-puzzles |
| RUN_DIR=${SCRATCH_ROOT}/sudoku-code/wavecurriculum_run |
| ENV_LOCAL=/tmp/logicpuzzles |
| CAND_DIR=/tmp/sudoku_s12 |
| LOCAL_LOG=/tmp/sudoku_wave_runs/${NAME} |
| TARBALL_GANDALF=/tmp/logicpuzzles_env.tar.gz |
| TARBALL_LOCAL=/tmp/logicpuzzles_env_${SLURM_JOB_ID}.tar.gz |
|
|
| mkdir -p "${RUN_DIR}/logs" "${LOCAL_LOG}" /tmp/sudoku_wave_runs |
|
|
| if ${ENV_LOCAL}/bin/python -u -c "import jax; assert jax.default_backend()=='gpu' or 'cuda' in str(jax.devices()[0]).lower()" 2>/dev/null; then |
| echo "[$(date)] reusing ${ENV_LOCAL}" |
| else |
| echo "[$(date)] fetching env tarball" |
| rm -rf "${ENV_LOCAL}" |
| SCP_OPTS="-o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new" |
| [ -f "${HOME}/.ssh/id_ed25519_berkeley" ] && SCP_OPTS="${SCP_OPTS} -i ${HOME}/.ssh/id_ed25519_berkeley" |
| scp ${SCP_OPTS} "gandalf.berkeley.edu:${TARBALL_GANDALF}" "${TARBALL_LOCAL}" |
| tar xzf "${TARBALL_LOCAL}" -C /tmp |
| rm -f "${TARBALL_LOCAL}" |
| fi |
|
|
| export PY=${ENV_LOCAL}/bin/python |
| export LD_LIBRARY_PATH=\ |
| ${ENV_LOCAL}/lib/python3.9/site-packages/nvidia/cudnn/lib:\ |
| ${ENV_LOCAL}/lib/python3.9/site-packages/nvidia/cublas/lib:\ |
| ${ENV_LOCAL}/lib/python3.9/site-packages/nvidia/cuda_runtime/lib:\ |
| ${ENV_LOCAL}/lib/python3.9/site-packages/nvidia/cuda_nvrtc/lib:\ |
| ${ENV_LOCAL}/lib/python3.9/site-packages/nvidia/nccl/lib:\ |
| ${LD_LIBRARY_PATH:-} |
|
|
| ${PY} -u -c "import jax; print(jax.__version__, jax.devices(), jax.default_backend())" |
|
|
| |
| export SUDOKU_RESUME=0 |
| export SUDOKU_START_STAGE=1 |
| export SUDOKU_MAX_STAGE="${SUDOKU_MAX_STAGE:-12}" |
| |
| |
| |
| |
| export SUDOKU_PLATEAU_STEPS=20000 |
| export SUDOKU_PLATEAU_DELTA=0.005 |
| export SUDOKU_PATIENCE=80000 |
| export SUDOKU_MIN_STAGE_STEPS=8000 |
| export SUDOKU_PROMOTE_ACC=0.90 |
| |
| |
| export SUDOKU_MAX_STEPS="${SUDOKU_MAX_STEPS:-800000}" |
| |
| export SUDOKU_LEVEL_BALANCED=0 |
| export SUDOKU_EVAL_EVERY=2000 |
| export SUDOKU_SAVE_EVERY=10000 |
| export SUDOKU_CKPT_KEEP=3 |
| export SUDOKU_LR=0.0002 |
| export SUDOKU_DROPOUT=0.2 |
| export SUDOKU_WD=0.005 |
| export SUDOKU_TRAIN_PATH="../datasets/train_sudoku_puzzles.npy" |
| export SUDOKU_TEST_PATH="../datasets/test_sudoku_puzzles.npy" |
| export XLA_PYTHON_CLIENT_MEM_FRACTION=0.9 |
|
|
| |
| export SUDOKU_BACKTRACK=0 |
| case "${ARM}" in |
| flat) |
| |
| export SUDOKU_LATENT_SLOTS=0 |
| export SUDOKU_RECURRENT=0 |
| export SUDOKU_AUX_WEIGHT=0.0 |
| export SUDOKU_TRAIN_CAND="" |
| export SUDOKU_TEST_CAND="" |
| ;; |
| datacur) |
| |
| |
| |
| export SUDOKU_LATENT_SLOTS=0 |
| export SUDOKU_RECURRENT=0 |
| export SUDOKU_AUX_WEIGHT=0.0 |
| export SUDOKU_TRAIN_CAND="" |
| export SUDOKU_TEST_CAND="" |
| export SUDOKU_DATA_CURRICULUM=rounds |
| export SUDOKU_TRAIN_META="${CAND_DIR}/train_meta.npy" |
| export SUDOKU_TEST_META="${CAND_DIR}/test_meta.npy" |
| for f in "${SUDOKU_TRAIN_META}" "${SUDOKU_TEST_META}"; do |
| [ -s "${f}" ] || { echo "missing meta ${f}; run sbatch_gen_s12_masks.sh on this node" >&2; exit 1; } |
| done |
| ;; |
| latent|latent_bt) |
| export SUDOKU_LATENT_SLOTS=12 |
| export SUDOKU_RECURRENT=1 |
| export SUDOKU_AUX_WEIGHT=1.0 |
| export SUDOKU_CAND_SLOT_MODE=depth |
| export SUDOKU_PASSES_PER_STAGE=1 |
| export SUDOKU_CAND_DELTA_BG=0.25 |
| export SUDOKU_TRAIN_CAND="${CAND_DIR}/train_cand_masks.npy" |
| export SUDOKU_TEST_CAND="${CAND_DIR}/test_cand_masks.npy" |
| for f in "${SUDOKU_TRAIN_CAND}" "${SUDOKU_TEST_CAND}"; do |
| [ -s "${f}" ] || { echo "missing masks ${f}; run sbatch_gen_s12_masks.sh on this node" >&2; exit 1; } |
| done |
| ;; |
| *) echo "unknown ARM '${ARM}'" >&2; exit 1 ;; |
| esac |
|
|
| if [ "${ARM}" = "latent_bt" ]; then |
| |
| |
| |
| export SUDOKU_BACKTRACK=1 |
| export SUDOKU_BACKTRACK_MODE=adaptive |
| export SUDOKU_BACKTRACK_MARGIN=0.03 |
| export SUDOKU_BACKTRACK_MAX_REPAIR_STEPS=4000 |
| export SUDOKU_BACKTRACK_MIN_FRONTIER_STEPS=8000 |
| export SUDOKU_BACKTRACK_MAX_REPAIR_FRACTION=0.25 |
| export SUDOKU_BACKTRACK_GRAD_DECAY=0.05 |
| export SUDOKU_BACKTRACK_FRONTIER_MIX=1 |
| fi |
|
|
| cd "${RUN_DIR}" |
| |
| ( |
| while true; do sleep 900 |
| rsync -a "${LOCAL_LOG}.log" "${RUN_DIR}/logs/${NAME}.log" 2>/dev/null || true |
| done |
| ) & |
| SYNC_PID=$! |
|
|
| echo "[$(date)] starting ${NAME} from scratch" |
| echo " K=${SUDOKU_LATENT_SLOTS} recurrent=${SUDOKU_RECURRENT} bt=${SUDOKU_BACKTRACK}" |
| echo " max_stage=${SUDOKU_MAX_STAGE} plateau=${SUDOKU_PLATEAU_STEPS} patience=${SUDOKU_PATIENCE}" |
| echo " slot_mode=${SUDOKU_CAND_SLOT_MODE:-n/a} pps=${SUDOKU_PASSES_PER_STAGE:-n/a} delta_bg=${SUDOKU_CAND_DELTA_BG:-n/a}" |
| CUDA_VISIBLE_DEVICES=0 ${PY} -u -m train.main \ |
| --workdir="${LOCAL_LOG}" --exp_name="${NAME}" \ |
| > "${LOCAL_LOG}.log" 2>&1 |
| EC=$? |
| kill ${SYNC_PID} 2>/dev/null || true |
| rsync -a "${LOCAL_LOG}.log" "${RUN_DIR}/logs/${NAME}.log" 2>/dev/null || true |
| echo "[$(date)] ${NAME} exit ${EC}" |
| exit ${EC} |
|
|