有任何问题欢迎在下面留言
本篇文章的代码运行界面均在PyCharm中进行
本篇文章配套的代码资源已经上传
从零构建属于自己的GPT系列1:数据预处理
从零构建属于自己的GPT系列2:模型训练1
从零构建属于自己的GPT系列3:模型训练2
从零构建属于自己的GPT系列4:模型训练3
从零构建属于自己的GPT系列5:模型部署1
从零构建属于自己的GPT系列6:模型部署2
def collate_fn(batch):
input_ids = rnn_utils.pad_sequence(batch, batch_first=True, padding_value=5)
labels = rnn_utils.pad_sequence(batch, batch_first=True, padding_value=-100)
return input_ids, labels
专门用来做序列填充的函数,一个batch中有4个数据,有的数据长有的短,这是不可以的,保证每个句子长度也就是单词或者汉字的个数一致,就要进行padding填充类似于卷积中加上一圈0一样的意思。
def calculate_acc(logit, labels, ignore_index=-100):
logit = logit[..., :-1, :].contiguous().view(-1, logit.size(-1))
labels = labels[..., 1:].contiguous().view(-1)
_, logit = logit.max(dim=-1)
non_pad_mask = labels.ne(ignore_index)
n_correct = logit.eq(labels).masked_select(non_pad_mask).sum().item()
n_word = non_pad_mask.sum().item()
return n_correct, n_word
开启训练后:
2023-12-11 01:03:25,231 - INFO - batch 100 of epoch 1, loss 12.36994457244873, batch_acc 0.01348314606741573, lr [6e-07]
2023-12-11 01:03:30,964 - INFO - batch 200 of epoch 1, loss 11.884823083877563, batch_acc 0.015410958904109588, lr [1.2375e-06]
2023-12-11 01:03:36,631 - INFO - batch 300 of epoch 1, loss 11.337600231170654, batch_acc 0.028312570781426953, lr [1.874999999998e-06]
2023-12-11 01:03:42,524 - INFO - batch 400 of epoch 1, loss 10.705965042114258, batch_acc 0.027131782945736434, lr [2.475e-06]
2023-12-11 01:03:48,414 - INFO - batch 500 of epoch 1, loss 9.881455421447754, batch_acc 0.022690437601296597, lr [3.1125e-06]
2023-12-11 01:03:54,404 - INFO - batch 600 of epoch 1, loss 8.230867624282837, batch_acc 0.038109756097560975, lr [3.749999999997e-06]
2023-12-11 01:04:00,344 - INFO - batch 700 of epoch 1, loss 7.731964588165283, batch_acc 0.07916666666666666, lr [4.35e-06]
2023-12-11 01:04:06,364 - INFO - batch 800 of epoch 1, loss 7.087151527404785, batch_acc 0.08751229105211406, lr [4.9875e-06]
2023-12-11 01:04:12,245 - INFO - batch 900 of epoch 1, loss 6.311254978179932, batch_acc 0.16279069767441862, lr [5.6249999999999995e-06]
2023-12-11 01:04:18,222 - INFO - batch 1000 of epoch 1, loss 6.076582431793213, batch_acc 0.17541613316261204, lr [6.225e-06]
2023-12-11 01:04:23,979 - INFO - batch 1100 of epoch 1, loss 5.394809246063232, batch_acc 0.18795888399412627, lr [6.862499999999999e-06]
2023-12-11 01:04:29,749 - INFO - batch 1200 of epoch 1, loss 5.653847336769104, batch_acc 0.19206939281288724, lr [7.499999999999999e-06]
2023-12-11 01:04:35,539 - INFO - batch 1300 of epoch 1, loss 5.932612895965576, batch_acc 0.1772406847935549, lr [8.099999999999999e-06]
一开始学习率比较低,损失也比较大,然后学习率会增大,最后学习率又会进行衰减
前面的代码中我们知道,在最后训练完成后会保存训练最好的一个模型
我的运行环境是:
batch_size 我指定的是8,gpu0_bsz指定的是6, 我训练了5个epoch,大约48分钟
从零构建属于自己的GPT系列1:数据预处理
从零构建属于自己的GPT系列2:模型训练1
从零构建属于自己的GPT系列3:模型训练2
从零构建属于自己的GPT系列4:模型训练3
从零构建属于自己的GPT系列5:模型部署1
从零构建属于自己的GPT系列6:模型部署2