- 1. 先决条件
- 2. 流程
- 简化流程
- 2.1 数据集处理
- 2.2 划分数据集
- 2.3 二值化数据
- 2.4 继续预训练
1. 先决条件
- 从源码安装Fairseq
- 安装transformers
脚本在https://github.com/jazzisfuture/FineTuningXLM-R
平行语料 https://www.aliyundrive.com/s/nBX6YRA
pretrained模型 xlmr-base xlmr-large
- script/tokenize_para.py
- script/split_file.sh
- script/gen.sh
- 修改config文件内的data和pretraing模型位置
- script/finetuning.sh
使用huggingface transformers的tokenizer进行数据处理
XLM-R TLM 训练时模型的输入形式为
为了对模型进行继续预训练我们要将平行语料处理为
的形式 ab
Transformers的tokenizer提供了这将两个句子处理为TLM输入的能力
tokenizer.tokenize(the_data,add_special_tokens=True)
处理语料的core code
def xlm_tok(data,fout):
fout = open(fout, 'w', encoding='utf-8')
tok = AutoTokenizer.from_pretrained("xlm-roberta-base")
for line in tqdm(data):
word_pieces = tok.tokenize(line,add_special_tokens=True)
new_line = " ".join(word_pieces)
fout.write('{}\n'.format(new_line))
fout.close()
2.2 划分数据集
valid 与 test 各为5k句 剩下的为train
脚本来自facebookresearch/XLM
pair=zh-en
PARA_PATH=where/is/you/data
# 随机划分数据集
split_data() {
get_seeded_random() {
seed=""; openssl enc -aes-256-ctr -pass pass:"$seed" -nosalt </dev/zero 2>/dev/null
};
NLINES=`wc -l $1 | awk -F " " '{print }'`;
echo "NLINES: $NLINES"
NTRAIN=$((NLINES - 10000));
NVAL=$((NTRAIN + 5000));
echo $NTRAIN $NVAL
shuf --random-source=<(get_seeded_random 42) | head -$NTRAIN > ;
shuf --random-source=<(get_seeded_random 42) | head -$NVAL | tail -5000 > ;
shuf --random-source=<(get_seeded_random 42) | tail -5000 > ;
}
split_data $PARA_PATH/$pair.spm.all $PARA_PATH/$pair.train $PARA_PATH/$pair.valid $PARA_PATH/$pair.test
2.3 二值化数据
使用Fairseq的二值化
base=/where/is/your/data
fairseq-preprocess \
--only-source \
--srcdict $base/xlmr.base/dict.txt \
--trainpref $base/data/zh-en.train \
--validpref $base/data/zh-en.valid \
--testpref $base/data/zh-en.test \
--destdir data-bin/fintuning \
--workers 20
2.4 继续预训练
使用fairseq的继续预训练需要从源码构建fairseq
使用pip安装的fairseq无法使用fairseq-hydra-train
使用fairseq-hydra-train需要一个config文件
如果提示没有yaml包的话 需要安装pyyaml
fairseq-hydra-train -m --config-dir /where/is/your/config/file \
--config-name finetuning_xlmr.yaml #config文件名
common:
fp16: true
log_format: json
log_interval: 200
model:
_name: roberta # 使用robeta的原因时XLMR也是基于RoBERTa
max_positions: 512
dropout: 0.1
attention_dropout: 0.1
checkpoint:
no_epoch_checkpoints: true
# 需要继续预训练或微调的模型文件
restore_file: /home/featurize/finetuningXlmr/xlmr.base/model.pt
task:
_name: masked_lm
# 二值化数据后的目录
data: /home/featurize/finetuningXlmr/data-bin/fintuning
sample_break_mode: complete
tokens_per_sample: 512
criterion: masked_lm
dataset:
batch_size: 16
# max_tokens: 50
ignore_unused_valid_subsets: true
skip_invalid_size_inputs_valid_test: true
optimizer:
_name: adam
weight_decay: 0.01
adam_betas: (0.9,0.98)
adam_eps: 1e-06
lr_scheduler:
_name: polynomial_decay
warmup_updates: 10000
optimization:
clip_norm: 0
lr: [0.0005]
max_update: 125000
update_freq: [16]
更多的微调config详见https://github.com/pytorch/fairseq/tree/main/examples/roberta
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)