qa lora
1.0.0
Qa-Lora已被ICLR 2024接受!
该存储库提供了QA-LORA的官方Pytorch实施:大型语言模型的量化低级别适应。

Qa-Lora可以轻松地使用几行代码实现,并且它使原始Lora具有两倍的能力:(i)在微调期间,LLM的权重量化(例如,将其定量为INT4),以减少时间和内存使用; (ii)微调后,LLM和辅助权重自然地集成到量化模型中而不会损失精度。
使用最新的自动GPTQ版本来修复冲突。
conda create -n qalora python=3.8
conda activate qalora
conda install pytorch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 pytorch-cuda=12.1 -c pytorch -c nvidia
git clone -b v0.3.0 https://github.com/PanQiWei/AutoGPTQ.git && cd AutoGPTQ
pip install .
cd ..
pip install bitsandbytes
pip install -r requirements.txt
pip install protobuf==3.20. *使用新的peft_utils.py 。对于GPTQlora的用户,您只需要更改peft_utils.py文件即可。
我们使用GPTQ进行量化。位= 4,组大小= 32,act-order = false如果更改组大小,则需要相应地更改peft_utils.py中的merge.py 。
python qalora.py --model_path < path >模型检查点的文件结构如下:
config.json llama7b-4bit-32g.bin special_tokens_map.json tokenizer_config.json
generation_config.json quantize_config.json tokenizer.model
请注意,我们训练的洛拉模块可以完美合并到量化的模型中。我们在此存储库中提供了一个简单的合并脚本。
减少尺寸有两种实现(x从d_in到d_in // l)。两者都是数学等效的。
采用AVGPooling操作。但是,在合并期间,适配器的权重将由d_in // l分配(请参阅merge.py )。
adapter_result = (lora_B(lora_A(lora_dropout(self.qa_pool(x)))) * scale).type_as(result)
model[tmp_key+ ' .qzeros ' ] -= (lora[ ' base_model.model. ' +tmp_key+ ' .lora_B.weight ' ] @ lora['base_model.model.'+tmp_key+'.lora_A.weight']).t () * scale / group_size / model[tmp_key+ ' .scales ' ]利用总和操作。合并期间,适配器不需要分开)
adapter_result = (lora_B(lora_A(lora_dropout(self.qa_pool(x) * group_size))) * scale).type_as(result)
model[tmp_key+ ' .qzeros ' ] -= (lora[ ' base_model.model. ' +tmp_key+ ' .lora_B.weight ' ] @ lora['base_model.model.'+tmp_key+'.lora_A.weight']).t () * scale / model[tmp_key+ ' .scales ' ]一些GPTQ实施(例如GPTQ为for-lalama)进一步将零压缩到Qzeros中。您需要先解码Qzeros并恢复FP16格式零。
我们的代码基于Qlora,gptqlora,auto-gptq