#!/usr/bin/env bash # v0.2.1 n=60 harness on a CUDA GPU host. The v0.1-vs-v0.2 comparison showed v0.2 lost frontier # strength by moving DINOv2+InternViT out of the attack. v0.2.1 puts the FULL ensemble # back in the attack and adds SEPARATE never-trained cross-arch judges (C-RADIO # agglomerative + Qwen3-VL captioner tower). Two decisive cells: # 1. v021_base — 13-tower attack (v0.1 ensemble), M4 ON [recovers v0.1 strength] # 2. v021_giants — +SigLIP2-giant +MetaCLIP2-H (15-tower), M4 ON [ablation-gate the adds] # Both scored on the SAME cross-arch held-out judges + written for frontier eval. set -u cd ~/workspace/veil-pgd . .venv/bin/activate export HF_HOME=${HF_HOME:-~/.cache/huggingface} # Set HF_TOKEN in your environment if any gated encoders require authentication. export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True COMMON="--manifest examples/testset60.csv --images examples/testset60 \ --exemplars examples/exemplars --decoys v0.2 \ --steps 120 --eps 6 --subset 6 --grad-norm --max-per-family 2 --min-feature 1 --metrics" echo "=== [$(date +%H:%M:%S)] CELL 1/2 v021_base (13-tower attack, M4 ON) ===" python -u -m ensemble.run_attack $COMMON --train v0.2.1-base --out runs/v021_base echo "=== [$(date +%H:%M:%S)] CELL 2/2 v021_giants (15-tower attack +giants, M4 ON) ===" python -u -m ensemble.run_attack $COMMON --train v0.2.1 --out runs/v021_giants echo "=== [$(date +%H:%M:%S)] ALL CELLS DONE ==="