File size: 5,833 Bytes
533920b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#!/usr/bin/env bash
set -euo pipefail
# bash examples.sh
if [[ -n "${TERM:-}" ]]; then
    clear
fi
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

# Shared HF cache used on this cluster.
HF_HUB_CACHE_DIR="${HF_HUB_CACHE_DIR:-/scratch/rr81/ma5430/.cache/huggingface/hub}"
export HF_HUB_CACHE="$HF_HUB_CACHE_DIR"
export HUGGINGFACE_HUB_CACHE="$HF_HUB_CACHE_DIR"
export HF_HOME="$(dirname "$HF_HUB_CACHE_DIR")"

# GPU nodes have no internet, while login nodes do.
# Auto default: offline on GPU nodes, online on login nodes.
DEFAULT_OFFLINE_MODE="1"
if ! (command -v nvidia-smi >/dev/null 2>&1 && nvidia-smi -L >/dev/null 2>&1); then
    DEFAULT_OFFLINE_MODE="0"
fi
OFFLINE_MODE="${OFFLINE_MODE:-$DEFAULT_OFFLINE_MODE}"

if [[ "$OFFLINE_MODE" == "1" ]]; then
    export HF_DATASETS_OFFLINE="1"
    export HF_METRICS_OFFLINE="1"
    export HF_MODULES_OFFLINE="1"
    export TRANSFORMERS_OFFLINE="1"
    export DIFFUSERS_OFFLINE="1"
    export HF_HUB_OFFLINE="1"
else
    export HF_DATASETS_OFFLINE="0"
    export HF_METRICS_OFFLINE="0"
    export HF_MODULES_OFFLINE="0"
    export TRANSFORMERS_OFFLINE="0"
    export DIFFUSERS_OFFLINE="0"
    export HF_HUB_OFFLINE="0"
fi

# Existing environment requested by user.
PYTHON_BIN="${PYTHON_BIN:-/g/data/rr81/aev/bin/python}"
if [[ ! -x "$PYTHON_BIN" ]]; then
    echo "[examples.sh] Missing Python executable: $PYTHON_BIN" >&2
    exit 1
fi

DATASET_NAME="${DATASET_NAME:-pickapic}"      # coco | pickapic
GRAD_CONFIG="${GRAD_CONFIG:-one_step_rectification_config}"
MODEL_PROFILE="${MODEL_PROFILE:-sana_600m_512}"  # sana_600m_512 | sana_1600m_512 | sana_sprint_0_6b_1024 | sana_sprint_1_6b_1024
MODE="${MODE:-gradient_ascent}"               # gradient_ascent | baseline | both
# Empty MAX_SAMPLES means evaluate all available samples.
MAX_SAMPLES="${MAX_SAMPLES:-}"
NUM_STEPS="${NUM_STEPS:-20}"
CFG_SCALE="${CFG_SCALE:-4.5}"
DTYPE="${DTYPE:-bf16}"                    # auto | bf16 | fp16 | fp32
METRICS="${METRICS:-clip aesthetic pickscore hpsv2 hpsv21 imagereward}"
PREFETCH_ONLY="${PREFETCH_ONLY:-0}"

# Override this path whenever you want to swap reward weights.
# LRM_MODEL_PATH="${LRM_MODEL_PATH:-/g/data/rr81/LPO/lrm/lrm_sana/logs/v8/reward_model/step_sana_sana_600m_512_variable-t_lr1e-5_step-8000_filter2_time951/checkpoint-gstep33000}"
LRM_MODEL_PATH="${LRM_MODEL_PATH:-/g/data/rr81/LPO/lrm/lrm_sana/logs/v7/reward_model/step_sana_sana_600m_512_variable-t_lr1e-5_step-8000_filter2_time951/checkpoint-gstep32000}"

if [[ -z "${GPU_ID:-}" ]]; then
    if command -v nvidia-smi >/dev/null 2>&1 && nvidia-smi -L >/dev/null 2>&1; then
        GPU_ID="$(nvidia-smi --query-gpu=index,memory.used --format=csv,noheader,nounits | sort -k2 -n | head -n1 | cut -d',' -f1 | tr -d ' ')"
        GPU_ID="${GPU_ID:-0}"
    else
        GPU_ID="0"
        echo "[examples.sh] No visible NVIDIA GPU on this node. Defaulting GPU_ID=0."
        echo "[examples.sh] eval.py will run on CPU if CUDA is unavailable."
    fi
fi

echo "Using GPU ID: $GPU_ID"
echo "Using LRM weights: $LRM_MODEL_PATH"
echo "HF offline mode: $OFFLINE_MODE"
echo "Generation dtype: $DTYPE"

if [[ "$PREFETCH_ONLY" == "1" ]]; then
    echo "[examples.sh] PREFETCH_ONLY=1 -> downloading required model files to shared cache and exiting."
    export MODEL_PROFILE
    export METRICS
    "$PYTHON_BIN" - <<'PY'
import os
from huggingface_hub import hf_hub_download, snapshot_download

cache_dir = os.environ["HF_HUB_CACHE"]
model_profile = os.environ.get("MODEL_PROFILE", "sana_600m_512")
metrics = set(os.environ.get("METRICS", "clip aesthetic").split())

profile_to_repo = {
    "sana_600m_512": "Efficient-Large-Model/Sana_600M_512px_diffusers",
    "sana_1600m_512": "Efficient-Large-Model/Sana_1600M_512px_diffusers",
    "sana_sprint_0_6b_1024": "Efficient-Large-Model/Sana_Sprint_0.6B_1024px_diffusers",
    "sana_sprint_1_6b_1024": "Efficient-Large-Model/Sana_Sprint_1.6B_1024px_diffusers",
}

def snap(repo_id):
    print(f"[prefetch] snapshot_download: {repo_id}")
    snapshot_download(repo_id=repo_id, cache_dir=cache_dir, local_files_only=False)

def one(repo_id, filename):
    print(f"[prefetch] hf_hub_download: {repo_id}/{filename}")
    hf_hub_download(repo_id=repo_id, filename=filename, cache_dir=cache_dir, local_files_only=False)

if model_profile not in profile_to_repo:
    raise ValueError(f"Unknown MODEL_PROFILE={model_profile}")

# Base SANA model used for generation + reward backbone
snap(profile_to_repo[model_profile])

# Required for CLIP-based metrics and LRM text projection init fallback
if "clip" in metrics or "aesthetic" in metrics:
    snap("openai/clip-vit-large-patch14")

if "pickscore" in metrics:
    snap("laion/CLIP-ViT-H-14-laion2B-s32B-b79K")
    snap("yuvalkirstain/PickScore_v1")

if "hpsv2" in metrics or "hpsv21" in metrics:
    one("laion/CLIP-ViT-H-14-laion2B-s32B-b79K", "open_clip_pytorch_model.bin")
if "hpsv2" in metrics:
    one("xswu/HPSv2", "HPS_v2_compressed.pt")
if "hpsv21" in metrics:
    one("xswu/HPSv2", "HPS_v2.1_compressed.pt")

if "imagereward" in metrics:
    one("THUDM/ImageReward", "ImageReward.pt")
    one("THUDM/ImageReward", "med_config.json")

print("[prefetch] done")
PY
    exit 0
fi

read -r -a METRICS_ARR <<< "$METRICS"

CMD=(
    "$PYTHON_BIN" eval.py
    --model_variant "$MODEL_PROFILE"
    --dataset_type "$DATASET_NAME"
    --lrm_model "$LRM_MODEL_PATH"
    --grad_config "$GRAD_CONFIG"
    --metrics "${METRICS_ARR[@]}"
    --num_steps "$NUM_STEPS"
    --cfg_scale "$CFG_SCALE"
    --dtype "$DTYPE"
    --hf_cache_dir "$HF_HUB_CACHE_DIR"
    --output_dir "RESULTS/$DATASET_NAME/${GRAD_CONFIG}_${MODEL_PROFILE}"
    --cuda "$GPU_ID"
    --mode "$MODE"
)

if [[ -n "$MAX_SAMPLES" ]]; then
    CMD+=(--max_samples "$MAX_SAMPLES")
fi

if [[ "$OFFLINE_MODE" == "1" ]]; then
    CMD+=(--offline)
fi

"${CMD[@]}"