YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
czw2026_Track1_FinalPhase_Submission 说明
以下路径均以当前目录 ./czw2026_Track1_FinalPhase_Submission 为基准。先进入 czw2026_Track1_FinalPhase_Submission 再执行命令:
cd ./czw2026_Track1_FinalPhase_Submission
1. 快速复现
1.1 配环境
conda create -n IQA python=3.10.19 -y
conda activate IQA
cd ms-swift
chmod u+x ./requirements/install_all.sh
./requirements/install_all.sh
pip install -e .
cd ..
1.2 推理
# Phase2
bash ./scripts/infer_phase_2.sh
# Phase3
bash ./scripts/infer_phase_3.sh
脚本会进行:
- 读取三个专家模型目录:
./Checkpoints/MOE_1、./Checkpoints/MOE_2、./Checkpoints/MOE_3,通过一个投票系统,将这三个专家模型的预测结果进行集成,以达到更好、更鲁棒的结果 - 使用phase2和phase3的数据集:
./Datas/val_infer_1536_split_zoom_images.jsonl和./Datas/final_infer_1536_split_zoom_images.jsonl - 将单专家模型原始输出保存到
./Output/Phase_2/raw和./Output/Phase_3/raw - 将单专家模型规范结果保存到
./Output/Phase_2/predictions_MOE_*.jsonl和./Output/Phase_3/predictions_MOE_*.jsonl - 将这三个专家模型结果集成,投票融合为
./Output/Phase_2/predictions.jsonl和./Output/Phase_3/predictions.jsonl
在系统上提交,结果大致为:
| Phase | Final Score | Accuracy |
|---|---|---|
| Phase2 | 0.649 | 0.8627 |
| Phase3 | 0.5311 | 0.703 |
1.3 训练
- 模型介绍
- 模型以Qwen3-VL-8B为基础模型,进行四阶段的层级训练
- 最终将三个较优的专家模型的预测结果进行集成,得到最终的预测结果
- 实验细节
算力设备:8卡 NVIDIA A800-SXM4-40GB
训练数据集处理
- 我们对官方的提供的原始图片格式进行切割。将merged大图切割为两张单独的小图。同时,我们通过实验发现,对detailed图进行训练,会让训练结果更好且更稳定。因此,本模型所有的训练数据都是基于切割后的detailed图进行的。示例如下:
基于官方提供的训练集的标注数据,我们将图片路径替换成上述切割后的图片路径,得到基础训练数据集(
./Datas/train_sft_abs_split_zoom_images.jsonl)基于GT,对训练的
Instruction-Response进行扩充- More Questions:设计更多prompt提问形式,如:
- 直接回答,不要有
<think>...<\think> - 疑问句,询问图A或者图B是否更好,让模型直接回答
<answer>yes/no<\answer>
- 直接回答,不要有
- Swaping:交换输入图的顺序,如:
- 输入图顺序:
[p_000_merged_c0.png, p_000_merged_c1.png]->[p_000_merged_c1.png, p_000_merged_c0.png] - GT切换:
<think>Image A shows xxx. Image B shows ppp.<\think><answer>Image A<\answer>-><think>Image A shows ppp. Image A shows xxx<\think><answer>Image B<\answer>
- 输入图顺序:
- More Questions:设计更多prompt提问形式,如:
- 共得到四组训练数据,两组用在SFT,两组用来GRPO Post Training
- 原始SFT数据集:
./Datas/train_sft_abs_split_zoom_images.jsonl - 进行
Instruction-Response扩充的SFT数据集(More Question)./Datas/train_sft_abs_split_aug_more_ques_zoom_images.jsonl - 原始GRPO数据集:
./Datas/train_grpo_1536_split_zoom_images.jsonl - 进行
Instruction-Response扩充的GRPO数据集(Swaping)./Datas/train_grpo_1536_split_zoom_images_aug_swap.jsonl
- 原始SFT数据集:
采用五阶段训练:SFT->GRPO->GRPO->SFT->GRPO
训练前权重下载: Qwen3-VL-8B,保存路径为:
./Qwen3-VL-8B-Instruct
pip install modelscope
modelscope Qwen/Qwen3-VL-8B-Instruct --local-dir ./Qwen3-VL-8B-Instruct
或者
pip install huggingface_hub
HF_ENDPOINT=https://hf-mirror.com hf download Qwen/Qwen3-VL-8B-Instruct --local-dir ./Qwen3-VL-8B-Instruct
- 模型训练
STAGE1: SFT
- 基于ms-swift框架,进行训练
- 我们通过超参数搜索算法,得到如下较优参数:
lora_rank = 128 lora_alpha = 256 num_train_epochs = 30 per_device_train_batch_size = 4 gradient_accumulation_steps = 8 learning_rate = 1e-4- 采用
Instruction-Response增强后的数据进行训练:./Datas/train_sft_abs_split_aug_more_ques_zoom_images.jsonl - 训练脚本:
bash ./scripts/train/STAGE1.sh - 我们选取第70个step的训练权作为一个专家模型(MOE3),Phase2 ACC为:0.74 (75/102)
- 训练完成后,运行
bash ./scripts/merge/MERGE_STAGE1.sh进行权重merge,该阶段模型权重保存在:./EXP/STAGE1_FULL
STAGE2: GRPO
- 基于STAGE1的模型(
./EXP/STAGE1_FULL),进行GRPO的Post Training,以提升模型对该任务的探索和理解能力 - 我们通过超参数搜索算法,得到如下较优参数:
num_train_epochs = 10 per_device_train_batch_size = 2 gradient_accumulation_steps = 2 learning_rate = 1e-6 temperature = 0.9- 训练数据:
./Datas/train_grpo_1536_split_zoom_images.jsonl - 训练脚本:
bash ./scripts/train/STAGE2.sh - 我们选取第10个step的训练权重,一个专家模型(MOE1),Phase2 ACC为:0.77 (79/102)
- 由于该阶段是全参数微调,因此结果直接保存在:
./EXP/STAGE2_FULL/v*-xxxxxxxx-xxxxxx/checkpoint-20
- 基于STAGE1的模型(
STAGE3: GRPO AGAIN
- 基于STAGE2的模型(
./EXP/STAGE2_FULL/v*-xxxxxxxx-xxxxxx/checkpoint-20),进行GRPO的Post Training - 这次我们采用增强的数据集
./Datas/train_grpo_1536_split_zoom_images_aug_swap.jsonl,以及更小的学习率,尝试让模型在保留当前能力的同时,获得探索其他边界的能力 - 我们通过超参数搜索算法,得到如下较优参数:
num_train_epochs = 10 per_device_train_batch_size = 2 gradient_accumulation_steps = 2 learning_rate = 0.5e-6 temperature = 0.9- 训练数据:
./Datas/train_grpo_1536_split_zoom_images_aug_swap.jsonl - 训练脚本:
bash ./scripts/train/STAGE3.sh - 我们选取第30个step的训练权重,Phase2 ACC为:0.79 (81/102)
- 由于该阶段是全参数微调,因此结果直接保存在:
./EXP/STAGE3_FULL/v*-xxxxxxxx-xxxxxx/checkpoint-30
- 基于STAGE2的模型(
STAGE4: FINAL SFT
- 但后续不管我们如何再进行GRPO Post Training,由于GRPO中KL约束的存在,模型始终无法再跳出那个局部最优解,因此,我们再次尝试使用SFT训练,以增大模型的熵,尝试拉出当前模型陷入的局部最优解
- 基于STAGE3的模型(
./EXP/STAGE3_FULL/v*-xxxxxxxx-xxxxxx/checkpoint-30),再次进行SFT - 通过更长的训练时间以及稍小的学习率,希望模型能够跳出局部最优解,达到一个新的局部最优解
- 我们通过超参数搜索算法,得到如下较优参数:
lora_rank = 128 lora_alpha = 256 num_train_epochs = 50 per_device_train_batch_size = 4 gradient_accumulation_steps = 8 learning_rate = 1e-5- 训练数据:
./Datas/train_sft_abs_split_aug_more_ques_zoom_images.jsonl - 训练脚本:
bash ./scripts/train/STAGE4.sh - 我们选取第50个step的训练权重,Phase2 ACC为:0.81 (83/102)
- 训练完成后,运行
bash ./scripts/merge/MERGE_STAGE4.sh进行权重merge,该阶段模型权重保存在:./EXP/STAGE4_FULL
STAGE5: FINAL GRPO
- 基于STAGE4的模型(
./EXP/STAGE4_FULL),再次进行SFT - 通过更长的训练时间以及稍小的学习率,我们希望模型能够跳出局部最优,达到一个 ,以提升模型对该任务的探索能力
- 我们通过超参数搜索算法,得到如下较优参数:
num_train_epochs = 10 num_generations = 8 reward_weights = 1.5 0.5 per_device_train_batch_size = 2 gradient_accumulation_steps = 2 learning_rate = 0.5e-6 temperature = 1.0- 训练数据:
./Datas/train_grpo_1536_split_zoom_images_aug_swap.jsonl - 训练脚本:
bash ./scripts/train/STAGE5.sh - 我们选取第10个step的训练权重,一个专家模型(MOE2),Phase2 ACC为:0.84 (86/102)
- 由于该阶段是全参数微调,因此结果直接保存在:
./EXP/STAGE5_FULL/v*-xxxxxxxx-xxxxxx/checkpoint-10
- 基于STAGE4的模型(
我们通过将STAGE1、STAGE2、STAGE3、STAGE4和STAGE5训练得到的专家模型进行排列组合,发现由STAGE1、STAGE2和STAGE5组成的MOE系统,性能最好最鲁棒,Phase 2 ACC为:0.86 (88/102)
各阶段训练结果总结
| 训练阶段 | 训练方式 | 训练数据 | 较上一阶段变化 | Phase2 准确率 | 是否选为专家模型 |
|---|---|---|---|---|---|
| STAGE1 | SFT | ./Datas/train_sft_abs_split_aug_more_ques_zoom_images.jsonl |
-- | 0.74 (75/102) | $\checkmark$ |
| STAGE2 | GRPO | ./Datas/train_grpo_1536_split_zoom_images.jsonl |
采用GRPO后训练 | 0.77 (79/102) | $\checkmark$ |
| STAGE3 | GRPO | ./Datas/train_grpo_1536_split_zoom_images_aug_swap.jsonl |
采用数据增强的GRPO数据集训练 | 0.79 (81/102) | |
| STAGE4 | SFT | ./Datas/train_sft_abs_split_aug_more_ques_zoom_images.jsonl |
重新进行SFT微调 | 0.81 (83/102) | |
| STAGE5 | GRPO | ./Datas/train_grpo_1536_split_zoom_images_aug_swap.jsonl |
采用数据增强的GRPO数据集训练 | 0.84 (86/102) | $\checkmark$ |
| MOE | -- | -- | 多专家集成 | 0.86 (88/102) |
2. 其他补充说明
2.1 文件夹结构
当前提交目录的主要结构如下:
./czw2026_Track1_FinalPhase_Submission
├── Checkpoints
│ ├── MOE_1
│ ├── MOE_2
│ └── MOE_3
├── Datas
│ ├── Tools
│ │ └── split_tool.py
│ ├── Train
│ │ ├── images
│ │ └── images-split-zoom
│ ├── Validation
│ │ ├── images
│ │ └── images-split-zoom
│ ├── Final
│ │ ├── images
│ │ └── images-split-zoom
│ ├── train_sft_abs_split_zoom_images.jsonl
│ ├── train_sft_abs_split_aug_more_ques.jsonl
│ ├── train_grpo_1536_split_zoom_images.jsonl
│ ├── train_grpo_1536_split_zoom_images_aug_swap.jsonl
│ ├── val_infer_1536_split_zoom_images.jsonl
│ └── final_infer_1536_split_zoom_images.jsonl
├── Output
│ ├── Phase_2
│ └── Phase_3
├── ms-swift
├── plugins
│ └── reward_funcs.py
├── scripts
│ ├── infer_phase_2.sh
│ └── infer_phase_3.sh
└── tools
├── make_submission.py
└── vote_merge.py
各部分作用如下:
./Checkpoints/MOE_1、./Checkpoints/MOE_2、./Checkpoints/MOE_3:三个用于集成推理的模型权重目录。./Datas:训练、验证、测试数据,以及对应的jsonl描述文件。./Datas/Tools/split_tool.py:将原始拼接图切分为左右两张图,并输出到images-split-zoom。./scripts/infer_phase_3.sh:最终推理脚本。./tools/make_submission.py:将单模型推理结果转换为提交格式。./tools/vote_merge.py:对多个模型的预测结果做投票融合。./Output/Phase_2和./Output/Phase_3:保存推理和融合后的输出结果。
2.2 数据集处理
2.2.1 数据目录
./Datas 中按数据划分组织如下:
./Datas/Train/images:训练集原始图片。./Datas/Validation/images:验证集原始图片。./Datas/Final/images:测试集原始图片。./Datas/Train/images-split-zoom:训练集切分后的图片。./Datas/Validation/images-split-zoom:验证集切分后的图片。./Datas/Final/images-split-zoom:测试集切分后的图片。
对应的 jsonl 文件位于 ./Datas 根目录:
./Datas/train_sft_abs_split_zoom_images.jsonl:SFT 训练数据./Datas/train_sft_abs_split_aug_more_ques.jsonl:SFT 增强训练数据./Datas/train_grpo_1536_split_zoom_images.jsonl:GRPO 训练数据./Datas/train_grpo_1536_split_zoom_images_aug_swap.jsonl:GRPO 增强训练数据./Datas/val_infer_1536_split_zoom_images.jsonl:验证集推理数据./Datas/final_infer_1536_split_zoom_images.jsonl:测试集推理数据
2.2.2 生成 images-split-zoom
运行 ./Datas/Tools/split_tool.py,分别处理 Train、Validation 和 Final 三个目录下的原始图片:
python ./Datas/Tools/split_tool.py ./Datas/Train/images
python ./Datas/Tools/split_tool.py ./Datas/Validation/images
python ./Datas/Tools/split_tool.py ./Datas/Final/images
脚本会在每个 images 目录同级自动生成对应的 images-split-zoom 目录,即:
./Datas/Train/images-split-zoom./Datas/Validation/images-split-zoom./Datas/Final/images-split-zoom


