1.制作数据集,input->text label->llama_outpus['hidden_states']
这样的好处:在训练时可以直接剔除一整条数据,无需在原文本数据集和llama输出数据集做两次剔除
2.在蒸馏py 设置模型fp16 -> model.half
with autocast看是否能运行 想知道是否会自动生成weight(fp32) gradient(fp32) 的副本?
3 如果出现nan 修改esp值
4.把原来的整段checkpoint分段保存,因为如果一旦文件被损害,所有teacher_output的结果都没了。。。。
5.一维的input_ids可以直接[item[0].squeeze(0) for item in batch],用[]来堆叠;二维的label必须用torch.stack吗
- 对于 一维张量(如
input_ids
),可以直接使用列表[item["input_ids"].squeeze(0) for item in batch]
来堆叠,因为它们形状一致。squeeze(0)
,去掉第一个维度(如果存在),以确保它是一个一维张量 - 对于 二维张量(如
label
),你必须使用torch.stack
来堆叠,确保它们在相同维度下对齐,并且形状正确。
6.mask 每个batch的causal mask是一样的
- Mask 矩阵需要显式创建和传递,例如通过
attention_mask
。LLaMA 和其他类似模型通常会利用传入的attention_mask
来屏蔽填充部分和生成因果遮蔽。 - 填充 Mask:对填充(padding)部分进行屏蔽,确保模型不会“看到”填充的部分。填充部分的 attention 权重通常设置为负无穷(或一个非常小的值),这样在计算 attention 时这些位置就不会被关注。
- 因果 Mask:在自回归模型(如 GPT 或 LLaMA)中,因果 mask 用于保证当前 token 只能依赖于它之前的 token,而不能依赖于后面的 toke
7.检查tensor
torch.numel()
方法,它返回张量中的元素个数。如果元素个数为零,那么表示该张量为空
torch.all(attention_mask)
:如果attention_mask
中所有的值都为True
,则返回True
。torch.any(attention_mask)
:如果attention_mask
中有任何一个值为True
,则返回True
8.手动填充 vs tokenzier填充 https://zhuanlan.zhihu.com/p/548347360
from torch.nn.utils.rnn import pad_sequence
import torch
def collate_fn(batch):
# 获取批次中的 input_ids 和 position_ids(假设每个样本是一个字典)
input_ids = [item["input_ids"].squeeze(0) for item in batch] # 假设每个 item["input_ids"] 是单个样本
position_ids = [item["position_ids"].squeeze(0) for item in batch]
idx = torch.tensor([item["idx"] for item in batch])
label = [item["label"] for item in batch]
# 填充 input_ids 和 position_ids
input_ids_padded = pad_sequence(input_ids, batch_first=True, padding_value=0)
position_ids_padded = pad_sequence(position_ids, batch_first=True, padding_value=0)
# 生成 attention_mask:有效部分为 1,填充部分为 0
attention_mask = (input_ids_padded != 0).long()
# 生成 global_idx 或其他需要的附加信息
global_idx = torch.arange(start=idx[0].item(), end=idx[0].item() + len(batch))
return input_ids_padded, position_ids_padded, global_idx, attention_mask, label
encoding = tokenizer(
text,
truncation=True,
padding=True, # 自动填充
max_length=512,
return_tensors="pt" # 返回 PyTorch tensor 格式
)
# 输出
print("Input IDs:", encoding["input_ids"])
print("Attention Mask:", encoding["attention_mask"])
pad_token_id
:填充符号的 ID,默认是None
,如果需要填充,需要手动设置一个 ID。bos_token_id
:句子开始符号的 ID,用于表示文本生成的开始。eos_token_id
:句子结束符号的 ID,用于表示文本生成的结束。