Minimind 是一个“小”语言模型,总共只有 2500 万个参数,最小版本体积只有 GPT-3 的七千分之一,作者称只需要3块钱+2小时就可以完成训练,项目地址为:https://github.com/jingyaogong/minimind。
为防止误解,“2小时” 基于NVIDIA 3090硬件设备(单卡)测试,“3块钱” 指GPU服务器租用成本,具体规格详情见下文。
Minimind 完全从0开始,对大语言模型实现了全阶段开源复现,是入门 LLM 的绝佳教程。
本文将根据项目文档完成两阶段训练(预训练和有监督微调),初步感受一下“大”模型的训练过程:
Minimind 作者的软硬件配置(仅供参考):
我的软硬件配置(我的个人电脑GPU只有500M显存,所以使用了云主机):
# 从 github 下载代码并进入项目目录
git clone https://github.com/jingyaogong/minimind.git
cd minimind
# 创建虚拟环境并激活
conda create --name minimind python=3.10.16
conda init
conda activate minimind
# 安装需要的依赖
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simp
# 还是在 minimind 目录
pip install modelscope
modelscope download --dataset gongjy/minimind_dataset --local_dir ./dataset
总共下载了 20 多 G 的数据,都是 jsonl 格式:
预训练需要执行一个 python 文件:
python train_pretrain.py
预训练过程其实是有一些参数可以调整的,但为了快速完成训练,我们先全部使用默认参数。
预训练所使用的数据:
在我的这个云主机里,训练一个 epoch大概需要两个小时:
有监督微调也只需要执行一个 python 文件:
python train_full_sft.py
微调使用的数据格式和预训练不同,对对话的双方做了区分:
从肉眼上看,微调的速度比预训练略快:
经过上面的训练,我们得到了两个模型,一个是预训练模型,一个是微调模型,都在 out 目录下:
可以看到两个模型的大小一模一样,说明两个模型的结构应该是相同的。
下面我们使用 python eval_model.py
来比较两个模型的表现,eval_model.py
这个文件接收两个参数:
--load
参数,用来指示加载我们自己训练的模型(在 out
目录),还是加载从Huggingface下载下来的模型(在 MiniMind2
目录);model_mode
参数,用来指示加载哪个阶段的模型,0表示预训练模型,1表示微调模型,2表示RLHF模型等;首先是项目自带的评测:
可以看出,虽然都只训练了一个epoch,微调后的模型比预训练模型明显强了很多,即使存在信息不准确或者错误,但是对话的语气和意图是很明显的,而预训练模型就差了很多,而且看起来似乎有时没办法终止对话。
再来看看人工评测,我问了两个模型三个相同问题:
下面是它们的回答:
和自动评测的结果差不多,微调模型“知道”自己在对话,而预训练模型的回答非常发散。
项目也提供了 Web 页面和模型交互的方法,通过 streamlit
实现:
cd scripts
streamlit run web_demo.py
对话界面长这样:
以上就是我的 Minimind 初体验,由于时间和成本问题,预训练模型和微调模型都只训练了一个 epoch,模型表现不是很给力,但是这不影响我们了解大模型的训练过程,后续我会进一步深入研究 Minimind 项目,包括复现其它的训练阶段,研究训练代码,以及过程中发现的其他问题。如果你也对此感兴趣,或者有学习大模型的建议,欢迎指点和交流!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。