File size: 2,792 Bytes
b57d99f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/usr/bin/env bash
# Patch 분류 벤치(pcam/crc/bach)를 kaiko-eva로 frozen-encoder linear probe.
# 참조 FM과 OpenPath를 동일 프로토콜로 비교.
#   model: openpath|openmidnight|phikon|uni|uni2|gigapath|virchow2
#   bench: pcam|crc|bach
# 사용: [GPU=0] [N_RUNS=5] bash eval/run_patch_eval.sh <model> <bench> [weights]
#   openpath는 weights(teacher_checkpoint.pth) 필수. eva·timm·데이터셋은 사전 설치/다운로드 필요.
set -u
R="${OPENPATH_ROOT:-$(cd "$(dirname "$0")/.." && pwd)}"    # repo 루트(eval/의 상위)
cd "$R"
export PYTHONPATH="$R/OpenPath:$R/eval"                     # dinov2(OpenPath/) + backbone(eval/)
export CUDA_VISIBLE_DEVICES="${GPU:-0}"                     # eva는 단일 GPU 권장
export N_RUNS="${N_RUNS:-5}"
export ACCELERATOR=gpu NUM_DEVICES=1 OPENPATH_WEIGHTS="${3:-none}"
export PREDICT_BATCH_SIZE="${PREDICT_BATCH_SIZE:-512}" BATCH_SIZE="${BATCH_SIZE:-4096}" N_DATA_WORKERS="${N_DATA_WORKERS:-8}"
model="$1"; bench="$2"

case "$model" in
  openpath)     export BACKBONE_FN=openpath_eva_backbone.build_openpath      IN_FEATURES=1536 ;;
  openmidnight) export BACKBONE_FN=openpath_eva_backbone.build_openmidnight  IN_FEATURES=1536 ;;
  phikon)       export BACKBONE_FN=openpath_eva_backbone.build_phikon        IN_FEATURES=1024 ;;
  uni)          export BACKBONE_FN=openpath_eva_backbone.build_uni           IN_FEATURES=1024 ;;
  uni2)         export BACKBONE_FN=openpath_eva_backbone.build_uni2          IN_FEATURES=1536 ;;
  gigapath)     export BACKBONE_FN=openpath_eva_backbone.build_gigapath      IN_FEATURES=1536 ;;
  virchow2)     export BACKBONE_FN=openpath_eva_backbone.build_virchow2      IN_FEATURES=1280 ;;
  *) echo "unknown model $model (openpath|openmidnight|phikon|uni|uni2|gigapath|virchow2)"; exit 1 ;;
esac
export MODEL_NAME="${MODEL_NAME:-$model}"

case "$bench" in
  pcam) cfg=eval/eva_configs/patch_camelyon.yaml; export DATA_ROOT="$R/data/eva/pcam_h5" DOWNLOAD_DATA="${DL:-true}" ;;
  crc)  cfg=eval/eva_configs/crc.yaml;            export DATA_ROOT="$R/data/eva/crc"     DOWNLOAD_DATA=false ;;
  bach) cfg=eval/eva_configs/bach.yaml;           export DATA_ROOT="$R/data/eva/bach"    DOWNLOAD_DATA="${DL:-false}" ;;
  *) echo "unknown bench $bench (pcam|crc|bach)"; exit 1 ;;
esac

# eva predict_fit는 임베딩 출력폴더가 있으면 거부 → 매 실행 전 정리(fresh 추출).
# eva 임베딩 폴더명은 데이터셋명: pcam→patch_camelyon.
evadir="$bench"; [ "$bench" = pcam ] && evadir=patch_camelyon
rm -rf "$R/data/embeddings/$MODEL_NAME/$evadir" 2>/dev/null

echo "=== EVAL $model × $bench | IN=$IN_FEATURES N_RUNS=$N_RUNS GPU=$CUDA_VISIBLE_DEVICES DATA_ROOT=$DATA_ROOT DL=$DOWNLOAD_DATA | $(date) ==="
eva predict_fit --config "$cfg"
echo "=== DONE $model × $bench | $(date) ==="