File size: 4,722 Bytes
01cf98b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/bin/bash
# Qwen3-VL CoT reranker 训练 - Nebula 提交(训练参数直接在本文件配置)
# Usage: sh scripts/submit/submit_train_qwen3vl_cot.sh
# 远程机器上 OSS 挂载在 /data/oss_bucket_0/,模型/数据/输出都直接走该路径

## 集群资源配置(每个 worker = 8 卡;gpu:800 表示 8 张卡)
CLUSTER_CONFIG='./cluster.json'
cat <<EOT > ${CLUSTER_CONFIG}
{
    "worker": {
        "gpu": 800,
        "cpu": 9600,
        "memory": 400000
    }
}
EOT
WORKER_COUNT=2
NPROC_PER_NODE=8

## ============ 模型设置 ============
MODEL_ID=qwen3-vl-2b
MODEL_LOCAL_PATH=/data/oss_bucket_0/liqi/models/Qwen3-VL-2B-Instruct
## 换 8B 时改成(需确认该路径已在 OSS 上):
# MODEL_ID=qwen3-vl-8b
# MODEL_LOCAL_PATH=/data/oss_bucket_0/liqi/models/Qwen3-VL-8B-Instruct

## ============ 数据集设置(cot_gen 生成并合并后的 CoT 数据) ============
TRAIN_DATA_PATH=/data/oss_bucket_0/liqi/dataset/reranker/train_cot.jsonl
EVAL_DATA_PATH=/data/oss_bucket_0/liqi/dataset/reranker/eval_cot.jsonl
NUM_TRAIN_DOCS=10
FULL_CROP_MODE=False
FORMAT_PROMPT=train_cot/listwise_cot_reranker_v1.jinja

## ============ 训练参数设置 ============
### 视觉部分
TRAIN_VISION_ENCODER=False
USE_VISION_LORA=False
TRAIN_VISION_PROJECTOR=False

### LoRA(USE_LORA=False 走全参数微调)
USE_LORA=True
Q_LORA=False
LORA_R=128
LORA_ALPHA=256

### DS 和基本训练参数
DS_STAGE=zero2
PER_DEVICE_BATCH_SIZE=4
GRAD_ACCUM=2
NUM_EPOCHS=10
LR=5e-5
MODEL_MAX_LEN=10240
SAVE_STEPS=50
## 自定义 CoT 评测(生成式)触发间隔,走 train_reranker_qwen3vl_cot.py 里的 CustomCallback
EVAL_STEPS=50

## ============ 保存设置 ============
RUN_ID=${MODEL_ID}-cot-reranker_lora_${USE_LORA}
OUTPUT_DIR=/data/oss_bucket_0/liqi/cot_reranker/cot_sft/${RUN_ID}

## ============ wandb 设置 ============
## WANDB_API_KEY / WANDB_PROJECT / WANDB_MODE 在 train_cot/train_reranker_qwen3vl_cot.py 开头通过环境变量默认值配置

## ============ 拼装启动与训练参数(由 entry 使用 torchrun 拉起每节点 8 个进程) ============
args="\
    --training_script train_cot/train_reranker_qwen3vl_cot.py \
    --nnodes $WORKER_COUNT \
    --nproc_per_node $NPROC_PER_NODE \
    --model_id $MODEL_ID \
    --output_dir $OUTPUT_DIR \
    --report_to wandb \
    --run_name $RUN_ID \
    --deepspeed ./ds_configs/${DS_STAGE}.json \
    --bf16 True \
    --num_train_epochs $NUM_EPOCHS \
    --per_device_train_batch_size $PER_DEVICE_BATCH_SIZE \
    --per_device_eval_batch_size 4 \
    --gradient_accumulation_steps $GRAD_ACCUM \
    --eval_strategy no \
    --eval_steps $EVAL_STEPS \
    --eval_accumulation_steps 4 \
    --save_strategy epoch \
    --save_steps $SAVE_STEPS \
    --save_total_limit 500 \
    --learning_rate ${LR} \
    --weight_decay 0. \
    --warmup_ratio 0.03 \
    --lr_scheduler_type cosine \
    --logging_steps 1 \
    --tf32 True \
    --model_max_length $MODEL_MAX_LEN \
    --gradient_checkpointing True \
    --dataloader_num_workers 8 \
    --train_vision_encoder $TRAIN_VISION_ENCODER \
    --use_vision_lora $USE_VISION_LORA \
    --train_vision_projector $TRAIN_VISION_PROJECTOR \
    --use_lora $USE_LORA \
    --q_lora $Q_LORA \
    --lora_r $LORA_R \
    --lora_alpha $LORA_ALPHA \
    --model_local_path $MODEL_LOCAL_PATH \
    --train_data_path $TRAIN_DATA_PATH \
    --eval_data_path $EVAL_DATA_PATH \
    --use_flash_attn True \
    --format_prompt $FORMAT_PROMPT \
    --num_train_docs $NUM_TRAIN_DOCS \
    --full_crop_mode $FULL_CROP_MODE \
    --max_full_tokens 20 \
    --max_crop_tokens 80"

nebulactl run mdl \
          --engine=xdl \
          --ignore=venv/*,data/*,.git/*,cot_data/* \
          --job_name=${RUN_ID} \
          --queue="pailitao_algo_high_2" \
          --entry="scripts/entry/train_qwen3vl_entry.py" \
          --nebula_project=pailitao_v100 \
          --algo_name=pytorch280 \
          --worker_count=${WORKER_COUNT} \
          --file.cluster_file="./cluster.json" \
          --user_params="$args" \
          --nas_file_system_id=98d384a407-okl3.cn-zhangjiakou.nas.aliyuncs.com \
          --oss_access_id=LTAI5tMZb5HHH6HHgAExAyiL \
          --oss_access_key=6MVP8JnTE01t4TLUHhPoFV0swZNTrb \
          --oss_bucket=pailitao-ai \
          --oss_endpoint=oss-cn-zhangjiakou.aliyuncs.com \
          --requirements_file_name=requirements_qwen3vl.txt

rm ${CLUSTER_CONFIG}
# queue是队列名,algo_name由队列所决定
# nebula_project是集群名
# entry 在每个 worker 上通过 torchrun 启动 NPROC_PER_NODE 个训练进程
# worker_count 是机器数量,每台机器的卡数由 cluster.json 的 gpu 决定(800 = 8 卡)
# nas_file_system_id 和 oss是存储文件的地址