| #!/bin/bash |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| 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" |
| EVAL_DATA_QWEN="data/eval_qwenvl.jsonl" |
|
|
| DTYPE="float16" |
| RESULTS_DIR="eval/results" |
|
|
| |
| 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!" |
|
|