# SFT Full-Log Qwen3.5-2B Server Bundle 这个目录可以直接拷到服务器上做 full-log SFT。 ## 包含内容 - `data/train_sft.jsonl` - `data/dev_sft.jsonl` - `scripts/train_sft.py` - `scripts/analyze_sft_lengths.py` - `scripts/compare_eval_results.py` - `scripts/build_sft_dataset.py` - `run_train.sh` - `requirements.txt` - `manifest.json` ## 数据说明 - 训练格式是 chosen-only 的对话式 SFT。 - 每条样本是单个 `messages` 字段,包含: - `system` - `user` - `assistant` - 数据来源是 full-log preference pairs 的 `chosen` 侧。 - 这意味着训练分布比之前压缩版 DPO 更接近 benchmark baseline 的原始长日志输入。 ## 默认模型 默认就是: ```bash Qwen/Qwen3.5-2B ``` ## GPU 参数 `run_train.sh` 支持: - `--gpu-count 0`:只用 GPU 0 - `--gpu-count 1`:只用 GPU 1 - `--gpu-count 2`:双卡 这里双卡仍然是 `torchrun` 数据并行,不是模型切分,所以默认长度不会因为双卡自动放大。 ## 默认训练配置 - `max_length=4096` - `max_prompt_length=3584` - `max_completion_length=512` - `reference-free` 不再相关,因为这是 SFT 不是 DPO - `sdpa` - `QLoRA + 4bit + bf16` ## 训练 先装依赖: ```bash pip install -r requirements.txt ``` 训练前先看长度: ```bash python scripts/analyze_sft_lengths.py --model-name Qwen/Qwen3.5-2B --train-file data/train_sft.jsonl --dev-file data/dev_sft.jsonl ``` 双卡训练: ```bash bash run_train.sh --gpu-count 2 --model-name Qwen/Qwen3.5-2B ``` 单卡 0: ```bash bash run_train.sh --gpu-count 0 --model-name Qwen/Qwen3.5-2B ``` 单卡 1: ```bash bash run_train.sh --gpu-count 1 --model-name Qwen/Qwen3.5-2B ``` 如果显存还有余量,再手动抬长度: ```bash MAX_LENGTH=6144 MAX_PROMPT_LENGTH=5632 MAX_COMPLETION_LENGTH=512 bash run_train.sh --gpu-count 2 --model-name Qwen/Qwen3.5-2B ``` ## 训练前后对比 建议继续用 benchmark 的 baseline prompt 做主对比,命令风格保持你之前那套: 训练前: ```bash python eval_api.py --model Qwen/Qwen3.5-2B --api-base http://localhost:8000/v1 --api-key not-needed --temperature 0 --no_thinking --output-dir results/qwen35_2b_before ``` 训练后: ```bash python eval_api.py --model your-sft-model --api-base http://localhost:8000/v1 --api-key not-needed --temperature 0 --no_thinking --output-dir results/qwen35_2b_after_sft ``` 对比: ```bash python scripts/compare_eval_results.py --before ../results/qwen35_2b_before --after ../results/qwen35_2b_after_sft ``` 如果你把 bundle 放到别的目录,`--before` / `--after` 直接传两个结果目录或两个 `summary.json` 路径即可。