LineVul实验复现及相关问题

  • A+
所属分类:笔记

最近在复现 LineVul 这篇文章的实验,本文主要用于简化文章复现流程和记录复现过程中出现的问题。

1 安装依赖环境

pip install gdown
pip install transformers
pip install captum
pip install torch torchvision torchaudio
pip install numpy
pip install tqdm
pip install scikit-learn
pip install pandas
pip install tokenizers

2 下载数据

#### 下载数据集 #### (需要科学上网)
cd data/big-vul_dataset
gdown https://drive.google.com/uc?id=1h0iFJbc5DGXCXXvvR6dru_Dms_b2zW4V
gdown https://drive.google.com/uc?id=1ldXyFvHG41VMrm260cK_JEPYqeb6e6Yw
gdown https://drive.google.com/uc?id=1yggncqivMcP0tzbh8-8Eu02Edwcs44WZ
cd ../..
#### 下载模型 ####
cd linevul/saved_models/checkpoint-best-f1
gdown https://drive.google.com/uc?id=1oodyQqRb9jEcvLMVVKILmu8qHyNwd-zH
cd ../../..
#### 下载 codebert-base ####
cd linevul
mkdir microsoft
cd microsoft
git lfs install
git clone https://huggingface.co/microsoft/codebert-base

3 实验复现

根据GPU显存大小合理设置batchsize。

3.1 RQ1复现

cd linevul
python linevul_main.py \
  --output_dir=./saved_models \
  --model_type=roberta \
  --tokenizer_name=microsoft/codebert-base \
  --model_name_or_path=microsoft/codebert-base \
  --do_train \
  --do_test \
  --train_data_file=../data/big-vul_dataset/train.csv \
  --eval_data_file=../data/big-vul_dataset/val.csv \
  --test_data_file=../data/big-vul_dataset/test.csv \
  --epochs 10 \
  --block_size 512 \
  --train_batch_size 16 \
  --eval_batch_size 16 \
  --learning_rate 2e-5 \
  --max_grad_norm 1.0 \
  --evaluate_during_training \
  --seed 123456  2>&1 | tee train.log

3.2 RQ2复现

cd linevul
python linevul_main.py \
  --model_name=12heads_linevul_model.bin \
  --output_dir=./saved_models \
  --model_type=roberta \
  --tokenizer_name=microsoft/codebert-base \
  --model_name_or_path=microsoft/codebert-base \
  --do_test \
  --do_local_explanation \
  --top_k_constant=10 \
  --reasoning_method=all \
  --train_data_file=../data/big-vul_dataset/train.csv \
  --eval_data_file=../data/big-vul_dataset/val.csv \
  --test_data_file=../data/big-vul_dataset/test.csv \
  --block_size 512 \
  --eval_batch_size 512

3.3 RQ3复现

cd linevul
python linevul_main.py \
  --model_name=12heads_linevul_model.bin \
  --output_dir=./saved_models \
  --model_type=roberta \
  --tokenizer_name=microsoft/codebert-base \
  --model_name_or_path=microsoft/codebert-base \
  --do_test \
  --do_sorting_by_line_scores \
  --effort_at_top_k=0.2 \
  --top_k_recall_by_lines=0.01 \
  --top_k_recall_by_pred_prob=0.2 \
  --reasoning_method=all \
  --train_data_file=../data/big-vul_dataset/train.csv \
  --eval_data_file=../data/big-vul_dataset/val.csv \
  --test_data_file=../data/big-vul_dataset/test.csv \
  --block_size 512 \
  --eval_batch_size 512

4 报错及解决办法

1. 出现 Unexpected key(s) in state_dict: "roberta.embeddings.position_ids", "encoder.roberta.embeddings.position_ids" 错误。

LineVul实验复现及相关问题

报错原因:transformers库的版本过高,回退版本。

2. 出现 ImportError: cannot import name 'SAVE_STATE_WARNING' from 'torch.optim.lr_scheduler' 错误。

LineVul实验复现及相关问题

报错原因:transformers库的版本过低,更新版本。

经实际测试,版本为 transformers==4.30.0 时可正常运行。

5 参考

GitHub - awsm-research/LineVul: A Transformer-based Line-Level Vulnerability Prediction

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: