charent/ChatLM-mini-Chinese

使用Lora 和 sft_train.py 训练效果好像没有,有没有好的方法?

yugu91 opened this issue · 7 comments

yugu91 commented

做了两条数据测试微调,分别使用Lora 和 sft_train.py,训练数据只放了两条:“什么是大排档” 和 提供的例子 "对于花园街,你有什么了解或看法吗?"
已经按照“prompt”和“response”的关系处理,“num_train_epochs” 设置为10,

输出结果:
***** Running training *****
Num examples = 2
Num Epochs = 10
Instantaneous batch size per device = 12
Total train batch size (w. parallel, distributed & accumulation) = 48
Gradient Accumulation steps = 4
Total optimization steps = 10
Number of trainable parameters = 187,692,288
{'loss': 1.0191, 'learning_rate': 1.0000000000000001e-07, 'epoch': 1.0}

{'train_runtime': 20.1565, 'train_samples_per_second': 0.992, 'train_steps_per_second': 0.496, 'train_loss': 1.0059864044189453, 'epoch': 10.0}

本人新入手,请教一下大哥,是否因为数据量太少的缘故?“大排档” 我通过加入token tokenizer.add_tokens(['大排档']) 也一样没效果,看内容应该是识别为汽车的 大排量和档位

另外 提示这个是否会存在问题?我看了dataset也有prompt, input_mask, response

The following columns in the training set don't have a corresponding argument in TextToTextModel.forward and have been ignored: prompt, input_mask, response. If prompt, input_mask, response are not expected by TextToTextModel.forward, you can safely ignore this message.

首先,数据量太少,才两条。建议按照utils/raw_data_process.py#L617给出的问题示例多构造一些问答对,回答尽量要不一样,可以稍微改写一下。其次,1e-8学习率太低了,数据量少建议设置在1e-4或者1e-3的量级,还要把warmup_steps这个参数改为0,否则数据量少导致设置的学习率不生效(warmup都没跑完训练就结束了)。

第二个问题

另外 提示这个是否会存在问题?我看了dataset也有prompt, input_mask, response

不影响,去除这个提示可以把'input_mask': prompt.attention_mask,这一行注释掉,input_mask这个用法是老早之前的版本用的,现在的版本不用。这一行代码应该是要删掉的,我下次更新的时候修复这个问题。

yugu91 commented

谢谢,我试试

还要补充一点,你数据量少,梯度累计gradient_accumulation_steps要设置为1,上面的训练参数Total train batch size (w. parallel, distributed & accumulation) = 48,相当于batch size=48,2条数据*训练10个epoch=20,累计的梯度还没到48,还没进行反向传播,所以没有效果。

yugu91 commented

感谢,有效果了,echo 设置为50, gradient_accumulation_steps=1, learning_rate=1e-3
感谢指点

yugu91 commented

再问一下大哥

  1. 在 batch_size = 18,accumulation_steps = 1,learning_rate=1e-2, num_train_epochs=30 情况下,一条数据集下成功训练了,不过生成了重复的答案,是否叫做“过度拟合”?
  2. 在两条数据情况下非常精准,请问learning_rate学习率、batch_size的关系标准一般是如何界定一个良好的范围?
  1. 生成重复回答不叫过拟合,有可能模型已经崩了。解决重复回答可以在generate函数使用repetition_penalty no_repeat_ngram_size两个参数减缓。

  2. learning_rate看数据集大小,数据集大+模型参数大,学习率可以小一些,数据集小学习率可以大一些,没有统一标准,看经验。batch_size在不爆显存的情况下越大越好,llm训练一般都是128K,1M的量级。

另外,训练数据最好不要搞一两条,训练出来的模型没有什么泛化能力,做微调最少也得弄个百来条数据吧。num_train_epochs不宜过大,容易过拟合,直接吐出训练数据,一般是2-4个epoch(看训练数据量)。

yugu91 commented

谢了,我再研究一下参数。
公司想做一个ai客服,很大可能数据就在100条内。
这台MacBook pro也不太好,m1 只有8g内存,现在先做个研究,等确定方案了再看看怎么升级电脑之类的