dataset

格式:.jsonl,每一行为:

{'text': '<s>鉴别一组中文文章的风格和特点,例如官方、口语、文言等。需要提供样例文章才能准确鉴别不同的风格和特点。</s> <s>好的,现在帮我查一下今天的天气怎么样?今天的天气依据地区而异。请问你需要我帮你查询哪个地区的天气呢?</s> <s>打开闹钟功能,定一个明天早上七点的闹钟。好的,我已经帮您打开闹钟功能,闹钟将在明天早上七点准时响起。</s> <s>为以下场景写一句话描述:一个孤独的老人坐在公园长椅上看着远处。一位孤独的老人坐在公园长椅上凝视远方。</s> <s>非常感谢你的回答。请告诉我,这些数据是关于什么主题的?这些数据是关于不同年龄段的男女人口比例分布的。</s> <s>帮我想一个有趣的标题。这个挺有趣的:"如何成为一名成功的魔术师" 调皮的标题往往会吸引读者的注意力。</s> <s>回答一个问题,地球的半径是多少?地球的平均半径约为6371公里,这是地球自赤道到两极的距离的平均值。</s> <s>识别文本中的语气,并将其分类为喜悦、悲伤、惊异等。\n文本:“今天是我的生日!”这个文本的语气是喜悦。</s>'}

context manager 设定是否混合精度进行计算

ctx = nullcontext() if device_type == "cpu" else torch.cuda.amp.autocast()

如果设备是 CPU,就用一个什么都不做的空上下文;否则在 GPU 上就启用自动混合精度。

with ctx:
	loss = ***
	optimizer.zero_grad()
	loss.backward()
	optimizer.update()

scaler 在混合精度训练中稳定梯度计算

它通过缩放损失和梯度来防止数值下溢。GradScaler 的主要作用是防止梯度下溢(underflow)。当使用较低精度的浮点数(如 float16)进行计算时,梯度值可能会变得非常小,小到低于该数据类型的可表示范围,导致梯度变为零,从而阻碍模型的学习。GradScaler 通过在反向传播计算梯度之前,先对损失值进行缩放(scale)(通常乘以一个较大的因子),使得计算出的梯度值也相应增大,避免下溢。在参数更新时,它再对梯度进行反缩放(unscale),恢复到正确的数值范围。

dataloader的pin_memory

通过设定true使得GPU可以直接访问CPU中的固定内存,提高数据传输效率,提高训练速度,但是大小受限;

显存估计

优化器比如AdamW, 需要存储每个参数的动量、二阶矩和梯度,因此加上模型参数本身,总的显存需求大约是3-4倍模型参数的显存需求;