·本样例前提条件:
Linux系统(有用到GPU)
python=3.8
numpy==1.18
1.创建新项目文件夹
其中,除了codes.bpe.32000、vocab.bpe.32000、bin_finetune.sh、bin_pretrain.sh不是文件夹,其余均为文件夹。codes.bpe.32000、vocab.bpe.32000可从官网下载,自行粘贴到txt文档中。bin_finetune.sh、bin_pretrain.sh可从mRASP-->experiments-->example文件夹下找到。命名格式严格遵照图中内容。
2.放入数据集(以中译英为例,zh-en)
打开Project_name-->data-->raw文件夹。
①在train文件夹下创建en、zh、en_zh三个文件夹,分别放入train.en,train.zh,train.en、train.zh训练集文件(txt)。(详见下图)
②在dev文件夹下创建zh2en文件夹,放入dev.en、dev.zh两个验证集文件(txt)。
③在test文件夹下创建zh2en文件夹,放入test.en、test.zh两个测试集文件(txt)。
格式:
(数据集的命名严格遵照图中格式)
3.加入zh-en词典
打开Project_name-->dictionaries文件夹。加入zh-en.txt词典。如果实际应用中还有加入其他词典如zh-de.txt(注意是zh-de.txt,不是de-zh.txt)等,也按照以下方式修改。
打开mRASP-->preprocess-->tools-->ras-->replace_word.py,将第21行(langs = [l for l in args.langs.split(";") if l != "en"])、第49行(_pair_name = ["en", "-", lang])、第105行(dict_name = "en-" + _lang)代码中的en,修改为zh。
4.数据预处理
打开Project_name-->configs-->preprocess文件夹。
根据mRASP-->experiments-->example文件夹中所给的train.yml与dev.yml例子进行修改得到train_zh2en.yml和dev_zh2en.yml。
格式:
·以下给出修改参考(请读者根据自己存放文件的路径更替代码中的"~/"部分)。
train_zh2en.yml部分:
raw_data_path: ~/mRASP/Project_name/data/raw/train
merged_output_path: ~/mRASP/Project_name/merged_data/zh2en
output_main_path: ~/mRASP/Project_name/data/prep/zh2en/train
final_vocab_path: ~/mRASP/Project_name/vocab
configs_subdir: configs
cleaned_subdir: cleaned
logs_subdir: logs
vocab_subdir: vocab
output_subdir: output
preprocess_steps_list: clean:subword:merge:ras
file_prefix: train
learn: false
subword_bpe_merge_ops: 32000
pairs: zh_en
directions: zh2en
languages: zh;en
default_pairs:
deduplicate: false
keep_lines_percent: '1.0'
shuffle: false
default_langs:
do_normalize_punctuations: true
tokenizer: None
zh:
do_normalize_punctuations: true
tokenizer: jieba
en:
do_normalize_punctuations: true
tokenizer: MosesTokenizer
ras:
dict_path: ~/mRASP/Project_name/dictionaries
vocab_size: 2000
src: zh
trg: en
dev_zh2en.yml部分:
raw_data_path: ~/mRASP/Project_name/data/raw/dev
merged_output_path: ~/mRASP/Project_name/dev_data/zh2en
output_main_path: ~/mRASP/Project_name/data/prep/zh2en/dev
final_vocab_path: ~/mRASP/Project_name/vocab
configs_subdir: configs
cleaned_subdir: cleaned
logs_subdir: logs
vocab_subdir: vocab
output_subdir: output
preprocess_steps_list: clean:subword:merge
file_prefix: dev
learn: false
subword_bpe_merge_ops: 32000
pairs: zh_en
directions: zh2en
languages: zh;en
default_pairs:
deduplicate: false
keep_lines_percent: '1.0'
shuffle: false
default_langs:
do_normalize_punctuations: true
tokenizer: None
zh:
do_normalize_punctuations: true
tokenizer: jieba
en:
do_normalize_punctuations: true
tokenizer: MosesTokenizer
src: zh
trg: en
在终端分别执行:
bash ~/mRASP/preprocess/multilingual_preprocess_main.sh ~/mRASP/Project_name/configs/preprocess/train_zh2en.yml
bash ~/mRASP/preprocess/multilingual_preprocess_main.sh ~/mRASP/Project_name/configs/preprocess/dev_zh2en.yml
如果不出错应该得到以下结果:
打开mRASP-->Project_name-->bin_finetune.sh文件,修改代码:
#!/usr/bin/zhv bash
PROJECT_ROOT=~/mRASP
num_cpus=30
subword_bpe_merge_ops=32000
# preprocess fine-tune train data
fairseq-preprocess \
--source-lang zh --target-lang en \
--srcdict ${PROJECT_ROOT}/Project_name/vocab/vocab.bpe.${subword_bpe_merge_ops} \
--tgtdict ${PROJECT_ROOT}/Project_name/vocab/vocab.bpe.${subword_bpe_merge_ops} \
--trainpref ${PROJECT_ROOT}/Project_name/merged_data/zh2en/train \
--validpref ${PROJECT_ROOT}/Project_name/dev_data/zh2en/dev \
--destdir ${PROJECT_ROOT}/Project_name/data/fine-tune/zh2en \
--workers ${num_cpus}
# preprocess fine-tune test data
fairseq-preprocess \
--source-lang zh --target-lang en \
--srcdict ${PROJECT_ROOT}/Project_name/vocab/vocab.bpe.${subword_bpe_merge_ops} \
--tgtdict ${PROJECT_ROOT}/Project_name/vocab/vocab.bpe.${subword_bpe_merge_ops} \
--testpref ${PROJECT_ROOT}/Project_name/dev_data/zh2en/dev \
--destdir ${PROJECT_ROOT}/Project_name/data/test/zh2en/wmt14_head100/bin \
--workers ${num_cpus}
mkdir -p ${PROJECT_ROOT}/Project_name/data/test/zh2en/wmt14_head100/raw
cp ${PROJECT_ROOT}/Project_name/data/raw/test/zh2en/* ${PROJECT_ROOT}/Project_name/data/test/zh2en/wmt14_head100/raw/
在终端执行:
bash ~/mRASP/Project_name/bin_finetune.sh
得到以下文件:
5.微调
打开mRASP-->Project_name-->configs-->eval,修改其中的yml格式模版,并将该模版更名为zh2en_eval.yml;打开mRASP-->Project_name-->configs-->train-->fine-tune,修改其中的yml格式模版,并将该模版更名为zh2en_transformer_big.yml。
zh2en_eval.yml:
beam_size: 5
eval_batch_size: 4
max_len_a: 0
max_len_b: 256
length_penalty: 0.5
test_data_path: ~/mRASP/Project_name/data/test
testset: zh2en/wmt14_head100
klist: 2:3:5
bleu_type: tok
post_command: "| sed -e s'|LANG_TOK_DE ||g' "
ref_tokenizer: jieba
zh2en_transformer_big.yml:
src: zh
tgt: en
model_arch: transformer_wmt_en_de_big
encoder_learned_pos: true
decoder_learned_pos: true
data_path: ~/mRASP/Project_name/data/fine-tune/zh2en
model_dir: ~/mRASP/Project_name/models/fine-tune/zh2en
pretrain_model_dir: ~/mRASP/Project_name/models/pre-train/transformer_big
update_freq: 1
log_interval: 5
save_interval_updates: 500
max_update: 3000
max_tokens: 2048
max_source_positions: 300
max_target_positions: 300
lr: 5e-4
dropout: 0.3
activation_fn: gelu
criterion: label_smoothed_cross_entropy
reset_optimizer: true
reset_lr_scheduler: true
reset_dataloader: true
reset_meters: true
lr_scheduler: inverse_sqrt
weight_decay: 0.0
clip_norm: 0.0
warmup_init_lr: 1e-07
label_smoothing: 0.1
fp16: true
seed: 9823843
稍微展示一下文件结构:
其中transformer_big文件夹是自己建的,文件夹下的checkpoint_best.pt为预训练得到的模型。这里偷懒直接用官网上的mRASP-PC32-6enc6dec.pt作为预训练模型(并修改名称为checkpoint_best.pt)了,可根据实际情况自行训练预训练模型。
在终端执行:
export CUDA_VISIBLE_DEVICES=0,1,2 && export EVAL_GPU_INDEX=2 && bash ~/mRASP/train/fine-tune.sh ~/mRASP/Project_name/configs/train/fine-tune/zh2en_transformer_big.yml ~/mRASP/Project_name/configs/eval/zh2en_eval.yml
参考资料:
【论文实践】手把手教你用mRASP快速得到任意翻译模型 - 知乎 (zhihu.com)
结束语:
由于作者并非是计算机类学生,样例的操作流程是根据自己的实战给出的,可能存在一定的差错,还请UU们见谅。如果执行代码时,终端报错,请根据终端给出的提示修改相关代码。另外,UU们可以根据自己的项目,自行在本样例的基础上修改。至于理论部分,请参考官网发布的论文。感谢各位的收看!