Video-ORA-4B / code /eval /task /eval.sh
lyhisme's picture
Add 4B model card, benchmark assets, and release code
0185029 verified
Raw
History Blame Contribute Delete
46.2 kB
#!/bin/bash
# Thin shell entry for evaluation.
#
# Supported TASKS: videomme,videommev2,videommmu,mmvu,mvbench,videoholmes,longvideobench,lvbench,mlvu,vsi,mmsi,mindcube,revsi,spatial_grounding,tracking,stvg,temporal_grounding,segmentation,all
# Common env overrides:
# MODEL_PATH=/path/to/model_or_verl_actor
# TASKS=videomme,videommev2,vsi
# GPUS=0,1,2,3,4,5,6,7
# TP_SIZE=1
# Prefer explicit CLI args for new runs, which avoids stale env variables:
# bash eval/task/eval.sh --model /path/to/model --tasks videomme,videommev2,mvbench --gpus 0,1,2,3,4,5,6,7 --force-merge
#
# MODEL must be provided explicitly with --model.
# # —— Video QA / MC ——
# bash eval/task/eval.sh --model $MODEL --tasks mvbench --gpus $GPUS --force-merge
# bash eval/task/eval.sh --model $MODEL --tasks mmvu --gpus $GPUS --force-merge
# bash eval/task/eval.sh --model $MODEL --tasks videomme --gpus $GPUS --force-merge
# bash eval/task/eval.sh --model $MODEL --tasks videoholmes --gpus $GPUS --force-merge
# bash eval/task/eval.sh --model $MODEL --tasks longvideobench --gpus $GPUS --force-merge
# bash eval/task/eval.sh --model $MODEL --tasks mlvu --gpus $GPUS --force-merge
# # —— Spatial intelligence (MC) ——
# bash eval/task/eval.sh --model $MODEL --tasks vsi --gpus $GPUS --force-merge
# bash eval/task/eval.sh --model $MODEL --tasks mmsi --gpus $GPUS --force-merge
# bash eval/task/eval.sh --model $MODEL --tasks mindcube --gpus $GPUS --force-merge
# bash eval/task/eval.sh --model $MODEL --tasks revsi --gpus $GPUS --force-merge
# # —— Grounding / tracking / stvg / temporal ——
# bash eval/task/eval.sh --model $MODEL --tasks spatial_grounding --gpus $GPUS --force-merge
# bash eval/task/eval.sh --model $MODEL --tasks tracking --gpus $GPUS --force-merge
# bash eval/task/eval.sh --model $MODEL --tasks stvg --gpus $GPUS --force-merge
# charades(默认)
# TIMELENS_DATASETS=charades-timelens TIMELENS_FPS=4 bash eval/task/eval.sh --model $MODEL --tasks temporal_grounding --gpus $GPUS --force-merge
# TIMELENS_DATASETS=activitynet-timelens TIMELENS_FPS=2 bash eval/task/eval.sh --model $MODEL --tasks temporal_grounding --gpus $GPUS --force-merge
# TIMELENS_DATASETS=qvhighlights-timelens TIMELENS_FPS=2 bash eval/task/eval.sh --model $MODEL --tasks temporal_grounding --gpus $GPUS --force-merge
# # —— Segmentation(需要 SAM2 + OraRL 评测环境)——
# EVAL_CONDA_ENV=orarl SEGMENTATION_RUN_SAM2=true \
# bash eval/task/eval.sh --model $MODEL --tasks segmentation --gpus $GPUS --force-merge
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
DEFAULT_GPUS="0,1,2,3,4,5,6,7"
usage() {
cat <<'EOF'
Usage:
bash eval/task/eval.sh [options]
Options:
--model PATH Model or checkpoint path.
--tasks LIST Comma-separated task list, e.g. videomme,videommev2,mvbench,mlvu.
--gpus LIST Comma-separated GPU ids, e.g. 0,1,2,3,4,5,6,7.
--tp-size N Tensor parallel size.
--shard-mode MODE Sharding mode passed to vLLM task runner.
--video-cache-size N Video cache size.
--videomme-max-new-tokens N
Max new tokens for VideoMME generation.
--force-merge Force merging FSDP actor checkpoints.
--skip-merge Reuse existing merged HF model for actor checkpoints.
--merged-model PATH Explicit merged HF output/input path for actor checkpoints.
--base-model PATH Base model path used when merging actor checkpoints.
--env NAME Conda env to activate. Default: keep current env.
--segmentation-run-sam2
Enable SAM2 post-processing for segmentation.
--help Show this help.
Core launch settings intentionally ignore inherited environment variables to
avoid stale MODEL_PATH/TASKS/GPUS/etc. Use explicit CLI options instead.
EOF
}
# Avoid stale shell environment contaminating evaluation identity. Task-specific
# tuning envs below are still supported, but core launch identity is CLI/defaults.
unset MODEL_PATH TASKS GPUS TP_SIZE SHARD_MODE VIDEO_CACHE_SIZE
unset FORCE_MERGE SKIP_MERGE MERGED_MODEL_PATH BASE_MODEL_PATH EVAL_CONDA_ENV
while (($# > 0)); do
case "$1" in
--model|--model-path)
[[ $# -ge 2 ]] || { echo "ERROR: $1 requires a value" >&2; exit 1; }
MODEL_PATH="$2"
shift 2
;;
--tasks)
[[ $# -ge 2 ]] || { echo "ERROR: $1 requires a value" >&2; exit 1; }
TASKS="$2"
shift 2
;;
--gpus)
if [[ $# -ge 2 && "$2" != --* ]]; then
GPUS="$2"
shift 2
else
GPUS="$DEFAULT_GPUS"
shift
fi
;;
--tp-size)
[[ $# -ge 2 ]] || { echo "ERROR: $1 requires a value" >&2; exit 1; }
TP_SIZE="$2"
shift 2
;;
--shard-mode)
[[ $# -ge 2 ]] || { echo "ERROR: $1 requires a value" >&2; exit 1; }
SHARD_MODE="$2"
shift 2
;;
--video-cache-size)
[[ $# -ge 2 ]] || { echo "ERROR: $1 requires a value" >&2; exit 1; }
VIDEO_CACHE_SIZE="$2"
shift 2
;;
--videomme-max-new-tokens)
[[ $# -ge 2 ]] || { echo "ERROR: $1 requires a value" >&2; exit 1; }
VIDEOMME_MAX_NEW_TOKENS="$2"
shift 2
;;
--force-merge)
FORCE_MERGE=1
shift
;;
--skip-merge)
SKIP_MERGE=1
shift
;;
--merged-model|--merged-model-path)
[[ $# -ge 2 ]] || { echo "ERROR: $1 requires a value" >&2; exit 1; }
MERGED_MODEL_PATH="$2"
shift 2
;;
--base-model|--base-model-path)
[[ $# -ge 2 ]] || { echo "ERROR: $1 requires a value" >&2; exit 1; }
BASE_MODEL_PATH="$2"
shift 2
;;
--env|--conda-env)
[[ $# -ge 2 ]] || { echo "ERROR: $1 requires a value" >&2; exit 1; }
EVAL_CONDA_ENV="$2"
shift 2
;;
--segmentation-run-sam2)
SEGMENTATION_RUN_SAM2=true
shift
;;
--help|-h)
usage
exit 0
;;
--)
shift
break
;;
*)
echo "ERROR: unknown option '$1'" >&2
usage >&2
exit 1
;;
esac
done
# Require an explicit model so stale machine-local defaults cannot contaminate
# benchmark results.
if [[ -z "${MODEL_PATH:-}" ]]; then
echo "ERROR: --model PATH is required." >&2
usage >&2
exit 2
fi
MODEL_PATH="$(printf '%s' "$MODEL_PATH" | xargs)"
# Common launch defaults.
: "${TASKS:=all}"
: "${GPUS:=$DEFAULT_GPUS}"
: "${TP_SIZE:=1}"
: "${SHARD_MODE:=contiguous}"
: "${VIDEO_CACHE_SIZE:=2}"
: "${PREFETCH_BATCHES:=1}"
: "${FORCE_MERGE:=0}"
: "${SKIP_MERGE:=0}"
: "${MERGE_LOG_DIR:=${PROJECT_DIR}/logs/qwen3.5/eval/merge}"
if [[ ! "$GPUS" =~ ^[0-9]+(,[0-9]+)*$ ]]; then
echo "ERROR: --gpus must be a comma-separated list of GPU ids, got '${GPUS}'" >&2
exit 1
fi
# VideoMME defaults.
: "${VIDEOMME_VIDEO_BASE:=${PROJECT_DIR}/data/eval/videomme}"
: "${VIDEOMME_VIDEO_DIR:=${VIDEOMME_VIDEO_BASE}/videos}"
: "${VIDEOMME_VIDEO_MIN_PIXELS:=4096}"
: "${VIDEOMME_VIDEO_MAX_PIXELS:=262144}"
: "${VIDEOMME_VIDEO_TOTAL_PIXELS:=0}"
: "${VIDEOMME_MAX_FRAMES:=384}"
: "${VIDEOMME_FPS:=2}"
: "${VIDEOMME_SETTING:=all-qwen3_vl-sub0-f${VIDEOMME_MAX_FRAMES}-fps${VIDEOMME_FPS}-min${VIDEOMME_VIDEO_MIN_PIXELS}-max${VIDEOMME_VIDEO_MAX_PIXELS}-total${VIDEOMME_VIDEO_TOTAL_PIXELS}-videomme_preprocessed_384f_262k_total0}"
: "${VIDEOMME_DATA_FILE:=${PROJECT_DIR}/eval/data/valid_data/videomme_preprocessed_384f_262k_total0.jsonl}"
: "${VIDEOMME_PREPROCESSED_VIDEO_DIR:=${VIDEOMME_VIDEO_BASE}/preprocessed_videos_384f_262k_total0}"
: "${VIDEOMME_BATCH_SIZE:=1}"
: "${VIDEOMME_MAX_MODEL_LEN:=65536}"
: "${VIDEOMME_MAX_NEW_TOKENS:=128}"
: "${VIDEOMME_MAX_NUM_BATCHED_TOKENS:=65536}"
: "${VIDEOMME_GPU_MEMORY_UTILIZATION:=0.90}"
: "${VIDEOMME_MAX_SAMPLES:=0}"
# VideoMME-V2 defaults. Uses the same local schema and evaluator as VideoMME.
: "${VIDEOMMEV2_VIDEO_BASE:=${PROJECT_DIR}/data/eval/videommev2}"
: "${VIDEOMMEV2_VIDEO_DIR:=${VIDEOMMEV2_VIDEO_BASE}/videos}"
: "${VIDEOMMEV2_VIDEO_MIN_PIXELS:=4096}"
: "${VIDEOMMEV2_VIDEO_MAX_PIXELS:=262144}"
: "${VIDEOMMEV2_VIDEO_TOTAL_PIXELS:=0}"
: "${VIDEOMMEV2_MAX_FRAMES:=384}"
: "${VIDEOMMEV2_FPS:=2}"
: "${VIDEOMMEV2_SETTING:=all-qwen3_vl-sub0-f${VIDEOMMEV2_MAX_FRAMES}-fps${VIDEOMMEV2_FPS}-min${VIDEOMMEV2_VIDEO_MIN_PIXELS}-max${VIDEOMMEV2_VIDEO_MAX_PIXELS}-total${VIDEOMMEV2_VIDEO_TOTAL_PIXELS}-videommev2_preprocessed_384f_262k_total0}"
: "${VIDEOMMEV2_DATA_FILE:=${PROJECT_DIR}/eval/data/valid_data/videommev2_preprocessed_384f_262k_total0.jsonl}"
: "${VIDEOMMEV2_PREPROCESSED_VIDEO_DIR:=${VIDEOMMEV2_VIDEO_BASE}/preprocessed_videos_384f_262k_total0}"
: "${VIDEOMMEV2_BATCH_SIZE:=1}"
: "${VIDEOMMEV2_MAX_MODEL_LEN:=65536}"
: "${VIDEOMMEV2_MAX_NEW_TOKENS:=128}"
: "${VIDEOMMEV2_MAX_NUM_BATCHED_TOKENS:=65536}"
: "${VIDEOMMEV2_GPU_MEMORY_UTILIZATION:=0.90}"
: "${VIDEOMMEV2_PROMPT_MODE:=default}"
: "${VIDEOMMEV2_ANSWER_FILTER:=}"
: "${VIDEOMMEV2_MAX_SAMPLES:=0}"
# VideoMMMU defaults.
: "${VIDEOMMMU_SETTING:=videommmu-f128-fps2-min4096-max262144-total0-with-image}"
: "${VIDEOMMMU_DATA_FILE:=${PROJECT_DIR}/eval/data/valid_data/videommmu_with_image.json}"
: "${VIDEOMMMU_VIDEO_ROOT:=${PROJECT_DIR}/data/eval/videommmu}"
: "${VIDEOMMMU_BATCH_SIZE:=4}"
: "${VIDEOMMMU_MAX_MODEL_LEN:=65536}"
: "${VIDEOMMMU_MAX_NEW_TOKENS:=128}"
: "${VIDEOMMMU_MAX_NUM_BATCHED_TOKENS:=65536}"
: "${VIDEOMMMU_GPU_MEMORY_UTILIZATION:=0.90}"
: "${VIDEOMMMU_VIDEO_MIN_PIXELS:=4096}"
: "${VIDEOMMMU_VIDEO_MAX_PIXELS:=262144}"
: "${VIDEOMMMU_VIDEO_TOTAL_PIXELS:=0}"
: "${VIDEOMMMU_MAX_FRAMES:=128}"
: "${VIDEOMMMU_FPS:=2}"
# OneThinker-style Adaptation uses subject videos + PNGs extracted from
# Adaptation/test-00000-of-00001.parquet. Run once before eval:
# python3 eval/data/extract_videommmu_images.py
# prompt_mode=onethink reproduces OneThinker's CoT prompt; pair it with a large
# VIDEOMMMU_MAX_NEW_TOKENS (OneThinker uses 8192).
: "${VIDEOMMMU_PROMPT_MODE:=default}"
# Separate Adaptation image resolution cap (OneThinker uses 1024*32*32=1048576).
: "${VIDEOMMMU_IMAGE_MAX_PIXELS:=1048576}"
# Qwen3.5 native benchmarking: thinking on + recommended sampling + long output.
# To reproduce the official VideoMMMU number, run with:
# VIDEOMMMU_PROMPT_MODE=qwen VIDEOMMMU_ENABLE_THINKING=true
# VIDEOMMMU_MAX_NEW_TOKENS=32768 VIDEOMMMU_MAX_MODEL_LEN=131072
# VIDEOMMMU_TEMPERATURE=1.0 VIDEOMMMU_TOP_P=0.95 VIDEOMMMU_TOP_K=20 VIDEOMMMU_PRESENCE_PENALTY=1.5
: "${VIDEOMMMU_ENABLE_THINKING:=false}"
: "${VIDEOMMMU_TEMPERATURE:=0.0}"
: "${VIDEOMMMU_TOP_P:=1.0}"
: "${VIDEOMMMU_TOP_K:=-1}"
: "${VIDEOMMMU_PRESENCE_PENALTY:=0.0}"
: "${VIDEOMMMU_MIN_P:=0.0}"
# MMVU defaults (multiple-choice subset, raw video).
# Build the MC JSONL once: python scripts/build_mmvu_mc.py
: "${MMVU_DATA_FILE:=${PROJECT_DIR}/eval/data/valid_data/mmvu_mc.jsonl}"
: "${MMVU_VIDEO_ROOT:=${PROJECT_DIR}/data/eval/mmvu}"
: "${MMVU_BATCH_SIZE:=1}"
: "${MMVU_MAX_MODEL_LEN:=65536}"
: "${MMVU_MAX_NEW_TOKENS:=128}"
: "${MMVU_MAX_NUM_BATCHED_TOKENS:=65536}"
: "${MMVU_GPU_MEMORY_UTILIZATION:=0.90}"
: "${MMVU_VIDEO_MIN_PIXELS:=4096}"
: "${MMVU_VIDEO_MAX_PIXELS:=262144}"
: "${MMVU_VIDEO_TOTAL_PIXELS:=0}"
: "${MMVU_MAX_FRAMES:=384}"
: "${MMVU_FPS:=2}"
: "${MMVU_PROMPT_MODE:=default}"
# Qwen3.5 native: MMVU_PROMPT_MODE=qwen MMVU_ENABLE_THINKING=true with large
# MMVU_MAX_NEW_TOKENS / sampling, mirroring VideoMMMU.
: "${MMVU_ENABLE_THINKING:=false}"
: "${MMVU_TEMPERATURE:=0.0}"
: "${MMVU_TOP_P:=1.0}"
: "${MMVU_TOP_K:=-1}"
: "${MMVU_PRESENCE_PENALTY:=0.0}"
: "${MMVU_MIN_P:=0.0}"
: "${MMVU_MAX_SAMPLES:=0}"
: "${MMVU_SETTING:=mmvu-mc-f${MMVU_MAX_FRAMES}-fps${MMVU_FPS}-min${MMVU_VIDEO_MIN_PIXELS}-max${MMVU_VIDEO_MAX_PIXELS}-total${MMVU_VIDEO_TOTAL_PIXELS}-${MMVU_PROMPT_MODE}}"
# MVBench defaults (multi-task short-video multiple-choice).
: "${MVBENCH_DATA_FILE:=${PROJECT_DIR}/eval/data/valid_data/mvbench.json}"
: "${MVBENCH_VIDEO_ROOT:=${PROJECT_DIR}/data/eval/mvbench}"
: "${MVBENCH_BATCH_SIZE:=1}"
: "${MVBENCH_MAX_MODEL_LEN:=65536}"
: "${MVBENCH_MAX_NEW_TOKENS:=128}"
: "${MVBENCH_MAX_NUM_BATCHED_TOKENS:=65536}"
: "${MVBENCH_GPU_MEMORY_UTILIZATION:=0.90}"
: "${MVBENCH_VIDEO_MIN_PIXELS:=4096}"
: "${MVBENCH_VIDEO_MAX_PIXELS:=262144}"
: "${MVBENCH_VIDEO_TOTAL_PIXELS:=0}"
: "${MVBENCH_MAX_FRAMES:=384}"
: "${MVBENCH_FPS:=2}"
: "${MVBENCH_PROMPT_MODE:=default}"
: "${MVBENCH_ENABLE_THINKING:=false}"
: "${MVBENCH_TEMPERATURE:=0.0}"
: "${MVBENCH_TOP_P:=1.0}"
: "${MVBENCH_TOP_K:=-1}"
: "${MVBENCH_PRESENCE_PENALTY:=0.0}"
: "${MVBENCH_MIN_P:=0.0}"
: "${MVBENCH_MAX_SAMPLES:=0}"
: "${MVBENCH_SETTING:=mvbench-f${MVBENCH_MAX_FRAMES}-fps${MVBENCH_FPS}-min${MVBENCH_VIDEO_MIN_PIXELS}-max${MVBENCH_VIDEO_MAX_PIXELS}-total${MVBENCH_VIDEO_TOTAL_PIXELS}-${MVBENCH_PROMPT_MODE}}"
# Video-Holmes defaults (all multiple-choice, raw cropped videos).
# Download: huggingface-cli download TencentARC/Video-Holmes --repo-type dataset
# Build: python scripts/build_videoholmes.py
: "${VIDEOHOLMES_DATA_FILE:=${PROJECT_DIR}/eval/data/valid_data/videoholmes.jsonl}"
: "${VIDEOHOLMES_VIDEO_ROOT:=${PROJECT_DIR}/data/eval/videoholmes}"
: "${VIDEOHOLMES_BATCH_SIZE:=1}"
: "${VIDEOHOLMES_MAX_MODEL_LEN:=65536}"
: "${VIDEOHOLMES_MAX_NEW_TOKENS:=128}"
: "${VIDEOHOLMES_MAX_NUM_BATCHED_TOKENS:=65536}"
: "${VIDEOHOLMES_GPU_MEMORY_UTILIZATION:=0.90}"
: "${VIDEOHOLMES_VIDEO_MIN_PIXELS:=4096}"
: "${VIDEOHOLMES_VIDEO_MAX_PIXELS:=262144}"
: "${VIDEOHOLMES_VIDEO_TOTAL_PIXELS:=0}"
: "${VIDEOHOLMES_MAX_FRAMES:=384}"
: "${VIDEOHOLMES_FPS:=2}"
: "${VIDEOHOLMES_PROMPT_MODE:=default}"
# Official benchmark prompt is reasoning-style:
# VIDEOHOLMES_PROMPT_MODE=holmes VIDEOHOLMES_ENABLE_THINKING=true VIDEOHOLMES_MAX_NEW_TOKENS=1024
: "${VIDEOHOLMES_ENABLE_THINKING:=false}"
: "${VIDEOHOLMES_TEMPERATURE:=0.0}"
: "${VIDEOHOLMES_TOP_P:=1.0}"
: "${VIDEOHOLMES_TOP_K:=-1}"
: "${VIDEOHOLMES_PRESENCE_PENALTY:=0.0}"
: "${VIDEOHOLMES_MIN_P:=0.0}"
: "${VIDEOHOLMES_MAX_SAMPLES:=0}"
: "${VIDEOHOLMES_SETTING:=videoholmes-f${VIDEOHOLMES_MAX_FRAMES}-fps${VIDEOHOLMES_FPS}-min${VIDEOHOLMES_VIDEO_MIN_PIXELS}-max${VIDEOHOLMES_VIDEO_MAX_PIXELS}-total${VIDEOHOLMES_VIDEO_TOTAL_PIXELS}-${VIDEOHOLMES_PROMPT_MODE}}"
# LongVideoBench defaults. Main videos/subtitles repo is gated; after getting
# access, download/extract to LONGVIDEOBENCH_VIDEO_ROOT with videos/ + subtitles/.
# Build validation JSONL: python scripts/build_longvideobench.py
: "${LONGVIDEOBENCH_DATA_FILE:=${PROJECT_DIR}/eval/data/valid_data/longvideobench_val.jsonl}"
: "${LONGVIDEOBENCH_VIDEO_ROOT:=${PROJECT_DIR}/data/eval/longvideobench}"
: "${LONGVIDEOBENCH_SUBTITLE_ROOT:=$LONGVIDEOBENCH_VIDEO_ROOT}"
: "${LONGVIDEOBENCH_USE_SUBTITLES:=true}"
: "${LONGVIDEOBENCH_BATCH_SIZE:=1}"
: "${LONGVIDEOBENCH_MAX_MODEL_LEN:=65536}"
: "${LONGVIDEOBENCH_MAX_NEW_TOKENS:=128}"
: "${LONGVIDEOBENCH_MAX_NUM_BATCHED_TOKENS:=65536}"
: "${LONGVIDEOBENCH_GPU_MEMORY_UTILIZATION:=0.90}"
: "${LONGVIDEOBENCH_VIDEO_MIN_PIXELS:=4096}"
: "${LONGVIDEOBENCH_VIDEO_MAX_PIXELS:=262144}"
: "${LONGVIDEOBENCH_VIDEO_TOTAL_PIXELS:=0}"
: "${LONGVIDEOBENCH_MAX_FRAMES:=384}"
: "${LONGVIDEOBENCH_FPS:=2}"
: "${LONGVIDEOBENCH_PROMPT_MODE:=default}"
: "${LONGVIDEOBENCH_ENABLE_THINKING:=false}"
: "${LONGVIDEOBENCH_TEMPERATURE:=0.0}"
: "${LONGVIDEOBENCH_TOP_P:=1.0}"
: "${LONGVIDEOBENCH_TOP_K:=-1}"
: "${LONGVIDEOBENCH_PRESENCE_PENALTY:=0.0}"
: "${LONGVIDEOBENCH_MIN_P:=0.0}"
: "${LONGVIDEOBENCH_MAX_SAMPLES:=0}"
: "${LONGVIDEOBENCH_SETTING:=longvideobench-val-f${LONGVIDEOBENCH_MAX_FRAMES}-fps${LONGVIDEOBENCH_FPS}-min${LONGVIDEOBENCH_VIDEO_MIN_PIXELS}-max${LONGVIDEOBENCH_VIDEO_MAX_PIXELS}-total${LONGVIDEOBENCH_VIDEO_TOTAL_PIXELS}-${LONGVIDEOBENCH_PROMPT_MODE}}"
# LVBench defaults (long-video multiple-choice; independent from LongVideoBench).
: "${LVBENCH_DATA_FILE:=${PROJECT_DIR}/eval/data/valid_data/lvbench.json}"
: "${LVBENCH_VIDEO_ROOT:=${PROJECT_DIR}/data/eval/lvbench}"
: "${LVBENCH_BATCH_SIZE:=4}"
: "${LVBENCH_MAX_MODEL_LEN:=65536}"
: "${LVBENCH_MAX_NEW_TOKENS:=128}"
: "${LVBENCH_MAX_NUM_BATCHED_TOKENS:=65536}"
: "${LVBENCH_GPU_MEMORY_UTILIZATION:=0.90}"
: "${LVBENCH_VIDEO_MIN_PIXELS:=4096}"
: "${LVBENCH_VIDEO_MAX_PIXELS:=262144}"
: "${LVBENCH_VIDEO_TOTAL_PIXELS:=0}"
: "${LVBENCH_MAX_FRAMES:=128}"
: "${LVBENCH_FPS:=2}"
: "${LVBENCH_PROMPT_MODE:=default}"
: "${LVBENCH_ENABLE_THINKING:=false}"
: "${LVBENCH_TEMPERATURE:=0.0}"
: "${LVBENCH_TOP_P:=1.0}"
: "${LVBENCH_TOP_K:=-1}"
: "${LVBENCH_PRESENCE_PENALTY:=0.0}"
: "${LVBENCH_MIN_P:=0.0}"
: "${LVBENCH_SETTING:=lvbench-f${LVBENCH_MAX_FRAMES}-fps${LVBENCH_FPS}-min${LVBENCH_VIDEO_MIN_PIXELS}-max${LVBENCH_VIDEO_MAX_PIXELS}-total${LVBENCH_VIDEO_TOTAL_PIXELS}-${LVBENCH_PROMPT_MODE}}"
# MLVU defaults (dev multiple-choice subset = 7 tasks, M-Avg).
# Build the MC JSONL once: python scripts/build_mlvu_mc.py
: "${MLVU_DATA_FILE:=${PROJECT_DIR}/eval/data/valid_data/mlvu_mc.jsonl}"
: "${MLVU_VIDEO_ROOT:=${PROJECT_DIR}/data/eval/mlvu}"
: "${MLVU_BATCH_SIZE:=1}"
: "${MLVU_MAX_MODEL_LEN:=65536}"
: "${MLVU_MAX_NEW_TOKENS:=128}"
: "${MLVU_MAX_NUM_BATCHED_TOKENS:=65536}"
: "${MLVU_GPU_MEMORY_UTILIZATION:=0.90}"
: "${MLVU_VIDEO_MIN_PIXELS:=4096}"
: "${MLVU_VIDEO_MAX_PIXELS:=262144}"
: "${MLVU_VIDEO_TOTAL_PIXELS:=0}"
: "${MLVU_MAX_FRAMES:=384}"
: "${MLVU_FPS:=2}"
: "${MLVU_PROMPT_MODE:=default}"
: "${MLVU_ENABLE_THINKING:=false}"
: "${MLVU_TEMPERATURE:=0.0}"
: "${MLVU_TOP_P:=1.0}"
: "${MLVU_TOP_K:=-1}"
: "${MLVU_PRESENCE_PENALTY:=0.0}"
: "${MLVU_MIN_P:=0.0}"
: "${MLVU_MAX_SAMPLES:=0}"
: "${MLVU_SETTING:=mlvu-mc-f${MLVU_MAX_FRAMES}-fps${MLVU_FPS}-min${MLVU_VIDEO_MIN_PIXELS}-max${MLVU_VIDEO_MAX_PIXELS}-total${MLVU_VIDEO_TOTAL_PIXELS}-${MLVU_PROMPT_MODE}}"
# VSI-Bench defaults.
: "${VSI_SETTING:=video128-16M-video-f128-fps2-min65536-maxnone-total16777216-vsibench_preprocessed_128f_16M}"
: "${VSI_DATA_FILE:=${PROJECT_DIR}/eval/data/valid_data/vsibench_preprocessed_128f_16M.jsonl}"
: "${VSI_PREPROCESSED_VIDEO_DIR:=${PROJECT_DIR}/data/eval/vsi/preprocessed_videos}"
: "${VSI_BATCH_SIZE:=16}"
: "${VSI_MAX_MODEL_LEN:=32768}"
: "${VSI_MAX_NEW_TOKENS:=1024}"
: "${VSI_GPU_MEMORY_UTILIZATION:=0.90}"
: "${VSI_EXPECTED_SAMPLES:=5130}"
# MMSI-Bench defaults. Transformers is used so every image can be retained;
# set MMSI_BACKEND=vllm and MMSI_MAX_IMAGES=8 for the legacy path.
: "${MMSI_BACKEND:=transformers}"
: "${MMSI_DATA_FILE:=${PROJECT_DIR}/data/eval/mmsi/MMSI_bench.tsv}"
: "${MMSI_IMAGE_MIN_PIXELS:=4096}"
: "${MMSI_IMAGE_MAX_PIXELS:=262144}"
if [[ "${MMSI_BACKEND}" == "transformers" ]]; then
: "${MMSI_MAX_IMAGES:=0}"
else
: "${MMSI_MAX_IMAGES:=8}"
fi
: "${MMSI_IMAGE_COUNT_TAG:=$([[ "${MMSI_MAX_IMAGES}" -le 0 ]] && echo all || echo "${MMSI_MAX_IMAGES}")}"
: "${MMSI_SETTING:=${MMSI_BACKEND}-img-min${MMSI_IMAGE_MIN_PIXELS}-max${MMSI_IMAGE_MAX_PIXELS}-n${MMSI_IMAGE_COUNT_TAG}-all-MMSI_bench}"
: "${MMSI_BATCH_SIZE:=16}"
: "${MMSI_MAX_MODEL_LEN:=32768}"
: "${MMSI_MAX_NEW_TOKENS:=1024}"
: "${MMSI_MAX_NUM_BATCHED_TOKENS:=32768}"
: "${MMSI_GPU_MEMORY_UTILIZATION:=0.90}"
: "${MMSI_MAX_SAMPLES:=0}"
: "${MMSI_CATEGORY:=}"
: "${MMSI_ENABLE_THINKING:=false}"
: "${MMSI_ATTN_IMPLEMENTATION:=flash_attention_2}"
if [[ -n "${MMSI_CATEGORY}" || "${MMSI_MAX_SAMPLES}" != "0" ]]; then
: "${MMSI_EXPECTED_SAMPLES:=0}"
else
: "${MMSI_EXPECTED_SAMPLES:=1000}"
fi
# MindCube-Tiny defaults.
: "${MINDCUBE_SETTING:=img-min4096-max262144-n4-official-tiny1050}"
: "${MINDCUBE_DATA_FILE:=${PROJECT_DIR}/data/eval/mindcube_official/combined-00000-of-00001.parquet}"
: "${MINDCUBE_MAX_IMAGES:=4}"
: "${MINDCUBE_EXPECTED_SAMPLES:=1050}"
: "${MINDCUBE_HF_CACHE_DIR:=}"
: "${MINDCUBE_BATCH_SIZE:=16}"
: "${MINDCUBE_MAX_MODEL_LEN:=32768}"
: "${MINDCUBE_MAX_NEW_TOKENS:=1024}"
: "${MINDCUBE_MAX_NUM_BATCHED_TOKENS:=32768}"
: "${MINDCUBE_GPU_MEMORY_UTILIZATION:=0.90}"
# ReVSI defaults. The all-frame/native-frame profile reproduces the 58.2 result
# reported for Video-ORA-9B; ReVSI remains excluded from the three-benchmark
# spatial-intelligence average.
: "${REVSI_DATA_FILE:=${PROJECT_DIR}/data/eval/revsi/all_frame/test-00000-of-00001.parquet}"
: "${REVSI_VIDEO_ROOT:=${PROJECT_DIR}/data/eval/revsi}"
: "${REVSI_FRAME_BUDGET:=all}"
: "${REVSI_MAX_FRAMES:=128}"
: "${REVSI_EXACT_NFRAMES:=true}"
: "${REVSI_FPS:=2}"
: "${REVSI_VIDEO_MIN_PIXELS:=65536}"
: "${REVSI_VIDEO_MAX_PIXELS:=}"
: "${REVSI_VIDEO_TOTAL_PIXELS:=16777216}"
: "${REVSI_BATCH_SIZE:=16}"
: "${REVSI_MAX_MODEL_LEN:=32768}"
: "${REVSI_MAX_NEW_TOKENS:=64}"
: "${REVSI_GPU_MEMORY_UTILIZATION:=0.90}"
: "${REVSI_MAX_SAMPLES:=0}"
: "${REVSI_EXPECTED_SAMPLES:=6808}"
: "${REVSI_TASK_FILTER:=}"
: "${REVSI_ENABLE_THINKING:=false}"
: "${REVSI_SETTING:=native-all-f${REVSI_MAX_FRAMES}-exact${REVSI_EXACT_NFRAMES}-fps${REVSI_FPS}-min${REVSI_VIDEO_MIN_PIXELS}-max${REVSI_VIDEO_MAX_PIXELS:-none}-total${REVSI_VIDEO_TOTAL_PIXELS}}"
# Spatial grounding defaults, aligned to data/joint/sft_joint_all.jsonl.
: "${SPATIAL_GROUNDING_DATASETS:=refcoco-val,refcoco-testA,refcoco-testB,refcoco+-val,refcoco+-testA,refcoco+-testB,refcocog-val,refcocog-test}"
: "${SPATIAL_GROUNDING_BENCH_DIR:=${PROJECT_DIR}/eval/task/spatial_grounding}"
: "${SPATIAL_GROUNDING_IMAGE_ROOT:=${PROJECT_DIR}/data/eval/spatial_grounding/images}"
: "${SPATIAL_GROUNDING_PROCESSOR_PATH:=$MODEL_PATH}"
: "${SPATIAL_GROUNDING_PROMPT_STYLE:=qwen_native}"
: "${SPATIAL_GROUNDING_COORD_SYSTEM:=norm1000}"
: "${SPATIAL_GROUNDING_BBOX_SELECT:=first}"
: "${SPATIAL_GROUNDING_MIN_TOKENS:=64}"
: "${SPATIAL_GROUNDING_TOTAL_TOKENS:=1024}"
: "${SPATIAL_GROUNDING_BATCH_SIZE:=64}"
: "${SPATIAL_GROUNDING_MAX_MODEL_LEN:=32768}"
: "${SPATIAL_GROUNDING_MAX_NEW_TOKENS:=1024}"
: "${SPATIAL_GROUNDING_MAX_NUM_BATCHED_TOKENS:=32768}"
: "${SPATIAL_GROUNDING_GPU_MEMORY_UTILIZATION:=0.85}"
: "${SPATIAL_GROUNDING_ENABLE_THINKING:=false}"
: "${SPATIAL_GROUNDING_MAX_SAMPLES:=0}"
: "${SPATIAL_GROUNDING_SETTING:=spatial-grounding-${SPATIAL_GROUNDING_DATASETS//,/_}-${SPATIAL_GROUNDING_PROMPT_STYLE}-min${SPATIAL_GROUNDING_MIN_TOKENS}-total${SPATIAL_GROUNDING_TOTAL_TOKENS}-new${SPATIAL_GROUNDING_MAX_NEW_TOKENS}}"
# Tracking defaults, aligned to data/joint/sft_joint_all.jsonl tracking videos.
: "${TRACKING_DATASETS:=eval_got10k}"
: "${TRACKING_BENCH_DIR:=${PROJECT_DIR}/data/eval/tracking}"
: "${TRACKING_BASE_PREFIX:=$TRACKING_BENCH_DIR}"
: "${TRACKING_PROCESSOR_PATH:=$MODEL_PATH}"
: "${TRACKING_VIDEO_MIN_PIXELS:=4096}"
: "${TRACKING_VIDEO_MAX_PIXELS:=786432}"
: "${TRACKING_VIDEO_TOTAL_PIXELS:=8388608}"
: "${TRACKING_MAX_FRAMES:=32}"
: "${TRACKING_FPS:=1}"
: "${TRACKING_MAX_MODEL_LEN:=32768}"
: "${TRACKING_MAX_NEW_TOKENS:=8192}"
: "${TRACKING_MAX_NUM_BATCHED_TOKENS:=32768}"
: "${TRACKING_BATCH_SIZE:=64}"
: "${TRACKING_GPU_MEMORY_UTILIZATION:=0.95}"
: "${TRACKING_ENABLE_THINKING:=false}"
: "${TRACKING_PROMPT_MODE:=default}"
: "${TRACKING_CHUNKED_REPROMPT:=0}"
: "${TRACKING_REPROMPT_USE_GT_FIRST_BOX:=0}"
: "${TRACKING_MAX_SAMPLES:=0}"
: "${TRACKING_SETTING:=tracking-${TRACKING_DATASETS//,/_}-f${TRACKING_MAX_FRAMES}-fps${TRACKING_FPS}-min${TRACKING_VIDEO_MIN_PIXELS}-max${TRACKING_VIDEO_MAX_PIXELS}-total${TRACKING_VIDEO_TOTAL_PIXELS}-new${TRACKING_MAX_NEW_TOKENS}}"
# STVG defaults, aligned to data/joint/sft_joint_all.jsonl stvg videos.
: "${STVG_DATASETS:=eval_stvg}"
: "${STVG_BENCH_DIR:=${PROJECT_DIR}/data/eval/stvg}"
: "${STVG_BASE_PREFIX:=$STVG_BENCH_DIR}"
: "${STVG_PROCESSOR_PATH:=$MODEL_PATH}"
: "${STVG_VIDEO_MIN_PIXELS:=65536}"
: "${STVG_VIDEO_MAX_PIXELS:=393216}"
: "${STVG_VIDEO_TOTAL_PIXELS:=10485760}"
: "${STVG_MAX_FRAMES:=128}"
: "${STVG_FPS:=2}"
: "${STVG_MAX_MODEL_LEN:=65536}"
: "${STVG_MAX_NEW_TOKENS:=2048}"
: "${STVG_MAX_NUM_BATCHED_TOKENS:=65536}"
: "${STVG_BATCH_SIZE:=64}"
: "${STVG_GPU_MEMORY_UTILIZATION:=0.85}"
: "${STVG_ENABLE_THINKING:=false}"
: "${STVG_PROMPT_MODE:=train_stvg}"
: "${STVG_MAX_SAMPLES:=0}"
: "${STVG_SETTING:=stvg-${STVG_DATASETS//,/_}-f${STVG_MAX_FRAMES}-fps${STVG_FPS}-min${STVG_VIDEO_MIN_PIXELS}-max${STVG_VIDEO_MAX_PIXELS}-total${STVG_VIDEO_TOTAL_PIXELS}-new${STVG_MAX_NEW_TOKENS}-${STVG_PROMPT_MODE}}"
# Segmentation defaults.
# This task is dispatched to eval/task/segmentation/run_eval_vllm.sh,
# which performs vLLM inference plus optional SAM2 post-processing.
: "${SEGMENTATION_DATASETS:=eval_seg_refcoco,eval_seg_refcocop,eval_seg_refcocog,eval_seg_mevis,eval_seg_reasonvos}"
: "${SEGMENTATION_BENCH_DIR:=${PROJECT_DIR}/data/eval/segmentation}"
: "${SEGMENTATION_DATA_ROOT:=$SEGMENTATION_BENCH_DIR}"
: "${SEGMENTATION_PROCESSOR_PATH:=$MODEL_PATH}"
: "${SEGMENTATION_DATA_TYPE:=all}"
# train_seg mirrors the prompt used in joint SFT training data
# (data/train/seg_image_nothink_evalaware.jsonl, seg_video_nothink.jsonl).
: "${SEGMENTATION_PROMPT_MODE:=train_seg}"
: "${SEGMENTATION_ENABLE_THINKING:=false}"
: "${SEGMENTATION_BATCH_SIZE:=16}"
: "${SEGMENTATION_MAX_NEW_TOKENS:=1024}"
: "${SEGMENTATION_MAX_MODEL_LEN:=32768}"
: "${SEGMENTATION_MAX_PIXELS_IMAGE:=1048576}"
: "${SEGMENTATION_MIN_PIXELS_IMAGE:=4096}"
: "${SEGMENTATION_VIDEO_MAX_PIXELS:=262144}"
: "${SEGMENTATION_VIDEO_MIN_PIXELS:=4096}"
: "${SEGMENTATION_VIDEO_TOTAL_PIXELS:=16777216}"
: "${SEGMENTATION_MAX_FRAMES:=128}"
: "${SEGMENTATION_FPS:=2}"
: "${SEGMENTATION_VIDEO_READER:=decord}"
: "${SEGMENTATION_GPU_MEM_UTIL:=0.85}"
: "${SEGMENTATION_SEED:=42}"
: "${SEGMENTATION_MAX_SAMPLES:=}"
: "${SEGMENTATION_RUN_SAM2:=false}"
: "${SEGMENTATION_SAM2_CKPT:=${PROJECT_DIR}/models/sam2/sam2.1_hiera_large.pt}"
: "${SEGMENTATION_SAM2_CFG:=configs/sam2.1/sam2.1_hiera_l.yaml}"
: "${SEGMENTATION_POSTPROCESSOR_PATH:=${PROJECT_DIR}/third_party/OneThinker/Evaluation/Eval/seg_post_sam2.py}"
# SAM2 post-processing parallelism. world_size = NUM_GPUS * WORKERS_PER_GPU.
# With a large SAM2_EPOCH_SIZE (single epoch) + maxtasksperchild=1, EACH worker
# loads the SAM2 model exactly ONCE at startup and then streams its whole slice
# (no repeated reloads). So WORKERS_PER_GPU only trades GPU utilization vs total
# process count: too high (32 -> 256 procs) exhausts CPU/RAM/ffmpeg/handles and
# aborts; too low (1) underutilizes the GPU. 4 per GPU is a balance (8 GPUs -> 32
# persistent workers, 32 one-time loads); bump to 6-8 if GPU is still not full.
# Leave NUM_GPUS empty to auto-use all visible GPUs.
: "${SEGMENTATION_SAM2_NUM_GPUS:=}"
: "${SEGMENTATION_SAM2_WORKERS_PER_GPU:=8}"
: "${SEGMENTATION_SETTING:=segmentation-${SEGMENTATION_DATASETS//,/_}-${SEGMENTATION_PROMPT_MODE}-f${SEGMENTATION_MAX_FRAMES}-fps${SEGMENTATION_FPS}-min${SEGMENTATION_VIDEO_MIN_PIXELS}-max${SEGMENTATION_VIDEO_MAX_PIXELS}-total${SEGMENTATION_VIDEO_TOTAL_PIXELS}-new${SEGMENTATION_MAX_NEW_TOKENS}}"
# TimeLens-Bench temporal grounding defaults.
# This task uses HuggingFace transformers, not vLLM.
: "${TIMELENS_DATASETS:=charades-timelens}"
: "${TIMELENS_BENCH_DIR:=${PROJECT_DIR}/data/eval/temporal_grounding}"
: "${TIMELENS_ENABLE_THINKING:=false}"
: "${TIMELENS_MIN_TOKENS:=1}"
: "${TIMELENS_TOTAL_TOKENS:=128000}"
: "${TIMELENS_MAX_PIXELS:=409600}"
: "${TIMELENS_MAX_FRAMES:=2048}"
: "${TIMELENS_FPS:=4}"
: "${TIMELENS_MAX_NEW_TOKENS:=128}"
: "${TIMELENS_REPETITION_PENALTY:=1.0}"
: "${TIMELENS_STOP_AFTER_ANSWER:=true}"
: "${TIMELENS_PROMPT_MODE:=same}"
: "${TIMELENS_NUM_WORKERS:=2}"
: "${TIMELENS_MAX_SAMPLES:=0}"
export MODEL_PATH TASKS GPUS TP_SIZE SHARD_MODE VIDEO_CACHE_SIZE PREFETCH_BATCHES
export FORCE_MERGE SKIP_MERGE MERGE_LOG_DIR
export VIDEOMME_SETTING VIDEOMME_DATA_FILE VIDEOMME_VIDEO_BASE VIDEOMME_VIDEO_DIR
export VIDEOMME_PREPROCESSED_VIDEO_DIR VIDEOMME_VIDEO_MIN_PIXELS VIDEOMME_VIDEO_MAX_PIXELS
export VIDEOMME_VIDEO_TOTAL_PIXELS VIDEOMME_MAX_FRAMES VIDEOMME_FPS
export VIDEOMME_BATCH_SIZE VIDEOMME_MAX_MODEL_LEN VIDEOMME_MAX_NEW_TOKENS
export VIDEOMME_MAX_NUM_BATCHED_TOKENS VIDEOMME_GPU_MEMORY_UTILIZATION
export VIDEOMME_MAX_SAMPLES
export VIDEOMMEV2_SETTING VIDEOMMEV2_DATA_FILE VIDEOMMEV2_VIDEO_BASE VIDEOMMEV2_VIDEO_DIR
export VIDEOMMEV2_PREPROCESSED_VIDEO_DIR VIDEOMMEV2_VIDEO_MIN_PIXELS VIDEOMMEV2_VIDEO_MAX_PIXELS
export VIDEOMMEV2_VIDEO_TOTAL_PIXELS VIDEOMMEV2_MAX_FRAMES VIDEOMMEV2_FPS
export VIDEOMMEV2_BATCH_SIZE VIDEOMMEV2_MAX_MODEL_LEN VIDEOMMEV2_MAX_NEW_TOKENS
export VIDEOMMEV2_MAX_NUM_BATCHED_TOKENS VIDEOMMEV2_GPU_MEMORY_UTILIZATION
export VIDEOMMEV2_PROMPT_MODE VIDEOMMEV2_ANSWER_FILTER VIDEOMMEV2_MAX_SAMPLES
export VIDEOMMMU_SETTING VIDEOMMMU_DATA_FILE VIDEOMMMU_VIDEO_ROOT
export VIDEOMMMU_BATCH_SIZE VIDEOMMMU_MAX_MODEL_LEN VIDEOMMMU_MAX_NEW_TOKENS
export VIDEOMMMU_MAX_NUM_BATCHED_TOKENS VIDEOMMMU_GPU_MEMORY_UTILIZATION
export VIDEOMMMU_VIDEO_MIN_PIXELS VIDEOMMMU_VIDEO_MAX_PIXELS VIDEOMMMU_VIDEO_TOTAL_PIXELS
export VIDEOMMMU_MAX_FRAMES VIDEOMMMU_FPS VIDEOMMMU_PROMPT_MODE VIDEOMMMU_IMAGE_MAX_PIXELS
export VIDEOMMMU_ENABLE_THINKING VIDEOMMMU_TEMPERATURE VIDEOMMMU_TOP_P VIDEOMMMU_TOP_K
export VIDEOMMMU_PRESENCE_PENALTY VIDEOMMMU_MIN_P
export MMVU_SETTING MMVU_DATA_FILE MMVU_VIDEO_ROOT MMVU_BATCH_SIZE
export MMVU_MAX_MODEL_LEN MMVU_MAX_NEW_TOKENS MMVU_MAX_NUM_BATCHED_TOKENS
export MMVU_GPU_MEMORY_UTILIZATION MMVU_VIDEO_MIN_PIXELS MMVU_VIDEO_MAX_PIXELS
export MMVU_VIDEO_TOTAL_PIXELS MMVU_MAX_FRAMES MMVU_FPS MMVU_PROMPT_MODE
export MMVU_ENABLE_THINKING MMVU_TEMPERATURE MMVU_TOP_P MMVU_TOP_K
export MMVU_PRESENCE_PENALTY MMVU_MIN_P MMVU_MAX_SAMPLES
export MVBENCH_SETTING MVBENCH_DATA_FILE MVBENCH_VIDEO_ROOT MVBENCH_BATCH_SIZE
export MVBENCH_MAX_MODEL_LEN MVBENCH_MAX_NEW_TOKENS MVBENCH_MAX_NUM_BATCHED_TOKENS
export MVBENCH_GPU_MEMORY_UTILIZATION MVBENCH_VIDEO_MIN_PIXELS MVBENCH_VIDEO_MAX_PIXELS
export MVBENCH_VIDEO_TOTAL_PIXELS MVBENCH_MAX_FRAMES MVBENCH_FPS MVBENCH_PROMPT_MODE
export MVBENCH_ENABLE_THINKING MVBENCH_TEMPERATURE MVBENCH_TOP_P MVBENCH_TOP_K
export MVBENCH_PRESENCE_PENALTY MVBENCH_MIN_P MVBENCH_MAX_SAMPLES
export VIDEOHOLMES_SETTING VIDEOHOLMES_DATA_FILE VIDEOHOLMES_VIDEO_ROOT VIDEOHOLMES_BATCH_SIZE
export VIDEOHOLMES_MAX_MODEL_LEN VIDEOHOLMES_MAX_NEW_TOKENS VIDEOHOLMES_MAX_NUM_BATCHED_TOKENS
export VIDEOHOLMES_GPU_MEMORY_UTILIZATION VIDEOHOLMES_VIDEO_MIN_PIXELS VIDEOHOLMES_VIDEO_MAX_PIXELS
export VIDEOHOLMES_VIDEO_TOTAL_PIXELS VIDEOHOLMES_MAX_FRAMES VIDEOHOLMES_FPS VIDEOHOLMES_PROMPT_MODE
export VIDEOHOLMES_ENABLE_THINKING VIDEOHOLMES_TEMPERATURE VIDEOHOLMES_TOP_P VIDEOHOLMES_TOP_K
export VIDEOHOLMES_PRESENCE_PENALTY VIDEOHOLMES_MIN_P VIDEOHOLMES_MAX_SAMPLES
export LONGVIDEOBENCH_SETTING LONGVIDEOBENCH_DATA_FILE LONGVIDEOBENCH_VIDEO_ROOT
export LONGVIDEOBENCH_SUBTITLE_ROOT LONGVIDEOBENCH_USE_SUBTITLES LONGVIDEOBENCH_BATCH_SIZE
export LONGVIDEOBENCH_MAX_MODEL_LEN LONGVIDEOBENCH_MAX_NEW_TOKENS LONGVIDEOBENCH_MAX_NUM_BATCHED_TOKENS
export LONGVIDEOBENCH_GPU_MEMORY_UTILIZATION LONGVIDEOBENCH_VIDEO_MIN_PIXELS LONGVIDEOBENCH_VIDEO_MAX_PIXELS
export LONGVIDEOBENCH_VIDEO_TOTAL_PIXELS LONGVIDEOBENCH_MAX_FRAMES LONGVIDEOBENCH_FPS LONGVIDEOBENCH_PROMPT_MODE
export LONGVIDEOBENCH_ENABLE_THINKING LONGVIDEOBENCH_TEMPERATURE LONGVIDEOBENCH_TOP_P LONGVIDEOBENCH_TOP_K
export LONGVIDEOBENCH_PRESENCE_PENALTY LONGVIDEOBENCH_MIN_P LONGVIDEOBENCH_MAX_SAMPLES
export LVBENCH_SETTING LVBENCH_DATA_FILE LVBENCH_VIDEO_ROOT LVBENCH_BATCH_SIZE
export LVBENCH_MAX_MODEL_LEN LVBENCH_MAX_NEW_TOKENS LVBENCH_MAX_NUM_BATCHED_TOKENS
export LVBENCH_GPU_MEMORY_UTILIZATION LVBENCH_VIDEO_MIN_PIXELS LVBENCH_VIDEO_MAX_PIXELS
export LVBENCH_VIDEO_TOTAL_PIXELS LVBENCH_MAX_FRAMES LVBENCH_FPS LVBENCH_PROMPT_MODE
export LVBENCH_ENABLE_THINKING LVBENCH_TEMPERATURE LVBENCH_TOP_P LVBENCH_TOP_K
export LVBENCH_PRESENCE_PENALTY LVBENCH_MIN_P
export MLVU_SETTING MLVU_DATA_FILE MLVU_VIDEO_ROOT MLVU_BATCH_SIZE
export MLVU_MAX_MODEL_LEN MLVU_MAX_NEW_TOKENS MLVU_MAX_NUM_BATCHED_TOKENS
export MLVU_GPU_MEMORY_UTILIZATION MLVU_VIDEO_MIN_PIXELS MLVU_VIDEO_MAX_PIXELS
export MLVU_VIDEO_TOTAL_PIXELS MLVU_MAX_FRAMES MLVU_FPS MLVU_PROMPT_MODE
export MLVU_ENABLE_THINKING MLVU_TEMPERATURE MLVU_TOP_P MLVU_TOP_K
export MLVU_PRESENCE_PENALTY MLVU_MIN_P MLVU_MAX_SAMPLES
export VSI_SETTING VSI_DATA_FILE VSI_PREPROCESSED_VIDEO_DIR
export VSI_BATCH_SIZE VSI_MAX_MODEL_LEN VSI_MAX_NEW_TOKENS VSI_GPU_MEMORY_UTILIZATION
export VSI_EXPECTED_SAMPLES
export MMSI_BACKEND MMSI_SETTING MMSI_DATA_FILE MMSI_MAX_IMAGES MMSI_BATCH_SIZE
export MMSI_IMAGE_MIN_PIXELS MMSI_IMAGE_MAX_PIXELS MMSI_IMAGE_COUNT_TAG
export MMSI_MAX_MODEL_LEN MMSI_MAX_NEW_TOKENS MMSI_MAX_NUM_BATCHED_TOKENS
export MMSI_GPU_MEMORY_UTILIZATION MMSI_MAX_SAMPLES MMSI_CATEGORY
export MMSI_ENABLE_THINKING MMSI_ATTN_IMPLEMENTATION MMSI_EXPECTED_SAMPLES
export MINDCUBE_SETTING MINDCUBE_DATA_FILE MINDCUBE_MAX_IMAGES MINDCUBE_BATCH_SIZE
export MINDCUBE_MAX_MODEL_LEN MINDCUBE_MAX_NEW_TOKENS MINDCUBE_MAX_NUM_BATCHED_TOKENS
export MINDCUBE_GPU_MEMORY_UTILIZATION MINDCUBE_EXPECTED_SAMPLES MINDCUBE_HF_CACHE_DIR
export REVSI_SETTING REVSI_DATA_FILE REVSI_VIDEO_ROOT REVSI_FRAME_BUDGET
export REVSI_MAX_FRAMES REVSI_EXACT_NFRAMES REVSI_FPS
export REVSI_VIDEO_MIN_PIXELS REVSI_VIDEO_MAX_PIXELS REVSI_VIDEO_TOTAL_PIXELS
export REVSI_BATCH_SIZE REVSI_MAX_MODEL_LEN REVSI_MAX_NEW_TOKENS
export REVSI_GPU_MEMORY_UTILIZATION REVSI_MAX_SAMPLES REVSI_EXPECTED_SAMPLES
export REVSI_TASK_FILTER REVSI_ENABLE_THINKING
export SPATIAL_GROUNDING_SETTING SPATIAL_GROUNDING_DATASETS SPATIAL_GROUNDING_BENCH_DIR
export SPATIAL_GROUNDING_IMAGE_ROOT SPATIAL_GROUNDING_PROCESSOR_PATH SPATIAL_GROUNDING_PROMPT_STYLE
export SPATIAL_GROUNDING_COORD_SYSTEM SPATIAL_GROUNDING_BBOX_SELECT
export SPATIAL_GROUNDING_MIN_TOKENS SPATIAL_GROUNDING_TOTAL_TOKENS
export SPATIAL_GROUNDING_BATCH_SIZE SPATIAL_GROUNDING_MAX_MODEL_LEN
export SPATIAL_GROUNDING_MAX_NEW_TOKENS SPATIAL_GROUNDING_MAX_NUM_BATCHED_TOKENS
export SPATIAL_GROUNDING_GPU_MEMORY_UTILIZATION SPATIAL_GROUNDING_ENABLE_THINKING
export SPATIAL_GROUNDING_MAX_SAMPLES
export TRACKING_SETTING TRACKING_DATASETS TRACKING_BENCH_DIR TRACKING_BASE_PREFIX
export TRACKING_PROCESSOR_PATH TRACKING_VIDEO_MIN_PIXELS TRACKING_VIDEO_MAX_PIXELS
export TRACKING_VIDEO_TOTAL_PIXELS TRACKING_MAX_FRAMES TRACKING_FPS
export TRACKING_MAX_MODEL_LEN TRACKING_MAX_NEW_TOKENS TRACKING_MAX_NUM_BATCHED_TOKENS
export TRACKING_BATCH_SIZE TRACKING_GPU_MEMORY_UTILIZATION TRACKING_ENABLE_THINKING
export TRACKING_PROMPT_MODE TRACKING_CHUNKED_REPROMPT TRACKING_REPROMPT_USE_GT_FIRST_BOX
export TRACKING_MAX_SAMPLES
export STVG_SETTING STVG_DATASETS STVG_BENCH_DIR STVG_BASE_PREFIX STVG_PROCESSOR_PATH
export STVG_VIDEO_MIN_PIXELS STVG_VIDEO_MAX_PIXELS STVG_VIDEO_TOTAL_PIXELS
export STVG_MAX_FRAMES STVG_FPS STVG_MAX_MODEL_LEN STVG_MAX_NEW_TOKENS
export STVG_MAX_NUM_BATCHED_TOKENS STVG_BATCH_SIZE STVG_GPU_MEMORY_UTILIZATION
export STVG_ENABLE_THINKING STVG_PROMPT_MODE STVG_MAX_SAMPLES
export SEGMENTATION_SETTING SEGMENTATION_DATASETS SEGMENTATION_BENCH_DIR SEGMENTATION_DATA_ROOT
export SEGMENTATION_PROCESSOR_PATH SEGMENTATION_DATA_TYPE SEGMENTATION_PROMPT_MODE
export SEGMENTATION_ENABLE_THINKING SEGMENTATION_BATCH_SIZE SEGMENTATION_MAX_NEW_TOKENS
export SEGMENTATION_MAX_MODEL_LEN SEGMENTATION_MAX_PIXELS_IMAGE SEGMENTATION_MIN_PIXELS_IMAGE
export SEGMENTATION_VIDEO_MAX_PIXELS SEGMENTATION_VIDEO_MIN_PIXELS SEGMENTATION_VIDEO_TOTAL_PIXELS
export SEGMENTATION_MAX_FRAMES SEGMENTATION_FPS SEGMENTATION_VIDEO_READER
export SEGMENTATION_GPU_MEM_UTIL SEGMENTATION_SEED
export SEGMENTATION_MAX_SAMPLES
export SEGMENTATION_RUN_SAM2 SEGMENTATION_SAM2_CKPT SEGMENTATION_SAM2_CFG
export SEGMENTATION_SAM2_NUM_GPUS SEGMENTATION_SAM2_WORKERS_PER_GPU
export TIMELENS_BENCH_DIR TIMELENS_MAX_SAMPLES
# Conda env used to run eval. By default, keep the currently active environment.
# Override with EVAL_CONDA_ENV=xxx only when an explicit env switch is desired.
: "${EVAL_CONDA_ENV:=keep}"
if [[ "${EVAL_CONDA_ENV}" != "keep" && "${CONDA_DEFAULT_ENV:-}" != "${EVAL_CONDA_ENV}" ]]; then
if command -v conda >/dev/null 2>&1; then
eval "$(conda shell.bash hook)"
conda activate "${EVAL_CONDA_ENV}"
else
echo "ERROR: conda not found and CONDA_DEFAULT_ENV=${CONDA_DEFAULT_ENV:-<unset>}" >&2
exit 1
fi
fi
cd "${PROJECT_DIR}"
resolve_model_path() {
local input_path="${MODEL_PATH%/}"
if ls "${input_path}"/model_world_size_*_rank_0.pt >/dev/null 2>&1; then
local actor_dir="$input_path"
local hf_dir="${MERGED_MODEL_PATH:-${actor_dir}/huggingface}"
local need_merge=0
if [[ "${SKIP_MERGE}" = "1" ]]; then
need_merge=0
elif [[ "${FORCE_MERGE}" = "1" ]]; then
need_merge=1
elif [[ ! -f "${hf_dir}/model.safetensors" ]]; then
need_merge=1
fi
if [[ "${need_merge}" = "1" ]]; then
mkdir -p "${MERGE_LOG_DIR}"
local merge_log="${MERGE_LOG_DIR}/merge-$(basename "$(dirname "${actor_dir}")")-$(date +%Y%m%d_%H%M%S).log"
echo "[merge] FSDP actor checkpoint detected: ${actor_dir}"
echo "[merge] Merging shards -> ${hf_dir}"
if [[ -n "${BASE_MODEL_PATH:-}" ]]; then
python -u scripts/model_merger.py \
--local_dir "${actor_dir}" \
--base_model_path "${BASE_MODEL_PATH}" \
2>&1 | tee "${merge_log}"
else
python -u scripts/model_merger.py \
--local_dir "${actor_dir}" \
2>&1 | tee "${merge_log}"
fi
if [[ ! -f "${hf_dir}/model.safetensors" ]]; then
echo "ERROR: merge finished but ${hf_dir}/model.safetensors was not created. Log: ${merge_log}" >&2
exit 1
fi
else
echo "[merge] Using existing merged HF model: ${hf_dir}"
fi
MODEL_PATH="${hf_dir}"
export MODEL_PATH
if [[ "${TRACKING_PROCESSOR_PATH%/}" = "${input_path}" ]]; then
TRACKING_PROCESSOR_PATH="${MODEL_PATH}"
export TRACKING_PROCESSOR_PATH
fi
if [[ "${STVG_PROCESSOR_PATH%/}" = "${input_path}" ]]; then
STVG_PROCESSOR_PATH="${MODEL_PATH}"
export STVG_PROCESSOR_PATH
fi
if [[ "${SPATIAL_GROUNDING_PROCESSOR_PATH%/}" = "${input_path}" ]]; then
SPATIAL_GROUNDING_PROCESSOR_PATH="${MODEL_PATH}"
export SPATIAL_GROUNDING_PROCESSOR_PATH
fi
if [[ "${SEGMENTATION_PROCESSOR_PATH%/}" = "${input_path}" ]]; then
SEGMENTATION_PROCESSOR_PATH="${MODEL_PATH}"
export SEGMENTATION_PROCESSOR_PATH
fi
elif [[ -d "${input_path}/huggingface" && -f "${input_path}/huggingface/model.safetensors" && ! -f "${input_path}/config.json" ]]; then
MODEL_PATH="${input_path}/huggingface"
export MODEL_PATH
echo "[merge] MODEL_PATH points to a checkpoint wrapper; using ${MODEL_PATH}"
fi
}
resolve_model_path
VLLM_TASKS=""
RUN_TIMELENS=0
RUN_SEGMENTATION=0
RUN_MMSI_TRANSFORMERS=0
RUN_REVSI=0
if [[ "${MMSI_BACKEND}" != "transformers" && "${MMSI_BACKEND}" != "vllm" ]]; then
echo "ERROR: MMSI_BACKEND must be 'transformers' or 'vllm', got '${MMSI_BACKEND}'" >&2
exit 1
fi
append_vllm_task() {
local task="$1"
if [[ -z "$VLLM_TASKS" ]]; then
VLLM_TASKS="$task"
else
VLLM_TASKS="${VLLM_TASKS},${task}"
fi
}
model_family_tag() {
local model_path="${1%/}"
local name
name="$(basename "$model_path")"
local parent
local grandparent
parent="$(basename "$(dirname "$model_path")")"
grandparent="$(basename "$(dirname "$(dirname "$model_path")")")"
if [[ "$name" == "huggingface" && "$parent" == "actor" && "$grandparent" == global_step_* ]]; then
basename "$(dirname "$(dirname "$(dirname "$model_path")")")"
return
fi
if [[ "$name" == checkpoint-* ]]; then
basename "$(dirname "$(dirname "$model_path")")"
else
echo "$name"
fi
}
checkpoint_tag() {
local model_path="${1%/}"
local name
name="$(basename "$model_path")"
local parent
local grandparent
parent="$(basename "$(dirname "$model_path")")"
grandparent="$(basename "$(dirname "$(dirname "$model_path")")")"
if [[ "$name" == "huggingface" && "$parent" == "actor" && "$grandparent" == global_step_* ]]; then
basename "$(dirname "$(dirname "$model_path")")"
return
fi
if [[ "$name" == checkpoint-* ]]; then
echo "$name"
else
echo "base"
fi
}
IFS=',' read -ra TASK_LIST <<< "$TASKS"
for RAW_TASK in "${TASK_LIST[@]}"; do
TASK="$(echo "$RAW_TASK" | xargs)"
case "$TASK" in
all)
VLLM_TASKS="videomme,videommev2,videommmu,mmvu,mvbench,videoholmes,longvideobench,lvbench,mlvu,vsi,mindcube,spatial_grounding,tracking,stvg"
if [[ "${MMSI_BACKEND}" == "transformers" ]]; then
RUN_MMSI_TRANSFORMERS=1
else
append_vllm_task "mmsi"
fi
RUN_REVSI=1
;;
videomme|videommev2|videommmu|mmvu|mvbench|videoholmes|longvideobench|lvbench|mlvu|vsi|mindcube|spatial_grounding|tracking|stvg)
append_vllm_task "$TASK"
;;
mmsi)
if [[ "${MMSI_BACKEND}" == "transformers" ]]; then
RUN_MMSI_TRANSFORMERS=1
else
append_vllm_task "mmsi"
fi
;;
revsi)
RUN_REVSI=1
;;
spatial|grounding|refcoco|spatial_grounding_eval)
append_vllm_task "spatial_grounding"
;;
spatial_temporal_grounding)
append_vllm_task "stvg"
;;
temporal_grounding|timelens|timelens_bench)
RUN_TIMELENS=1
;;
segmentation|seg|reasonseg|refseg)
RUN_SEGMENTATION=1
;;
"")
;;
*)
echo "ERROR: unknown TASK '${TASK}'. Supported: videomme,videommev2,videommmu,mmvu,mvbench,videoholmes,longvideobench,lvbench,mlvu,vsi,mmsi,mindcube,revsi,spatial_grounding,tracking,stvg,temporal_grounding,segmentation,all" >&2
exit 1
;;
esac
done
if [[ -n "$VLLM_TASKS" ]]; then
TASKS="$VLLM_TASKS" python eval/task/eval_vllm.py "$@"
fi
if [[ "$RUN_MMSI_TRANSFORMERS" = "1" ]]; then
MMSI_FAMILY="$(model_family_tag "$MODEL_PATH")"
MMSI_CKPT="$(checkpoint_tag "$MODEL_PATH")"
MMSI_RUN_ROOT="${PROJECT_DIR}/outputs/${MMSI_FAMILY}/spatial_intelligence/mmsi/${MMSI_CKPT}/${MMSI_SETTING}/$(date +%Y%m%d_%H%M%S)"
CUDA_VISIBLE_DEVICES="$GPUS" \
PROCESSOR_PATH="$MODEL_PATH" \
DATA_FILE="$MMSI_DATA_FILE" \
OUTPUT_DIR="$MMSI_RUN_ROOT" \
IMAGE_MIN_PIXELS="$MMSI_IMAGE_MIN_PIXELS" \
IMAGE_MAX_PIXELS="$MMSI_IMAGE_MAX_PIXELS" \
MAX_IMAGES="$MMSI_MAX_IMAGES" \
MAX_NEW_TOKENS="$MMSI_MAX_NEW_TOKENS" \
MAX_SAMPLES="$MMSI_MAX_SAMPLES" \
CATEGORY="$MMSI_CATEGORY" \
ENABLE_THINKING="$MMSI_ENABLE_THINKING" \
ATTN_IMPLEMENTATION="$MMSI_ATTN_IMPLEMENTATION" \
EXPECTED_SAMPLES="$MMSI_EXPECTED_SAMPLES" \
bash eval/task/mmsi/run_eval_transformers.sh "$MODEL_PATH"
fi
if [[ "$RUN_REVSI" = "1" ]]; then
REVSI_FAMILY="$(model_family_tag "$MODEL_PATH")"
REVSI_CKPT="$(checkpoint_tag "$MODEL_PATH")"
REVSI_RUN_EXPECTED_SAMPLES="$REVSI_EXPECTED_SAMPLES"
if [[ "$REVSI_MAX_SAMPLES" != "0" || -n "$REVSI_TASK_FILTER" ]]; then
REVSI_RUN_EXPECTED_SAMPLES=0
fi
REVSI_RUN_ROOT="${PROJECT_DIR}/outputs/${REVSI_FAMILY}/spatial_intelligence/revsi/${REVSI_CKPT}/${REVSI_SETTING}/$(date +%Y%m%d_%H%M%S)"
CUDA_VISIBLE_DEVICES="$GPUS" \
REVSI_ROOT="$REVSI_VIDEO_ROOT" \
QA_FILE="$REVSI_DATA_FILE" \
VIDEO_ROOT="$REVSI_VIDEO_ROOT" \
FRAME_BUDGET="$REVSI_FRAME_BUDGET" \
OUTPUT_DIR="$REVSI_RUN_ROOT" \
MAX_FRAMES="$REVSI_MAX_FRAMES" \
EXACT_NFRAMES="$REVSI_EXACT_NFRAMES" \
FPS="$REVSI_FPS" \
VIDEO_MIN_PIXELS="$REVSI_VIDEO_MIN_PIXELS" \
VIDEO_MAX_PIXELS="$REVSI_VIDEO_MAX_PIXELS" \
VIDEO_TOTAL_PIXELS="$REVSI_VIDEO_TOTAL_PIXELS" \
BATCH_SIZE="$REVSI_BATCH_SIZE" \
MAX_MODEL_LEN="$REVSI_MAX_MODEL_LEN" \
MAX_NEW_TOKENS="$REVSI_MAX_NEW_TOKENS" \
GPU_MEM_UTIL="$REVSI_GPU_MEMORY_UTILIZATION" \
MAX_SAMPLES="$REVSI_MAX_SAMPLES" \
EXPECTED_SAMPLES="$REVSI_RUN_EXPECTED_SAMPLES" \
TASK_FILTER="$REVSI_TASK_FILTER" \
ENABLE_THINKING="$REVSI_ENABLE_THINKING" \
TP_SIZE="$TP_SIZE" \
bash eval/task/revsi/run_eval_vllm.sh "$MODEL_PATH"
fi
if [[ "$RUN_TIMELENS" = "1" ]]; then
TIMELENS_FAMILY="$(model_family_tag "$MODEL_PATH")"
TIMELENS_CKPT="$(checkpoint_tag "$MODEL_PATH")"
TIMELENS_SETTING="timelens-fps${TIMELENS_FPS}-min${TIMELENS_MIN_TOKENS}-total${TIMELENS_TOTAL_TOKENS}-new${TIMELENS_MAX_NEW_TOKENS}-${TIMELENS_DATASETS//,/_}"
TIMELENS_RUN_ROOT="${PROJECT_DIR}/outputs/${TIMELENS_FAMILY}/temporal_grounding/${TIMELENS_CKPT}/${TIMELENS_SETTING}/$(date +%Y%m%d_%H%M%S)"
CUDA_VISIBLE_DEVICES="$GPUS" \
DATASETS="$TIMELENS_DATASETS" \
SETTING="$TIMELENS_SETTING" \
OUTPUT_ROOT="$TIMELENS_RUN_ROOT" \
TIMELENS_USE_OUTPUT_ROOT_DIRECT=1 \
MIN_TOKENS="$TIMELENS_MIN_TOKENS" \
TOTAL_TOKENS="$TIMELENS_TOTAL_TOKENS" \
MAX_PIXELS="$TIMELENS_MAX_PIXELS" \
MAX_FRAMES="$TIMELENS_MAX_FRAMES" \
FPS="$TIMELENS_FPS" \
MAX_NEW_TOKENS="$TIMELENS_MAX_NEW_TOKENS" \
REPETITION_PENALTY="$TIMELENS_REPETITION_PENALTY" \
STOP_AFTER_ANSWER="$TIMELENS_STOP_AFTER_ANSWER" \
PROMPT_MODE="$TIMELENS_PROMPT_MODE" \
NUM_WORKERS="$TIMELENS_NUM_WORKERS" \
bash eval/task/temporal_grounding/run_eval.sh \
"$MODEL_PATH" \
"$TIMELENS_ENABLE_THINKING" \
"$TIMELENS_RUN_ROOT"
fi
if [[ "$RUN_SEGMENTATION" = "1" ]]; then
SEG_FAMILY="$(model_family_tag "$MODEL_PATH")"
SEG_CKPT="$(checkpoint_tag "$MODEL_PATH")"
SEG_RUN_ROOT="${PROJECT_DIR}/outputs/${SEG_FAMILY}/segmentation/${SEG_CKPT}/${SEGMENTATION_SETTING}/$(date +%Y%m%d_%H%M%S)"
CUDA_VISIBLE_DEVICES="${CUDA_VISIBLE_DEVICES:-$GPUS}" \
PROCESSOR_PATH="$SEGMENTATION_PROCESSOR_PATH" \
BENCH_DIR="$SEGMENTATION_BENCH_DIR" \
DATA_ROOT="$SEGMENTATION_DATA_ROOT" \
DATASETS="$SEGMENTATION_DATASETS" \
DATA_TYPE="$SEGMENTATION_DATA_TYPE" \
PROMPT_MODE="$SEGMENTATION_PROMPT_MODE" \
ENABLE_THINKING="$SEGMENTATION_ENABLE_THINKING" \
BATCH_SIZE="$SEGMENTATION_BATCH_SIZE" \
MAX_NEW_TOKENS="$SEGMENTATION_MAX_NEW_TOKENS" \
MAX_MODEL_LEN="$SEGMENTATION_MAX_MODEL_LEN" \
MAX_PIXELS_IMAGE="$SEGMENTATION_MAX_PIXELS_IMAGE" \
MIN_PIXELS_IMAGE="$SEGMENTATION_MIN_PIXELS_IMAGE" \
VIDEO_MAX_PIXELS="$SEGMENTATION_VIDEO_MAX_PIXELS" \
VIDEO_MIN_PIXELS="$SEGMENTATION_VIDEO_MIN_PIXELS" \
VIDEO_TOTAL_PIXELS="$SEGMENTATION_VIDEO_TOTAL_PIXELS" \
MAX_FRAMES="$SEGMENTATION_MAX_FRAMES" \
FPS="$SEGMENTATION_FPS" \
VIDEO_READER="$SEGMENTATION_VIDEO_READER" \
TP_SIZE="$TP_SIZE" \
GPU_MEM_UTIL="$SEGMENTATION_GPU_MEM_UTIL" \
SEED="$SEGMENTATION_SEED" \
MAX_SAMPLES="$SEGMENTATION_MAX_SAMPLES" \
RUN_SAM2="$SEGMENTATION_RUN_SAM2" \
SAM2_CKPT="$SEGMENTATION_SAM2_CKPT" \
SAM2_CFG="$SEGMENTATION_SAM2_CFG" \
ONETHINKER_SEG_POST="$SEGMENTATION_POSTPROCESSOR_PATH" \
SAM2_NUM_GPUS="$SEGMENTATION_SAM2_NUM_GPUS" \
SAM2_WORKERS_PER_GPU="$SEGMENTATION_SAM2_WORKERS_PER_GPU" \
bash eval/task/segmentation/run_eval_vllm.sh \
"$MODEL_PATH" \
"$SEG_RUN_ROOT"
fi