推荐安装gpu版本的PaddlePalle,以cuda11.7的paddle为例,安装命令如下:
python -m pip install paddlepaddle-gpu==2.6.0.post117 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
安装其他依赖:
pip install -r requirements.txt
下载dureader中文数据集:
cd data
wget https://paddlenlp.bj.bcebos.com/datasets/dureader_dual.train.jsonl
export CUDA_VISIBLE_DEVICES=0
python train.py --do_train \
--model_name_or_path rocketqa-zh-base-query-encoder \
--output_dir ./checkpoints \
--train_data ./data/dureader_dual.train.jsonl \
--overwrite_output_dir \
--fine_tune_type sft \
--sentence_pooling_method cls \
--num_train_epochs 3 \
--per_device_train_batch_size 64 \
--learning_rate 3e-5 \
--train_group_size 4 \
--recompute \
--passage_max_len 512 \
--use_matryoshka
model_name_or_path
: 选择预训练模型,可选rocketqa-zh-base-query-encoderoutput_dir
: 模型保存路径train_data
: 训练数据集路径,这里使用的是dureader中文数据集overwrite_output_dir
: 是否覆盖模型保存路径,默认为Falsefine_tune_type
: 训练模式,可选sft和lora, bitfit等策略sentence_pooling_method
: 句子池化方法,可选cls和mean, cls为CLS层,mean为平均池化num_train_epochs
: 训练轮数per_device_train_batch_size
: 单卡训练batch大小learning_rate
: 学习率train_group_size
: 每个训练集正负样本的数据,默认为8,例如train_group_size=4,则每个训练集包含1个正样本和3个负样本max_example_num_per_dataset
: 每个训练集的最大样本数,默认为100000000recompute
: 是否重新计算,默认为Falsequery_max_len
: query的最大长度,默认为32query_instruction_for_retrieval
: query的检索指令,默认为Nonepassage_instruction_for_retrieval
: passage的检索指令,默认为Nonepassage_max_len
: passage的最大长度,默认为512use_matryoshka
: 是否使用俄罗斯套娃策略(matryoshka),默认为Falsematryoshka_dims
: 俄罗斯套娃策略的维度,默认为[64, 128, 256, 512, 768]matryoshka_loss_weights
: 俄罗斯套娃策略的损失权重,默认为[1, 1, 1, 1, 1]use_inbatch_neg
: 是否使用in batch negatives策略,默认为Falseuse_flash_attention
: 是否使用flash attention,默认为Falsetemperature
: in batch negatives策略的temperature参数,默认为0.02negatives_cross_device
: 跨设备in batch negatives策略,默认为Falsemargin
: in batch negatives策略的margin参数,默认为0.2
单卡训练效率过低,batch_size较小,建议使用多卡训练,对于对比学习训练推荐使用大batch_size,多卡训练,示例命令如下:
python -m paddle.distributed.launch --gpus "1,2,3,4" train.py --do_train \
--model_name_or_path rocketqa-zh-base-query-encoder \
--output_dir ./checkpoints \
--train_data ./data/dual.train.json \
--overwrite_output_dir \
--fine_tune_type sft \
--sentence_pooling_method cls \
--num_train_epochs 3 \
--per_device_train_batch_size 32 \
--learning_rate 3e-5 \
--train_group_size 8 \
--recompute \
--passage_max_len 512 \
--use_matryoshka
llama, bloom的训练需要合并参数,bert,roberta则跳过此步骤
python merge_tp_params.py --model_name_or_path outputs/checkpoint-30
评估脚本:
export CUDA_VISIBLE_DEVICES=0
python evaluation/benchmarks.py --model_type bert \
--query_model checkpoints/checkpoint-1500 \
--passage_model checkpoints/checkpoint-1500 \
--query_max_length 64 \
--passage_max_length 512 \
--evaluate_all
model_type
: 模型的类似,可选bert或roberta等等query_model
: query向量模型的路径passage_model
: passage向量模型的路径query_max_length
: query的最大长度passage_max_length
: passage的最大长度evaluate_all
: 是否评估所有的checkpoint,默认为False,即只评估指定的checkpoint
[1] Aditya Kusupati, Gantavya Bhatt, Aniket Rege, Matthew Wallingford, Aditya Sinha, Vivek Ramanujan, William Howard-Snyder, Kaifeng Chen, Sham M. Kakade, Prateek Jain, Ali Farhadi: Matryoshka Representation Learning. NeurIPS 2022