#!/usr/bin/env bash # Paper-aligned MATH arithmetic-GRPO baseline for Qwen3-4B-Instruct. # Source: https://arxiv.org/pdf/2601.20614, Section F.1 / Table 9. # Note: the local MATH parquet already places the reasoning instruction in the # user message, so this script matches the paper's training hyperparameters but # does not rewrite the dataset into a separate system prompt format. set -euo pipefail set -x export CUDA_VISIBLE_DEVICES="${CUDA_VISIBLE_DEVICES:-4,5,6,7}" export WANDB_API_KEY="${WANDB_API_KEY:-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}" export WANDB_PROJECT="${WANDB_PROJECT:-verl_qwen3_4b_instruct_grpo_math_paper}" export HYDRA_FULL_ERROR=1 export PYTHONUNBUFFERED=1 export HF_HOME="${HF_HOME:-/mnt/data/hf_home}" export HUGGINGFACE_HUB_CACHE="${HUGGINGFACE_HUB_CACHE:-$HF_HOME/hub}" export FLASHINFER_WORKSPACE_BASE="${FLASHINFER_WORKSPACE_BASE:-/mnt/data/safetyCode/flashinfer}" export TRAIN_ATTN_IMPLEMENTATION="${TRAIN_ATTN_IMPLEMENTATION:-sdpa}" unset TRANSFORMERS_CACHE || true ulimit -n 65535 PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ -n "${PYTHON_BIN:-}" ]; then PYTHON_BIN="$PYTHON_BIN" elif [ -x "/home/clouduser/miniconda/envs/verl-qwen3/bin/python" ]; then PYTHON_BIN="/home/clouduser/miniconda/envs/verl-qwen3/bin/python" else PYTHON_BIN="$(command -v python3)" fi export VERL_RAY_PY_EXECUTABLE="$PYTHON_BIN" export PYTHONPATH="$PROJECT_DIR${PYTHONPATH:+:$PYTHONPATH}" export PYTHONPATH="$PROJECT_DIR/vendor${PYTHONPATH:+:$PYTHONPATH}" MODEL_PATH="${MODEL_PATH:-/mnt/data/safetyCode/model_hub/Qwen/Qwen3-4B-Instruct-2507}" DATA_ROOT="${DATA_ROOT:-$PROJECT_DIR/data}" MATH_DIR="${MATH_DIR:-$DATA_ROOT/math}" MATH_TRAIN="${MATH_TRAIN:-$MATH_DIR/train.parquet}" MATH_TEST="${MATH_TEST:-$MATH_DIR/test.parquet}" RUN_TAG="${RUN_TAG:-qwen3_4b_instruct_grpo_math_paper_4gpu_arithmetic_clip_ratio_high_0.24_QAE_adv}" CHECKPOINT_DIR="${CHECKPOINT_DIR:-$PROJECT_DIR/checkpoints/$RUN_TAG}" RAY_TMP_DIR="${RAY_TMP_DIR:-/mnt/data/ray_tmp}" RAY_SPILL_DIR="${RAY_SPILL_DIR:-$RAY_TMP_DIR/object_spill}" ROLLOUT_N="${ROLLOUT_N:-8}" ARITHMETIC_GROUP_SIZE="${ARITHMETIC_GROUP_SIZE:-$ROLLOUT_N}" ARITHMETIC_SEED="${ARITHMETIC_SEED:-9}" TRAIN_FILES="['$MATH_TRAIN']" VAL_FILES="['$MATH_TEST']" mkdir -p "$CHECKPOINT_DIR" mkdir -p "$RAY_TMP_DIR" "$RAY_SPILL_DIR" mkdir -p "$HF_HOME" "$HUGGINGFACE_HUB_CACHE" "$FLASHINFER_WORKSPACE_BASE" "$PYTHON_BIN" - <<'PY' from packaging.version import Version import sys import numpy import transformers errors = [] if Version(transformers.__version__) < Version("4.55.2") or Version(transformers.__version__) >= Version("5.0.0"): errors.append( f"transformers=={transformers.__version__} is incompatible with this verl+vLLM setup. " "Install a 4.x release, for example: pip install --upgrade --force-reinstall " "'transformers[hf_xet]>=4.55.2,<5.0.0'" ) if Version(numpy.__version__) >= Version("2.0.0"): print( f"numpy=={numpy.__version__} is incompatible with this verl checkout. " "Continuing anyway because this environment previously ran this training setup. " "If you later hit NumPy-related runtime errors, install: " "pip install --upgrade --force-reinstall 'numpy<2.0.0'", file=sys.stderr, ) if errors: raise SystemExit("\n".join(errors)) PY missing=0 for required_path in "$MODEL_PATH" "$MATH_TRAIN" "$MATH_TEST"; do if [ ! -e "$required_path" ]; then echo "Missing required path: $required_path" >&2 missing=1 fi done if [ "$missing" -ne 0 ]; then cat >&2 <