PiSSA/MiCA/CorDA 初始化会绕过 4 位浮点存储层上的量化层保护
页:1
pissa-init'、mica-init'和corda-init'(src/peft/tunners/lora/layer.py')门上为重量.d型,装入[浮点32、浮点16、浮点16]-但有浮点四位数层的浮点储存(bnb 4bit quant storage' floom) 报告一个浮点型,而其数据则装入了硝泡。 警卫通过,SVD跑过被打碎的一团,剩余部分被写回Params4bit'。 同样的文件在重置-lora-parameters'(:386-396':通过get bnb-param-type' +quantize-module-quight'进行班级检测)中已经正确做到这一点。 (最初也怀疑LoftQ,但loftq utils.py:81'将适当定性——排除。 )
- 最小复制(CPU;证明警卫绕行——包裹数据腐败本身需要CUDA四级状态)
导入火炬, 位元字节为 bnb
从火炬导入n
从 peft 导入 LoraConfig, 获取 peft 模型
从 peft.utils. 集成导入 bnb param 类型
类 QNet(nn.Module) :
\\ nit ( 自己) :
超级 (. ) init ()
self.lin=nn.Linear(16,16) (中文(简体) ).
self.lin. weight = bnb.nn.Params4bit(self.lin. weight.data, quant type="nf4") 互联网档案馆的存檔,存档日期2013-12-11.
w=QNet (. lin. 重量) (中文(简体) ).
print(type (w). name , w.dtype) # Params4bit 火炬.float32 <- 混淆
打印( get bnb param type(w)) # 4bit(类检测工作)
get peft model(QNet (), LoraConfig (r=4, target modules= ["林"], init lora weights="皮萨")).
打印 (“ 无类型 Error ” —— 在被量化的参数类上绕过 )在CUDA 4-位层上,后果比绕行更糟糕: " 重量.to(torch.float32) " 以浮标形式实现被打包的值, SVD 将分数化的噪声, 以及 " 重量.data = 剩余 " 将垃圾放回 " Params4bit " 中。
根原因
需要班级检查的三名只戴型的警卫(pissa init',mica init'~:470,corda init'~:499)。 get bnb param type'(以类名为基础,Institutions.py:129')已经存在,正确的去向路径(dquantize module cight')被用到两个函数外去。
预期行为
以SVD为基础的指数要么将当时的成品分解(匹配重置-lora-parameters'),要么将现有的TypeError'提升到被分解的地层上——绝不默默地将已装入的存储物分解为成品。
建议的固定办法
将3个D型警卫改为get bnb param type' +quantize-module quight'图案(或明确拒绝四分层),加上使用与上述完全相同的 " Params4bit " 浮式存储式的CPU可运行警卫测试。 点头后很高兴公关。
环境:Python 3.12,火炬2.13.0+cpu,比特和字节0.50.2,变压器5.15.1,平方英尺@`ab2db1e0'.
内容来源: huggingface/peft