作者: Yong-Hwan Lee,James Flora,Shijie Zhao和Yunhan Qiao
该项目复制并基于Shestov等人的研究。 (2024) ,旨在验证和扩展其发现。最初的研究集中于微调大语言模型(LLMS)进行代码脆弱性检测。该方法利用LoRA (低级适应),该技术涉及在层中添加适配器进行微调。在此过程中,原始模型参数被冷冻,并且只有适配器经过训练,从而使培训过程更具成本效益。
我们作品的关键创新是我们对QLoRA的自定义改编的结合,该Qlora首先将LLM量化为4位浮子,从而大大降低了其尺寸。例如,量化后,最初约为26 GB且通常需要30 GB的VRAM ,通常需要30 GB的VRAM,在量化后约7 GB 。量化后,将LoRA技术应用于微调。

图1 :洛拉适配器插图
图1说明了Lora适配器如何显着小于原始参数尺寸。参数数量的数量
例如,考虑具有重量矩阵的LLM中的一层
$ w in mathbb {r}^{1000 times 100} $ 。参数数量的数量$ W $ 是$ 1000 times 100 = 100,000 $ 。如果我们将洛拉等级设置为$ r = 5 $ ,洛拉适配器的大小只是$ 1000 times 5 + 100 times 5 = 5,500 $ 。这意味着适配器的大小约为原始重量矩阵的5%$ W $ ,作为原始重量矩阵,这对于培训非常易于管理$ W $ 在训练阶段保持冷冻。
在这个项目中,我们改变了dataset , sequence length和the use of focal loss ;与单独的洛拉相比,测量了所得的性能变化。该项目的报告:PDF
该文档提供了复制我们的研究项目的详细说明。它包括用于设置必要环境,进行必要的代码更改,在高性能计算(HPC)群集上运行模型的步骤,并显示结果。
pip install -r requirements.txtGPTBigCodeConfig your_venv/lib/python3.10/site-packages/transformers/models/gpt_bigcode/configuration_gpt_bigcode.py中添加以下函数。 class GPTBigCodeConfig :
# ... other methods and attributes ...
def set_special_params ( self , args ):
self . args = vars ( args )./vul-llm-finetune/LLM/starcoder/run.py sys . path . append ( "my_path/vul-llm-finetune/LLM/starcoder" )SRUN -P DGXH-时间= 2-00:00:00 -c 2 -ggres = gpu:2 -mem = 20G -pty bash
python vul-llm-finetune/LLM/starcoder/finetune/run.py
--dataset_tar_gz= ' vul-llm-finetune/Datasets/with_p3/java_k_1_strict_2023_06_30.tar.gz '
--split= " train "
--lora_r 8
--seq_length 512
--batch_size 1
--gradient_accumulation_steps 160
--learning_rate 1e-4
--weight_decay 0.05
--num_warmup_steps 2
--log_freq=1
--output_dir= ' vul-llm-finetune/outputs/results_test/ '
--delete_whitespaces
--several_funcs_in_batch
--debug_on_small_modelpython vul-llm-finetune/LLM/starcoder/finetune/run.py
--dataset_tar_gz= ' vul-llm-finetune/Datasets/with_p3/java_k_1_strict_2023_06_30.tar.gz '
--load_quantized_model
--split= " train "
--lora_r 8
--use_focal_loss
--focal_loss_gamma 1
--seq_length 512
--num_train_epochs 15
--batch_size 1
--gradient_accumulation_steps 160
--learning_rate 1e-4
--weight_decay 0.05
--num_warmup_steps 2
--log_freq=1
--output_dir= ' vul-llm-finetune/outputs/results_0/ '
--delete_whitespaces
--base_model starcoder
--several_funcs_in_batchpython vul-llm-finetune/LLM/starcoder/finetune/run.py
--dataset_tar_gz= ' vul-llm-finetune/Datasets/with_p3/java_k_1_strict_2023_06_30.tar.gz '
--load_quantized_model
--split= " test "
--run_test_peft
--lora_r 8
--seq_length 512
--checkpoint_dir= ' vul-llm-finetune/outputs/results_0 '
--model_checkpoint_path= ' final_checkpoint '
--delete_whitespaces
--base_model starcoder
--several_funcs_in_batch| 数据集 | 序列长度 | 大功能 | roc auc | F1得分 | GPU | 训练时间(HR) | |
|---|---|---|---|---|---|---|---|
| Qlora | x₁没有p₃ | 512 | 忽略 | 0.53 | 0.65 | 特斯拉T4 | 8.2 |
| x₁没有p₃ | 512 | 包括 | 0.56 | 0.66 | NVIDIA A100 X2 | 3.4 | |
| x₁没有p₃ | 256 | 忽略 | 0.51 | 0.63 | 特斯拉T4 | 2.9 | |
| x₁与p₃ | 512 | 忽略 | 0.68 | 0.14 | RTX 4080 | 22.1 | |
| x₁与p₃ | 512 | 包括 | 0.72 | 0.17 | NVIDIA A100 X2 | 20.4 | |
| x₁与p₃ | 256 | 忽略 | 0.70 | 0.14 | NVIDIA A100 X2 | 18.3 | |
| 洛拉 | x₁没有p₃ | 2048 | 包括 | 0.69 | 0.71 | NVIDIA V100 X8 | |
| x₁与p₃ | 2048 | 包括 | 0.86 | 0.27 | NVIDIA V100 X8 |
在本文中,我们重新创建了Shestov等人的发现。在其中,我们对LLM(WizardCoder)进行了代码漏洞检测。尽管原始作者使用洛拉(Lora)来做到这一点,但我们采用Qlora来减少整体型号的大小,并能够在消费级GPU上训练这种型号。尽管如此,我们看到性能指标的大幅下降,尽管显然该模型仍在进行某种学习。此外,我们对超参数序列长度进行实验,并包括较大的功能。我们能够得出结论,包括大型功能对模型的学习能力是一个严格的阳性,但是由于令人困惑的实验,序列长度的证据尚无定论,其结果比其余的要高得多。
[1] Shestov,A.,Levichev,R.,Mussabayev,R.,Maslov,E.,Cheshkov,A。,&Zadorozhny,P。(2024)。为脆弱性检测提供大型语言模型。 ARXIV预印型ARXIV:2401.17010。取自https://arxiv.org/abs/2401.17010。
[2] Hu,EJ,Shen,Y.,Wallis,P.,Allen-Zhu,Z.,Li,Y.,Wang,S。,&Chen,W。(2021)。 LORA:大型语言模型的低级改编。 ARXIV预印ARXIV:2106.09685。取自https://arxiv.org/abs/2106.09685。
[3] Dettmers,T.,Pagnoni,A.,Holtzman,A。,&Zettlemoyer,L。(2023)。 QLORA:量化LLM的有效固定。 ARXIV预印型ARXIV:2305.14314。取自https://arxiv.org/abs/2305.14314。