143 lines
3.5 KiB
Markdown
143 lines
3.5 KiB
Markdown
# DPO Full-Log Qwen 2B Server Bundle
|
||
|
||
这个目录是给你直接拷到服务器跑 full-log DPO 用的。
|
||
|
||
包含内容:
|
||
- `data/train_dpo_clean.jsonl`
|
||
- `data/dev_dpo_clean.jsonl`
|
||
- `data/train_dpo_full.jsonl`
|
||
- `data/dev_dpo_full.jsonl`
|
||
- `data/raw_final_train_pairs.jsonl`
|
||
- `data/raw_final_dev_pairs.jsonl`
|
||
- `reports/final_train_pairs_report.json`
|
||
- `reports/final_dev_pairs_report.json`
|
||
- `scripts/train_dpo.py`
|
||
- `scripts/analyze_token_lengths.py`
|
||
- `run_train.sh`
|
||
- `requirements.txt`
|
||
- `manifest.json`
|
||
|
||
## 设计定位
|
||
|
||
- 这版用的是 `full-log` prompt,而不是之前压缩版 DPO prompt。
|
||
- 主目标是让训练分布尽量靠近 benchmark 的 baseline zero-shot 长日志输入。
|
||
- 默认走 `reference_free + QLoRA + bf16 + sdpa`,优先保证 2B 级模型能在你的服务器上跑起来。
|
||
|
||
## 关于 “2B”
|
||
|
||
我这里没有把模型名写死成某个你机器上未必缓存过的 checkpoint。
|
||
|
||
默认值是:
|
||
|
||
```bash
|
||
Qwen/Qwen3-1.7B
|
||
```
|
||
|
||
这基本就是你这次要试的 “2B 档”。如果你服务器上实际要跑的是别的 Qwen 1.5B/1.7B/2B 级模型,直接改 `--model-name` 即可。
|
||
|
||
## GPU 参数
|
||
|
||
`run_train.sh` 支持:
|
||
|
||
- `--gpu-count 0`:单卡,只用 GPU 0
|
||
- `--gpu-count 1`:单卡,只用 GPU 1
|
||
- `--gpu-count 2`:双卡,`CUDA_VISIBLE_DEVICES=0,1`
|
||
|
||
这三个值就是你要的映射,不是“GPU 张数”的自然数语义。
|
||
|
||
## 默认训练策略
|
||
|
||
- 默认数据:`clean`
|
||
- 默认模型:`Qwen/Qwen3-1.7B`
|
||
- 默认 attention:`sdpa`
|
||
- 默认 reference:`reference_free`
|
||
- 默认截断:`keep_end`
|
||
|
||
默认长度:
|
||
|
||
- `--gpu-count 0/1`:
|
||
- `max_length=4096`
|
||
- `max_prompt_length=3584`
|
||
- `max_completion_length=512`
|
||
- `--gpu-count 2`:
|
||
- `max_length=6144`
|
||
- `max_prompt_length=5632`
|
||
- `max_completion_length=512`
|
||
|
||
这是偏保守但能跑的起点。full-log 原始 prompt 远超这个长度,所以仍然会截断,但会比你之前的 ultra-lowmem 版本保留更多原始日志。
|
||
|
||
## 直接跑
|
||
|
||
先装依赖:
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
双卡直接跑:
|
||
|
||
```bash
|
||
bash run_train.sh --gpu-count 2 --model-name Qwen/Qwen3-1.7B
|
||
```
|
||
|
||
单卡 0:
|
||
|
||
```bash
|
||
bash run_train.sh --gpu-count 0 --model-name Qwen/Qwen3-1.7B
|
||
```
|
||
|
||
单卡 1:
|
||
|
||
```bash
|
||
bash run_train.sh --gpu-count 1 --model-name Qwen/Qwen3-1.7B
|
||
```
|
||
|
||
## 常见覆盖方式
|
||
|
||
跑 `full` 数据而不是 `clean`:
|
||
|
||
```bash
|
||
bash run_train.sh --gpu-count 2 --model-name Qwen/Qwen3-1.7B --data-variant full
|
||
```
|
||
|
||
手动调长度:
|
||
|
||
```bash
|
||
MAX_LENGTH=7168 MAX_PROMPT_LENGTH=6656 MAX_COMPLETION_LENGTH=512 bash run_train.sh --gpu-count 2 --model-name Qwen/Qwen3-1.7B
|
||
```
|
||
|
||
从 checkpoint 续跑:
|
||
|
||
```bash
|
||
bash run_train.sh --gpu-count 2 --model-name Qwen/Qwen3-1.7B --resume-from-checkpoint outputs/your_run/checkpoint-50
|
||
```
|
||
|
||
## 训练前建议
|
||
|
||
先测一下 token 长度分布:
|
||
|
||
```bash
|
||
python scripts/analyze_token_lengths.py --model-name Qwen/Qwen3-1.7B --train-file data/train_dpo_clean.jsonl --dev-file data/dev_dpo_clean.jsonl
|
||
```
|
||
|
||
如果你发现 2B 在双卡上还有余量,再逐步把 `MAX_LENGTH` / `MAX_PROMPT_LENGTH` 往上抬,不要一次拉太猛。
|
||
|
||
## 数据说明
|
||
|
||
- `clean`:
|
||
- 去掉了 `weak_model_actual_error + parse_fail` 这类纯脏 rejected
|
||
- train `2399`
|
||
- dev `284`
|
||
- `full`:
|
||
- 保留全部 pair
|
||
- train `2500`
|
||
- dev `300`
|
||
|
||
## 建议的对比方式
|
||
|
||
如果你要比较训练前后效果,优先用和这套数据分布一致的:
|
||
|
||
- `baseline zero-shot full-log prompt`
|
||
|
||
不要先拿压缩 prompt 的旧版 benchmark 结论去判断这次 full-log DPO 是否有效,不然结论会混。
|