ToiTenBao's picture
Upload hallucination folder
a2ffd07 verified
Raw
History Blame Contribute Delete
4.65 kB
#!/usr/bin/env bash
# =============================================================================
# Baseline: VisEdit (VEAD)
# =============================================================================
# Vision-attribution-guided adaptor editing (AAAI 2025).
# Trains a cross-attention adaptor at LLM layers guided by influence tracing
# over image patches to suppress hallucinations.
#
# Uses the same data source, prompts, and sample selection as DualEdit:
# - caption_targets.json (not edit_set.json)
# - prompt: "Describe this image."
# - split: val (hallucinating bathroom_no_toilet images)
#
# REQUIREMENTS:
# - Two GPUs (or one GPU with ≥ 32 GB VRAM): VisEdit loads two copies of
# LLaVA-1.5-7b simultaneously during training (main + data-preprocessing).
# - Set PROC_DEVICE to the second GPU (default: cuda:1).
#
# Usage:
# bash experiment/scripts/baselines/run_visedit.sh
# bash experiment/scripts/baselines/run_visedit.sh --skip_train # eval only
#
# Override knobs:
# EPOCHS=500 BATCH_SIZE=4 bash experiment/scripts/baselines/run_visedit.sh
# PROC_DEVICE=cuda:0 bash ... # single-GPU (may OOM)
# SPLIT=train bash ... # use train split instead of val
# =============================================================================
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
source "${SCRIPT_DIR}/_common.sh"
OUTPUT_DIR="${OUTPUT_DIR:-./step4_baseline_outputs/visedit}"
EVAL_OUTPUT_DIR="${EVAL_OUTPUT_DIR:-./step4_baseline_outputs/visedit_eval}"
PROC_DEVICE="${PROC_DEVICE:-cuda:1}"
EPOCHS="${EPOCHS:-500}"
BATCH_SIZE="${BATCH_SIZE:-1}"
SAVE_PER="${SAVE_PER:-100}"
SKIP_TRAIN=0
while [[ $# -gt 0 ]]; do
case $1 in
--skip_train) SKIP_TRAIN=1; shift ;;
*) echo "Unknown arg: $1"; exit 1 ;;
esac
done
echo "=========================================="
echo "Baseline: VisEdit (VEAD)"
echo " Vision-attribution-guided adaptor editing"
echo " Paper: AAAI 2025 (Oral)"
echo "=========================================="
echo "Data:"
echo " Edit set: ${EDIT_SET}"
echo " Dataset: ${DATASET_ID}"
echo " Output dir: ${OUTPUT_DIR}"
echo ""
echo "Config:"
echo " Epochs: ${EPOCHS}"
echo " Batch size: ${BATCH_SIZE}"
echo " Device: ${DEVICE} (training model)"
echo " Proc device: ${PROC_DEVICE} (data-preprocessing model)"
echo "=========================================="
mkdir -p "${OUTPUT_DIR}"
RUN_CONFIG="${OUTPUT_DIR}/run_config.json"
# =============================================================================
# Training
# =============================================================================
if [[ $SKIP_TRAIN -eq 0 ]]; then
ensure_edit_set
echo ""
echo ">>> Running VisEdit (VEAD) training..."
echo "================================"
python -m experiment.knowledge_editing.run_visedit \
--edit_set "$EDIT_SET" \
--output_dir "$OUTPUT_DIR" \
--dataset_id "$DATASET_ID" \
--model_name "$BASE_MODEL" \
--device "$DEVICE" \
--proc_device "$PROC_DEVICE" \
--epochs "$EPOCHS" \
--batch_size "$BATCH_SIZE" \
--save_per "$SAVE_PER"
else
echo ">>> Skipping training (--skip_train)"
fi
if [ ! -f "$RUN_CONFIG" ]; then
echo "ERROR: run_config.json not found at ${RUN_CONFIG}"
exit 1
fi
CHECKPOINT=$(python -c "import json; d=json.load(open('${RUN_CONFIG}')); print(d.get('checkpoint') or '')" 2>/dev/null)
EVAL_TARGETS=$(python -c "import json; d=json.load(open('${RUN_CONFIG}')); print(d.get('eval_targets') or '')" 2>/dev/null)
if [ -z "$CHECKPOINT" ] || [ ! -f "$CHECKPOINT" ]; then
echo "ERROR: No valid checkpoint found in ${RUN_CONFIG}"
echo " checkpoint=${CHECKPOINT}"
exit 1
fi
echo ""
echo ">>> Using VisEdit checkpoint: ${CHECKPOINT}"
# =============================================================================
# Evaluate via the shared eval pipeline
# =============================================================================
echo ""
echo ">>> Running Validation..."
echo "================================"
EXTRA_ARGS=()
if [ -n "$EVAL_TARGETS" ] && [ -f "$EVAL_TARGETS" ]; then
EXTRA_ARGS+=(--edit_targets "$EVAL_TARGETS")
echo " Edit targets: ${EVAL_TARGETS}"
fi
run_eval "visedit" "${CHECKPOINT}" "${EVAL_OUTPUT_DIR}" "VisEdit" "${EXTRA_ARGS[@]}"
echo ""
echo "=========================================="
echo "VisEdit Complete!"
echo "=========================================="
echo "Outputs:"
echo " Training run: ${OUTPUT_DIR}/"
echo " Checkpoint: ${CHECKPOINT}"
echo " Evaluation: ${EVAL_OUTPUT_DIR}/"
echo "=========================================="