mRASP实践

·本样例前提条件:

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

参考资料:

linzehui/mRASP (github.com)

【论文实践】手把手教你用mRASP快速得到任意翻译模型 - 知乎 (zhihu.com)

结束语:

        由于作者并非是计算机类学生,样例的操作流程是根据自己的实战给出的,可能存在一定的差错,还请UU们见谅。如果执行代码时,终端报错,请根据终端给出的提示修改相关代码。另外,UU们可以根据自己的项目,自行在本样例的基础上修改。至于理论部分,请参考官网发布的论文。感谢各位的收看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值