#!/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}" METRICS_PYTHON_BIN="${METRICS_PYTHON_BIN:-/mnt/s3files/s3-us-west2-default/zoubin/cz/envs/vbench_eval/bin/python}" VBENCH_ROOT="${VBENCH_ROOT:-/mnt/s3files/s3-us-west2-default/zoubin/cz/projects/VBench}" GPU_IDS="${GPU_IDS:-0,1,2,3,4,5,6,7}" EXPERIMENT_NAME="${EXPERIMENT_NAME:?EXPERIMENT_NAME is required}" FULL_CHECKPOINT="${FULL_CHECKPOINT:?FULL_CHECKPOINT is required}" PREDICTOR_CHECKPOINT="${PREDICTOR_CHECKPOINT:-}" INCLUDE_FFFF="${INCLUDE_FFFF:-0}" PROMPT_FILE="${PROMPT_FILE:-$ROOT_DIR/prompts/MovieGenVideoBench_extended_101_200.txt}" NVME_ROOT="${NVME_ROOT:-/mnt/local_nvme/zoubin/cz/self_forcing_predictor_v4_dmd_validation}" PROJECT_VIDEO_ROOT="${PROJECT_VIDEO_ROOT:-$ROOT_DIR/videos}" RESULT_ROOT="${RESULT_ROOT:-$ROOT_DIR/evaluation_results/predictor_v4_dmd}" REFERENCE_FFFF="${REFERENCE_FFFF:-}" cd "$ROOT_DIR" IFS=',' read -r -a GPU_ARRAY <<< "$GPU_IDS" NPROC_PER_NODE="${#GPU_ARRAY[@]}" mkdir -p "$NVME_ROOT" "$PROJECT_VIDEO_ROOT" "$RESULT_ROOT" for required in "$PYTHON_BIN" "$METRICS_PYTHON_BIN" "$FULL_CHECKPOINT" "$PROMPT_FILE"; do if [[ ! -e "$required" ]]; then echo "错误:找不到 $required" >&2 exit 1 fi done if [[ -n "$PREDICTOR_CHECKPOINT" && ! -f "$PREDICTOR_CHECKPOINT" ]]; then echo "错误:找不到 $PREDICTOR_CHECKPOINT" >&2 exit 1 fi variants=(fppf fppp) if [[ "$INCLUDE_FFFF" == "1" ]]; then variants=(ffff fppf fppp) fi video_dir() { echo "$NVME_ROOT/${EXPERIMENT_NAME}_$1_seed0" } run_inference() { local variant="$1" local output output="$(video_dir "$variant")" if "$PYTHON_BIN" scripts/validate_generated_videos.py "$output" \ >/dev/null 2>&1; then echo "[$(date -u +%FT%TZ)] 跳过已完成的 $variant 推理。" return fi echo "[$(date -u +%FT%TZ)] 启动 $EXPERIMENT_NAME $variant 验证集推理。" if [[ "$variant" == "ffff" ]]; then GPU_IDS="$GPU_IDS" \ CHECKPOINT_PATH="$FULL_CHECKPOINT" \ DATA_PATH="$PROMPT_FILE" \ OUTPUT_FOLDER="$output" \ bash scripts/run_moviegen_first100_dmd.sh else GPU_IDS="$GPU_IDS" \ CHECKPOINT_PATH="$FULL_CHECKPOINT" \ PREDICTOR_CHECKPOINT="$PREDICTOR_CHECKPOINT" \ PREDICTOR_SCHEDULE="$variant" \ DATA_PATH="$PROMPT_FILE" \ OUTPUT_FOLDER="$output" \ bash scripts/run_moviegen_first100_dmd.sh fi "$PYTHON_BIN" scripts/validate_generated_videos.py "$output" local project_output="$PROJECT_VIDEO_ROOT/${EXPERIMENT_NAME}_${variant}_seed0" mkdir -p "$project_output" rsync -a "$output/" "$project_output/" } run_vbench() { local variant="$1" local output_dir="$VBENCH_ROOT/evaluation_results/${EXPERIMENT_NAME}_${variant}_moviegen_101_200_seed0" if find "$output_dir" -maxdepth 1 -type f -name '*_eval_results.json' \ -print -quit 2>/dev/null | grep -q .; then echo "[$(date -u +%FT%TZ)] 跳过已有的 $variant VBench。" return fi VIDEO_DIR="$(video_dir "$variant")" \ OUTPUT_DIR="$output_dir" \ GPU_IDS="$GPU_IDS" \ bash scripts/run_vbench_custom_6_metrics.sh } for variant in "${variants[@]}"; do run_inference "$variant" run_vbench "$variant" done if [[ "$INCLUDE_FFFF" == "1" ]]; then pair_reference="$(video_dir ffff)" else pair_reference="$REFERENCE_FFFF" fi if [[ -n "$pair_reference" ]]; then for variant in fppf fppp; do CUDA_VISIBLE_DEVICES="$GPU_IDS" \ "$METRICS_PYTHON_BIN" -m torch.distributed.run \ --standalone \ --nproc_per_node="$NPROC_PER_NODE" \ scripts/compare_video_metrics.py \ --reference_dir "$pair_reference" \ --comparison_dir "$(video_dir "$variant")" \ --output_json "$RESULT_ROOT/${EXPERIMENT_NAME}_ffff_vs_${variant}.json" done fi touch "$RESULT_ROOT/${EXPERIMENT_NAME}.complete" echo "[$(date -u +%FT%TZ)] $EXPERIMENT_NAME 验证集评估完成。"