File size: 7,118 Bytes
2e7f2ce
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#!/bin/bash
# =============================================================
# VoRA Evaluation Runner (打包版)
# =============================================================
#
# ========== 使用教程 ==========
#
# 1. 把 eval_pack/ 整个文件夹传到目标机器
#
# 2. 创建 conda 环境 (一次性):
#      conda create -n eval python=3.10 -y
#      conda activate eval
#      cd eval_pack
#      pip install -r requirements_eval.txt
#
# 3. 修改下方「路径配置」部分:
#      - QWEN_MODEL:      Qwen2.5-7B-Instruct 路径
#      - QWEN_VL_MODEL:   Qwen2.5-VL-3B-Instruct 路径
#      - AIMV2_PATH:      aimv2-huge-patch14-448 路径
#      - VORA_CIRC_MERGED: VoRA-Circulant merged 模型路径
#
# 4. 修改 data/eval_qwenvl.jsonl 中的图片绝对路径:
#      sed -i 's|/share/home/jcdl1lsy2clx/VoRA/data_dir/VoRA-Recap-29M/frames|/你的/frames路径|g' data/eval_qwenvl.jsonl
#
#    data/eval_vora.jsonl 用的是相对路径 (frames/xxx.jpg),
#    确保从 eval_pack/ 目录能访问到 frames/ 文件夹:
#      ln -s /你的/frames路径 frames
#
# 5. 运行:
#      conda activate eval
#      cd eval_pack
#      bash eval/run_eval.sh
#
# 6. 结果会打印表格并保存到 eval/results/*.json
#
# ========== 目录结构 ==========
#
#   eval_pack/
#   ├── eval/                <- 评测脚本
#   ├── models/              <- VoRA 模型代码
#   ├── tools/               <- merge_lora.py
#   ├── generation_files/    <- tokenizer/processor
#   ├── data/
#   │   ├── eval_vora.jsonl  <- VoRA 系列用 (相对路径)
#   │   └── eval_qwenvl.jsonl <- Qwen-VL 系列用 (绝对路径)
#   ├── vora_merged_250/     <- VoRA merged (~32G)
#   ├── lora_merged/         <- Qwen-VL+LoRA merged (~7G)
#   ├── circulant_merged/    <- Qwen-VL+Circulant merged (~7G)
#   └── requirements_eval.txt
#
# =============================================================

set -e
cd "$(dirname "$0")/.."

# ---------- 路径配置 (根据你的环境修改) ----------
# 基线模型 (另一台机器上已有)
QWEN_MODEL="/path/to/Qwen2.5-7B-Instruct"
QWEN_VL_MODEL="/path/to/Qwen2.5-VL-3B-Instruct"
AIMV2_PATH="/path/to/aimv2-huge-patch14-448"

# 评测数据
EVAL_DATA_VORA="data/eval_vora.jsonl"       # VoRA 系列用 (相对路径 frames/xxx.jpg)
EVAL_DATA_QWEN="data/eval_qwenvl.jsonl"     # Qwen-VL 系列用 (绝对路径, 需要按目标机器修改)

DTYPE="float16"
RESULTS_DIR="eval/results"

# 已 merge 好的模型
VORA_MERGED="vora_merged_250"
VORA_CIRC_MERGED="/path/to/vora-circulant-merged"
LORA_MERGED="lora_merged"
CIRC_MERGED="circulant_merged"
# -----------------------------------------------

mkdir -p "$RESULTS_DIR"

pip install nltk rouge-score qwen-vl-utils 2>/dev/null || true
python -c "import nltk; nltk.download('punkt', quiet=True); nltk.download('punkt_tab', quiet=True)" 2>/dev/null || true

echo ""
echo "=============================================="
echo "  Step 1: Qwen2.5-7B Text-Only Baseline"
echo "=============================================="
python eval/eval_qwen_baseline.py \
    --mode all \
    --model-path "$QWEN_MODEL" \
    --eval-data "$EVAL_DATA_QWEN" \
    --max-samples 200 \
    --max-new-tokens 256 \
    --dtype "$DTYPE" \
    --output "$RESULTS_DIR/qwen_baseline.json"

echo ""
echo "=============================================="
echo "  Step 2: VoRA Full Eval"
echo "=============================================="
python eval/eval_vora.py \
    --mode all \
    --checkpoint "$VORA_MERGED" \
    --merged \
    --eval-data "$EVAL_DATA_VORA" \
    --image-processor "$AIMV2_PATH" \
    --max-samples 200 \
    --max-new-tokens 256 \
    --dtype "$DTYPE" \
    --output "$RESULTS_DIR/vora_best.json"

echo ""
echo "=============================================="
echo "  Step 3: VoRA-Circulant Full Eval"
echo "=============================================="
python eval/eval_vora.py \
    --mode all \
    --checkpoint "$VORA_CIRC_MERGED" \
    --merged \
    --eval-data "$EVAL_DATA_VORA" \
    --image-processor "$AIMV2_PATH" \
    --max-samples 200 \
    --max-new-tokens 256 \
    --dtype "$DTYPE" \
    --output "$RESULTS_DIR/vora_circulant.json"

echo ""
echo "=============================================="
echo "  Step 4: Qwen2.5-VL-3B Original Baseline"
echo "=============================================="
python eval/eval_qwen_vl.py \
    --mode all \
    --model-path "$QWEN_VL_MODEL" \
    --eval-data "$EVAL_DATA_QWEN" \
    --max-samples 200 \
    --max-new-tokens 256 \
    --dtype "$DTYPE" \
    --output "$RESULTS_DIR/qwen_vl_original.json"

echo ""
echo "=============================================="
echo "  Step 5: Qwen2.5-VL-3B + LoRA"
echo "=============================================="
if [ -d "$LORA_MERGED" ]; then
    python eval/eval_qwen_vl.py \
        --mode all \
        --model-path "$LORA_MERGED" \
        --eval-data "$EVAL_DATA_QWEN" \
        --max-samples 200 \
        --max-new-tokens 256 \
        --dtype "$DTYPE" \
        --output "$RESULTS_DIR/qwen_vl_lora.json"
else
    echo "LoRA merged model not found at $LORA_MERGED, skipping."
fi

echo ""
echo "=============================================="
echo "  Step 6: Qwen2.5-VL-3B + Block-Circulant"
echo "=============================================="
if [ -d "$CIRC_MERGED" ]; then
    python eval/eval_qwen_vl.py \
        --mode all \
        --model-path "$CIRC_MERGED" \
        --eval-data "$EVAL_DATA_QWEN" \
        --max-samples 200 \
        --max-new-tokens 256 \
        --dtype "$DTYPE" \
        --output "$RESULTS_DIR/qwen_vl_circulant.json"
else
    echo "Block-Circulant merged model not found at $CIRC_MERGED, skipping."
fi

echo ""
echo "=============================================="
echo "  Summary"
echo "=============================================="
python -c "
import json, os, math

results_dir = '$RESULTS_DIR'

print('='*70)
print(f'{\"Model\":<35} {\"Loss\":>10} {\"PPL\":>8} {\"BLEU-4\":>8} {\"ROUGE-L\":>8}')
print('-'*70)

def print_row(name, filepath):
    if not os.path.exists(filepath):
        return
    r = json.load(open(filepath))
    ppl = r.get('perplexity', None)
    loss = math.log(ppl) if ppl and ppl != float('inf') else None
    b4 = r.get('BLEU-4', None)
    rl = r.get('ROUGE-L', None)
    loss_s = f'{loss:.4f}' if loss else '-'
    ppl_s = f'{ppl:.2f}' if ppl else '-'
    b4_s = f'{b4:.4f}' if b4 else '-'
    rl_s = f'{rl:.4f}' if rl else '-'
    print(f'{name:<35} {loss_s:>10} {ppl_s:>8} {b4_s:>8} {rl_s:>8}')

print_row('Qwen2.5-7B (text-only)', os.path.join(results_dir, 'qwen_baseline.json'))
print_row('VoRA', os.path.join(results_dir, 'vora_best.json'))
print_row('VoRA-Circulant', os.path.join(results_dir, 'vora_circulant.json'))

print('-'*70)

print_row('Qwen2.5-VL-3B (original)', os.path.join(results_dir, 'qwen_vl_original.json'))
print_row('Qwen2.5-VL-3B + LoRA', os.path.join(results_dir, 'qwen_vl_lora.json'))
print_row('Qwen2.5-VL-3B + Circulant', os.path.join(results_dir, 'qwen_vl_circulant.json'))

print('='*70)
"

echo ""
echo "All results saved to \$RESULTS_DIR/"
echo "Done!"