#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" PYTHON_BIN="${PYTHON_BIN:-/mnt/s3files/s3-us-west2-default/zoubin/cz/envs/self_forcing/bin/python}" CONFIG_PATH="${CONFIG_PATH:?CONFIG_PATH is required}" OUTPUT_DIR="${OUTPUT_DIR:?OUTPUT_DIR is required}" GPU_IDS="${GPU_IDS:-0,1,2,3,4,5,6,7}" MASTER_PORT="${MASTER_PORT:-29741}" USE_SWANLAB="${USE_SWANLAB:-true}" MAX_STUDENT_STEPS="${MAX_STUDENT_STEPS:-}" FORCED_EXIT_STEP="${FORCED_EXIT_STEP:-}" cd "$ROOT_DIR" IFS=',' read -r -a GPU_ARRAY <<< "$GPU_IDS" NPROC_PER_NODE="${#GPU_ARRAY[@]}" if (( NPROC_PER_NODE != 8 )); then echo "错误:正式 Predictor-v4 DMD 训练需要 8 张 GPU,当前为 $NPROC_PER_NODE。" >&2 exit 1 fi for required in "$PYTHON_BIN" "$CONFIG_PATH"; do if [[ ! -e "$required" ]]; then echo "错误:找不到 $required" >&2 exit 1 fi done mkdir -p "$OUTPUT_DIR" TRAIN_TMPDIR="${TRAIN_TMPDIR:-/mnt/local_nvme/zoubin/cz/tmp/predictor_v4_dmd}" mkdir -p "$TRAIN_TMPDIR" overrides=( --config_override "predictor_v4_dmd.output_dir=${OUTPUT_DIR}" --config_override "predictor_v4_dmd.use_swanlab=${USE_SWANLAB}" ) if [[ -n "$MAX_STUDENT_STEPS" ]]; then overrides+=( --config_override "predictor_v4_dmd.max_student_steps=${MAX_STUDENT_STEPS}" ) fi if [[ -n "$FORCED_EXIT_STEP" ]]; then overrides+=( --config_override "predictor_v4_dmd.forced_exit_step=${FORCED_EXIT_STEP}" ) fi echo "[$(date -u +%FT%TZ)] 启动 Predictor-v4 Wan14B DMD:$CONFIG_PATH" echo "[$(date -u +%FT%TZ)] 输出目录:$OUTPUT_DIR" TMPDIR="$TRAIN_TMPDIR" \ CUDA_VISIBLE_DEVICES="$GPU_IDS" \ "$PYTHON_BIN" -m torch.distributed.run \ --standalone \ --nproc_per_node="$NPROC_PER_NODE" \ --master_port="$MASTER_PORT" \ train.py \ --config_path "$CONFIG_PATH" \ --no_visualize \ --disable-wandb \ "${overrides[@]}" \ 2>&1 | tee -a "$OUTPUT_DIR/launcher.log"