# 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 是否有效,不然结论会混。