| set -euo pipefail | |
| ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" | |
| DATASET_ROOT="/mnt/local_nvme/zoubin/cz/self_forcing_predictor_v4_1000_seed0" | |
| NVME_TRAIN_ROOT="/mnt/local_nvme/zoubin/cz/self_forcing_predictor_v4_training_1000_seed0" | |
| RUN_DIR="$ROOT_DIR/checkpoints/predictor_v4_1000_seed0" | |
| cd "$ROOT_DIR" | |
| mkdir -p "$NVME_TRAIN_ROOT" "$RUN_DIR" | |
| exec 9>"$RUN_DIR/training_and_sync.lock" | |
| if ! flock -n 9; then | |
| echo "错误:已有 Predictor-v4 training/sync 任务正在运行。" >&2 | |
| exit 1 | |
| fi | |
| echo "$$" >"$RUN_DIR/training_and_sync.pid" | |
| trap 'rm -f "$RUN_DIR/training_and_sync.pid"' EXIT | |
| if [[ "$(wc -l < "$DATASET_ROOT/manifest.jsonl")" -ne 7000 ]]; then | |
| echo "错误:manifest.jsonl 不完整。" >&2 | |
| exit 1 | |
| fi | |
| if [[ "$(wc -l < "$DATASET_ROOT/train_manifest.jsonl")" -ne 6000 ]]; then | |
| echo "错误:train_manifest.jsonl 不完整。" >&2 | |
| exit 1 | |
| fi | |
| echo "[$(date -u +%FT%TZ)] 从完整 NVMe 数据启动 8 GPU Predictor-v4 训练。" | |
| NPROC_PER_NODE=8 \ | |
| LOG_DIR="$NVME_TRAIN_ROOT" \ | |
| bash scripts/run_predictor_v4_training.sh | |
| echo "[$(date -u +%FT%TZ)] 训练完成,开始同步 NVMe 数据和 checkpoint。" | |
| DATASET_SOURCE="$DATASET_ROOT" \ | |
| TRAIN_SOURCE="$NVME_TRAIN_ROOT" \ | |
| bash scripts/sync_predictor_v4_artifacts.sh | |
| echo "[$(date -u +%FT%TZ)] 训练与同步全部完成。" | |