再聊大模型微调之实践与心得

这几天一直都在尝试做ChatGLM-6B的微调,数据集是心理领域的对话数据,但效果一直很差,还好昨天终于微调出来了想要的效果,不过随之而来的就是另外的问题。简单的说说自己微调的过程。

环境准备

基于阿里云PAI平台,搭建了个服务器,其配置如下:再聊大模型微调之实践与心得申领地址[1]及教程:再聊大模型微调之实践与心得别的云服务器厂商我没有试用,之所以用阿里云PAI平台玩AI,主要是如下三点:

  1. 免费
  2. 快速对接ModeScope
  3. 极速的下载Github项目

第二点是我蛮看好的,因为很多的模型在魔塔上已经有了,就算没有,自己上传一个也很快,然后通过申请的dsw服务器极快的就可以下载模型,几分钟。再聊大模型微调之实践与心得再聊大模型微调之实践与心得当然可以用GIT下载,但我喜欢用SDK,感觉更快点。复制下Python代码到dsw服务器,然后一键执行即可。再聊大模型微调之实践与心得最后使用mv命令,将下载到默认路径的模型移动到指令路径:

mv model_dir target_dir

第三点,支持GIT项目的一键下载,这个也很爽。再聊大模型微调之实践与心得

Gallery

在dsw服务器上的Gallery中,已经默认提供了很多的demo,我一开始也是试玩了下ChatGLM的demo,还不错,推荐多了解下这些demo。再聊大模型微调之实践与心得

数据集

如下是我的数据集:

{"response":"这一周情况怎么样?","history":[],"prompt":"医生你好,我准备好了"}
{"response":"晚上的时候心情就会掉下来吗?那这种早晚的相差大不大?","history":[["医生你好,我准备好了","这一周情况怎么样?"]],"prompt":"就是白天的话下午心情好像可以,到晚上的时候就会心情不好"}

多轮对话的场景,对于心理领域来说,大多数都是医患对话的场景,是一种问询链的方式;治疗师不断的询问,患者不断的回答;而且是片段场景式的。

基于官方的微调

对于官方的微调,主要是基于Ptuning微调策略,改了些模型路径,直接运行命令微调,最后部署即可:

# 微调模型
bash train_chat.sh

#
 部署
bash web_demo.sh

注意切换模型的路径参数。

问题

在这里,一开始我的微调效果很差很差,因此我还提了issue[2]。现在分析来看,主要是两个原因:

  1. 数据集格式不对。
    1. 微调场景,一定要注意官方要求的数据集结构,有些是标准的json;有些并不是。
    2. 我一开始给数据集的前后加上了[],中途还有换行,组成了一个标准的json;导致后期的训练效果不好
  2. 微调超参数设置不当
    1. 一开始我修改了max_steps,以及save_steps参数,导致训练的轮数不够,模型效果很差。

对于微调的超参数,最好就是用默认的,而且一定要观察模型微调时的输出信息,我个人做总结,主要观察如下几个维度:

  1. loss
  2. epochs
  3. batch_size
  4. lr

如下,是我使用默认的超参数跑数据时的截图再聊大模型微调之实践与心得再聊大模型微调之实践与心得同时也会打印这样的一些信息:

***** train metrics *****
  epoch                    =     2182.0
  train_loss               =     0.0078
  train_runtime            = 2:16:02.25
  train_samples            =          7
  train_samples_per_second =      5.881
  train_steps_per_second   =      0.368

最后生成的checkpoint文件中也是有相关的信息再聊大模型微调之实践与心得

基于开源框架的微调

很多大佬将微调策略(ptuning、lora等)整合,支持选择微调策略来微调训练LLM;比如ChatGLM-Efficient-Tuning[3]LLaMA-Factory[4]。我个人是比较倾向推荐使用这个来做微调,主要是如下原因:

  1. 数据集格式的多样性
    1. 支持多种数据集:增量预训练文本格式、指令监督格式、SFT格式、RHLF格式等等
    2. 对于数据集收集整合的人来说,易于理解和处理数据
  2. 微调策略及训练方法的多样性
  3. 性能效率也不错

问题

当然在微调中也遇到一些问题,一般都是依赖包的版本之类的,这些都还好,主要是训练效果不明显;个人总结,还是超参数的设置原因。主要是训练不够:

  1. num_train_epochs

这个参数控制着epoch的次数,我修改了下,同时还改了save_steps,最终微调的效果还可以。

epoch:2000
train_loss:0.03830811873328639
train_runtime:2946.9643
train_samples_per_second:4.751
train_steps_per_second:0.679
[INFO|trainer.py:1712] 2024-03-15 15:59:41,839 >> ***** Running training *****
[INFO|trainer.py:1713] 2024-03-15 15:59:41,839 >>   Num examples = 7
[INFO|trainer.py:1714] 2024-03-15 15:59:41,839 >>   Num Epochs = 3
[INFO|trainer.py:1715] 2024-03-15 15:59:41,840 >>   Instantaneous batch size per device = 4
[INFO|trainer.py:1718] 2024-03-15 15:59:41,840 >>   Total train batch size (w. parallel, distributed & accumulation) = 16
[INFO|trainer.py:1719] 2024-03-15 15:59:41,840 >>   Gradient Accumulation steps = 4
[INFO|trainer.py:1720] 2024-03-15 15:59:41,840 >>   Total optimization steps = 3
[INFO|trainer.py:1721] 2024-03-15 15:59:41,841 >>   Number of trainable parameters = 3,670,016

另外的一个问题就是内存溢出out of memory,不过我的问题主要出现在没设置好如下两个参数:

  1. per_device_train_batch_size
  2. gradient_accumulation_steps

使用默认的就可以,要不然视GPU内存情况调小两者。

总结

微调效果的好坏,取决于很多的因素,除却数据集的质量外,主要是超参数的设置,又集中在训练的batch和epoch,loss等;在微调时,要关注输出的调试信息,根据实际的情况调整超参数。

参考资料
[1]

申领地址: https://free.aliyun.com/?pipCode=learn&spm=5176.14066474.J_4683019720.1.7b34754cnDd5ZC&scm=20140722.M_988563._.V_1

[2]

issue: https://github.com/THUDM/ChatGLM-6B/issues/1464

[3]

ChatGLM-Efficient-Tuning: https://github.com/hiyouga/ChatGLM-Efficient-Tuning/blob/main/README_zh.md

[4]

LLaMA-Factory: https://github.com/hiyouga/LLaMA-Factory


原文始发于微信公众号(阿郎小哥的随笔驿站):再聊大模型微调之实践与心得

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/244063.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!