Skip to content

损失、梯度与参数高效训练:练习答案 ​

参考实现 ​

独立运行:

python
d = k = 4096
full = d*k
assert full == 16777216
assert 8*(d+k) == 65536
assert 16*(d+k) == 131072
print(full,8*(d+k),16*(d+k))

基础权重仍在,KV cache和激活仍在;减少的是可训练增量和相关训练状态。量化与LoRA可组合,但承担不同责任。

返回题目。

链路变体 ​

接在创建labels之后,模型前向前运行:

python
variant=labels.clone(); variant[1,:]=-100
model.eval()
a=model(input_ids=ids,attention_mask=mask,labels=variant).loss
b=model(input_ids=ids[:1],attention_mask=mask[:1],labels=labels[:1]).loss
assert torch.allclose(a,b)

不同base验证放在expected建立之后:

python
torch.manual_seed(999)
wrong=PeftModel.from_pretrained(GPT2LMHeadModel(config),'adapter')
wrong.eval()
assert not torch.allclose(expected,wrong(input_ids=ids,attention_mask=mask).logits)

adapter保存的只是增量,随机基座不同即使架构相同也会得到不同函数。此反例在adapter目录写出之后执行。

用心记录每一步成长