# Find Model

根据用户描述，找到对应的模型训练脚本、checkpoint 或评测结果路径。

## Usage Examples

```bash
# 通过关键词描述
/find-model bd16 block causal
/find-model j63 math anneal
/find-model sharegpt4v entropy loss
/find-model ar baseline  # AR 模型
/find-model 原版 qwen  # 原版预训练模型

# 通过特定属性
/find-model lr=1e-5 bd=16
/find-model 8node unfreeze vision

# 模糊搜索
/find-model 最新的 bd32 实验
/find-model sharegpt4v 最好的结果
```

## Execution Steps

### Step 1: Parse User Description

提取关键词和属性：
- **模型类型**: ar_baseline (AR), mdm (MDM with bd_size)
- **bd_size**: bd4, bd8, bd16, bd32
- **lr**: 1e-5, 1e-6, 5e-7
- **dataset**: sharegpt4v, j63, j63_math
- **mode**: block_causal, flexible, anneal
- **特殊标记**: entropy_loss, fix_eos, unfreeze_vision
- **节点数**: 8node, 2node
- **原版模型**: qwen, original, pretrain, instruct

### Step 2: Search Locations

按优先级搜索以下位置：

```bash
# 0. VLMEvalKit 目录（优先 third_party）
VLM_DIR="third_party/VLMEvalKit"
[ -d "$VLM_DIR" ] || VLM_DIR="VLMEvalKit_local"

# 1. 训练脚本 (必须搜索并显示)
find chengyue_script/dvlm/training -name "*<keywords>*.sh" 2>/dev/null

# 2. 训练输出目录
ls -d output_models/*<keywords>*

# 3. VLMEvalKit 评测结果
ls -d "$VLM_DIR"/output_models/*<keywords>*

# 4. 原版预训练模型 (HuggingFace)
# Qwen/Qwen2.5-VL-3B-Instruct, Qwen/Qwen2.5-VL-7B-Instruct
```

### Step 3: Detect Model Type (AR vs MDM)

**重要**: 区分 AR 和 MDM 模型，因为它们的评测方式不同。

检测方法：
```bash
# 检查 config.json 中的 bd_size
python3 -c "import json; c=json.load(open('output_models/{exp}/checkpoint-*/config.json')); print('MDM' if c.get('bd_size') else 'AR')"
```

| 模型类型 | 特征 | 评测方式 |
|----------|------|----------|
| **MDM** | config 有 `bd_size` (非 None) | `USE_MDM=1` |
| **AR** | config 无 `bd_size` 或为 None | `USE_MDM=0` 或用 lmms-eval |
| **原版** | HuggingFace 模型 | lmms-eval |

### Step 4: Output Results

返回格式：

```
## 找到的模型

### 1. [最佳匹配] {exp_name}

**模型类型**: MDM (bd_size=16) / AR (autoregressive) / 原版预训练

**匹配原因**:
- ✅ bd_size=16 (用户指定)
- ✅ block_causal (用户指定)
- ✅ lr=1e-6 (默认学习率)
- ✅ 有完整评测结果

**路径**:
| 类型 | 路径 |
|------|------|
| 训练脚本 | `chengyue_script/dvlm/training/multinode/mdm/sharegpt4v/.../train_xxx.sh` |
| Checkpoint | `output_models/{exp_name}/checkpoint-{latest}` |
| 评测结果 | `VLM_DIR/output_models/{exp_name}/checkpoint_results.md` |

**训练脚本内容** (关键配置):
```bash
# 从脚本中提取的关键参数
MODEL_PATH=...
BD_SIZE=16
LR=1e-6
BATCH=1
GRAD_ACC=4
USE_BLOCK_CAUSAL_MASK=1
ANNEAL_BLOCK_SIZE=1
```

**状态**:
- Checkpoint 数量: 50 个
- 最新 checkpoint: checkpoint-2500
- 评测完成: 是 (Avg: 73.7%)

**评测命令** (如果需要重新评测):
```bash
# MDM 模型
bash chengyue_script/dvlm/evaluation/submit_batch_eval.sh output_models/{exp_name} --skip-existing 1

# AR 模型 (需要 USE_MDM=0)
USE_MDM=0 bash chengyue_script/dvlm/evaluation/submit_batch_eval.sh output_models/{exp_name}

# 原版模型
MODEL_PATH=Qwen/Qwen2.5-VL-3B-Instruct bash chengyue_script/dvlm/evaluation/lmms_eval/eval_lmms.sh gqa mmmu
```

---

### 2. [次要匹配] {exp_name_2}
...
```

## Step 5: Extract Key Config from Training Script

从训练脚本中提取并显示关键配置：

```bash
# 提取关键参数
grep -E "^(MODEL_PATH|BD_SIZE|LR|BATCH|GRAD_ACC|EPOCHS|USE_BLOCK_CAUSAL_MASK|ANNEAL_BLOCK_SIZE|FLEXIBLE_BD_SIZE|DATASET_PATH)=" {script_path}

# 或者提取 RUN_ID
grep 'RUN_ID=' {script_path}
```

显示的关键参数：
- `MODEL_PATH` - 基础模型路径
- `BD_SIZE` - block diffusion size
- `LR` - 学习率
- `BATCH` / `GRAD_ACC` - batch size 配置
- `USE_BLOCK_CAUSAL_MASK` - 是否使用 block causal mask
- `ANNEAL_BLOCK_SIZE` - 是否 anneal block size
- `DATASET_PATH` - 数据集

## Search Patterns

### 常见实验命名规则

```
{dataset}_{nodes}node_bsz{batch_size}[_anneal]_bd{bd_size}[_fix_eos][_flexible|_block_causal]_lr_{lr}[_unfreeze_vision][_entropy_loss]
```

示例：
- `sharegpt4v_8node_bsz256_anneal_bd16_block_causal_lr_1e-6_unfreeze_vision` (MDM)
- `j63_math_8node_bsz256_anneal_bd32_block_causal_lr_1e-6_unfreeze_vision` (MDM)
- `sharegpt4v_ar_baseline_8node_bsz256_lr_1e-6` (AR)

### 关键词映射

| 用户输入 | 匹配模式 | 模型类型 |
|----------|----------|----------|
| ar, ar_baseline, autoregressive | `*ar_baseline*` | AR |
| bd16, block size 16 | `*bd16*` | MDM |
| block causal, causal mask | `*block_causal*` | MDM |
| flexible, dynamic | `*flexible*` 或 `*dynamic*` | MDM |
| anneal, annealing | `*anneal*` | MDM |
| entropy, entropy loss | `*entropy_loss*` | MDM |
| j63, joint 63 | `*j63*` | - |
| math, mathematics | `*math*` | - |
| sharegpt, sharegpt4v | `*sharegpt4v*` | - |
| qwen, original, 原版, pretrain | HuggingFace | 原版 |

## Key Directories

| 目录 | 内容 |
|------|------|
| `chengyue_script/dvlm/training/multinode/mdm/` | MDM 训练脚本 |
| `chengyue_script/dvlm/training/multinode/ar/` | AR baseline 训练脚本 |
| `output_models/` | 训练 checkpoint |
| `VLM_DIR/output_models/` | 评测结果 |

## Known Models

### 原版预训练模型 (HuggingFace)
- `Qwen/Qwen2.5-VL-3B-Instruct` - 3B 参数
- `Qwen/Qwen2.5-VL-7B-Instruct` - 7B 参数

### AR Baseline
- `sharegpt4v_ar_baseline_8node_bsz256_lr_1e-6` - ShareGPT4V AR baseline

## Anti-Hallucination

- **必须** 使用 `ls` 或 `find` 验证路径存在
- **不要** 猜测实验名称，必须从实际文件系统读取
- 如果找不到匹配，明确告知用户并建议可能的替代搜索词
- **检测模型类型**: 读取 config.json 确认是 AR 还是 MDM
- **必须显示训练脚本**: 搜索并显示对应的 .sh 训练脚本路径和关键配置
