Files
llmiotsafe/DPO_FULLLOG_QWEN2B_SERVER_BUNDLE/README.md
2026-05-12 17:01:39 +08:00

143 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 是否有效,不然结论会混。