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们可以根据自己的项目,自行在本样例的基础上修改。至于理论部分,请参考官网发布的论文。感谢各位的收看!

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值