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[@]}" |