从头训练小模型: 2 监督微调SFT

简介

从头训练小模型是我个人对大语言模型(LLM)学习中的重要部分。

通过对一个小规模模型的最小化复现实践,我不仅能够深入理解模型训练的基本流程,还可以系统地学习其中的核心原理和实际运行机制。这种实践性的学习方法让我能够直观地感受模型训练的每个环节,同时掌握相关的技术细节和实现方式。

目前的工作中,确实存在某些任务是有这种小模型的需求, 也在学习过程中理解运作逻辑, 力求用最小的资源消耗情况下,实现某些子任务的最小模型实现.

ALL in AI

代码已经上传 https://github.com/godzeo/miniGPT

SFT 有监督微调(Supervised Fine-Tuning):

为什么要这一步?

因为经过预训练之后,LLM已掌握了大量知识,但此时它只是一个无情的词语接龙机,还不能与人对话。

我们要它就不再盲目接龙,而是能够理解这是一段完整的对话。

那么我们就要这个指令微调的过程,让有了基础知识的学生, 会做题, 而不是一直背课文,成语结论, 需要他会根据学会根据提问, 回答问题做题. 理解什么是一问一答题.

训练命令:

1
2
3
4
5
6
7
8
torchrun --nproc_per_node=4 scripts/train_sft.py \
--model_path outputs/pretrain/final \
--tokenizer_path mistralai_tokenizer \
--output_dir outputs/sft \
--data_file /root/autodl-tmp/data/sft_mini_512.jsonl \
--batch_size 16 \
--gradient_accumulation_steps 8 \
--num_epochs 1

数据集

https://www.modelscope.cn/datasets/deepctrl/deepctrl-sft-data

主要是对 匠数大模型SFT数据集 数据清洗, 只保留了长度短一点的内容,超级精简之后的121w 的精简数据训练的

1
2
3
4
5
6
7
{"conversations": 
[{"role": "user", "content": "写一篇关于人工智能发展历史的文章。"},
{"role": "assistant", "content": "好的,我将写一篇关于人工智能发展历史的文章。人工智能源于20世纪50年代的探索,经历了多次热潮和降温期。早期主要以符号推理为主,而后引入了机器学习和深度学习等技术,目前已广泛应用于图像识别、自然语言处理、游戏、机器人等领域。"},
{"role": "user", "content": "提取一下人工智能在游戏领域的应用。"},
{"role": "assistant", "content": "在游戏领域,人工智能主要应用于游戏智能代理、游戏设计辅助等。智能代理可以使玩家在游戏中享受更好的游戏体验,同时也可以提高游戏难度,增加游戏的挑战性。游戏设计辅助则主要应用于游戏开发中,帮助游戏开发者设计游戏难度、关卡等。"},
{"role": "user", "content": "我想要这篇文章的摘要。"},
{"role": "assistant", "content": "这篇文章主要介绍了人工智能的发展历史以及其在游戏领域的应用。人工智能的发展历程经历了多次的起落,随着技术的发展不断完善和创新,已经广泛应用于图像识别、自然语言处理、游戏、机器人等众多领域。在游戏领域,人工智能主要应用于游戏智能代理、游戏设计辅助等。智能代理可以使玩家在游戏中享受更好的游戏体验,同时也可以提高游戏难度,增加游戏的挑战性。游戏设计辅助则主要应用于游戏开发中,帮助游戏开发者设计游戏难度、关卡等。"}]}

但是效果一般, 后考虑使用 https://www.modelscope.cn/datasets/AI-ModelScope/R1-Distill-SFT 这个黑盒蒸馏的数据再试试

测试效果:

image.png

python test_model.py –model_path ../outputs/sft/final –tokenizer_path ../tokenizer

测试对话效果

其实效果不行, 由于我的 预训练轮次1 + SFT轮次11 ,都太少了,现在的模型像是一个小孩一样

image.png

这一篇比较枯燥,感觉只是在找数据集, 下一篇是比较重要的微调