提示篇:
本篇博客内容较多,建议耐心阅读。
感谢篇:
十分感谢外研在线技术中心算法团队各位老师在我实习期间给予的帮助,好嗨皮的时光,学到了很多东西。【悄悄告诉你们:他们非常耐心 <( ̄▽ ̄)/】
本文简单记录一下我在实验过程中所接触到的Fairseq的命令参数,并给出一个中-英机器翻译的案例(此案例参考 《使用fairseq从头开始训练一个中英神经机器翻译模型》进行复现操作,不得不说原作大大写得过分清楚了吧,非常适合新手小白,无脑操作啊~~),此外,本片所给的参数命令只是Fairseq的九牛一毛,需要关于Fairseq更详细参数信息的建议阅读官方文档。
Fairseq(-py) is a sequence modeling toolkit that allows researchers and developers to train custom models for translation, summarization, language modeling and other text generation tasks. Github指路
Fairseq (- py)是一个序列建模工具包,允许研究人员和开发人员训练用于翻译、摘要、语言建模和其他文本生成任务的定制模型。
以下安装方式在Linux环境下使用,Windows环境下除pytorch的gpu版本安装方式不同外,其他操作是相同的。安装fairseq可直接使用pip进行安装,其命令为:pip install fairseq
,然而pip方式的安装可能对应需要最新版的同学会有弊端,原因在于pip库相对于 Github源码库会有版本更替的延迟。
# 1. 安装pytorch
conda create -n fairseq python=3.7.5 # conda 创建名字为fairseq的虚拟环境
conda activate fairseq # 激活虚拟环境
conda install pytorch=1.6 torchvision cudatoolkit=10.1 -c pytorch -y # 在fairseq的虚拟环境中执行此命令
# 2. 验证pytorch是否安装成功
python -c "import torch; print(torch.__version__,torvh.version.cuda)" # 安装成功会显示pytorch版本号和对应的cuda版本
# 3. 安装fairseq
git clone https://github.com/pytorch/fairseq
cd fairseq && pip install --editable ./
# 4. 验证fairseq是否安装成功
python -c "import torch; print(fairseq.__version__)" # 安装成功会显示fairseq版本号
# 5. 安装apex(可选,本人没有尝试安装)
git clone https://github.com/NVIDIA/apex
cd apex
pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" \
--global-option="--deprecated_fused_adam" --global-option="--xentropy" \
--global-option="--fast_multihead_attn" ./
#6. 验证apex安装
python -c "import torch; print(fairseq.utils.multi_tensor_12norm_available)" # 安装成功会显示True
新版本和旧版本的安装大致相同,主要区别在于pytorch和其对应的cuda的版本较之前有所变动,其他安装操作一样这里不再赘述,只给出pytorch的安装过程。
# 1. pytorch安装
conda create -n fairseq2 python=3.7.5 # conda 创建名字为fairseq的虚拟环境
conda activate fairseq2 # 激活虚拟环境
conda install pytorch=1.10.1 torchvision cudatoolkit=10.2 -c pytorch -y
参数 | 功能 |
---|---|
–user-dir | 自定义扩展(任务或架构)的python模块的路径 |
–criterion | 可选: adaptive_loss…[见原文]默认是:cross_entropy |
–tokenizer | 可选:moses, nltk, space |
–bpe | sentencepiece,subword_nmt,bert,等等;默认:bleu |
–optimizer | adam,sgd,adagrad,等等 |
–task | 任务类型,可以自定义(–user-dir),默认是:translation |
注意1: 上述命令为通用命令参数,所有模块均可使用;
注意2: 以下介绍均已目前的最新版为依据(目前版本是:fairseq1.0.0a0),旧版本的命令可能会有略微的差异。
注意3: 下面介绍的命令参数是我个人在使用的过程中用到过的,当然不止这些命令参数,你可以使用fairseq-preprocess/train/generate/interactive --help
去获取他们的所有可用参数名字和用法,或者阅读官方文档。
参数 | 功能 |
---|---|
-s,–source-lang | 源语言 |
-t,–target-lang | 目标语言 |
–trainpref | 训练文件前缀(也用于构建字典) |
–validpref | 逗号分隔,有效的文件前缀(从训练集丢失的用<unk>代替) |
–testpref | 逗号分割,测试文件前缀(没有的单词用<unk>代替) |
–destdir | 目标文件,默认:data-bin(预处理后的二进制文件) |
–tgtdict | 重新给定目标字典 (用于模型的多数据集测试,修改数据集的字典大小与模型一致) |
–srcdict | 重新给定源字典(用于模型的多数据集测试,修改数据集的字典大小与模型一致) |
参数 | 功能 |
---|---|
–num-workers | 数据需要一次加载几个子进程,默认:1 |
–skip-invalid-size-inputs-valid-test | 忽视验证集和测试集中太长或太短的行 |
–max-tokens | 一个batch中的最大token数 |
–batch-size, --max-sentences | 一个batch的数量 |
注意: 部分功能译文可能存在偏差,建议边看边参考原文。
参数 | 功能 |
---|---|
–distributed-world-size | 所有节点上的 gpu 总数(默认值: 所有可见的 gpu);默认:1 |
–distributed-num-procs | 到 fork 的进程总数(默认值: 所有可见的 gpu);默认:1 |
–distributed-rank | 当前任务等级;默认:0 |
–distributed-backend | 分布式后端;默认:nccl |
–distributed-init-method | 通常是 tcp://hostname: 端口,用于建立初始连接 |
–distributed-port | 端口号(如果使用-distributed-init-method 则不需要);默认:-1 |
–device-id, --local_rank | 使用哪个 gpu (通常是自动配置的);默认:0 |
–distributed-no-spawn | 即使多个 gpu 可见,也不要产生多个进程;默认:False |
–ddp-backend | 可能的选择: c10d,full sharded,legacy ddp,no c10d,pytorch ddp,slowmo;分布式并行后端;默认:“pytorch_ddp” |
–ddp-comm-hook | Possible choices: none, fp16;communication hook;Default: “none” |
… | … |
--arch, -a
# fairseq中集成了大量的模型类型,只需按照自己的任务需求选择即可,也可以自己进行训练。
参数 | 功能 |
---|---|
–max-epoch | 特定轮数强制停止训练,默认:0 |
–max-update | 特定update处停止训练,默认:0 |
–lr | 学习率,会根据(-lr-scheduler)有所不同 |
–stop-min-lr(与旧版本名字不同) | 学习率到达这个最小值时停止训练,默认:-1.0 |
checkpoint部分,占位。
CUDA_VISIBLE_DEVICES=0 fairseq-train data-bin/iwslt14.tokenized.de-en \
--optimizer nag --lr 0.25 --clip-norm 0.1 --dropout 0.2 --max-tokens 4000 \
--arch fconv_iwslt_de_en --save-dir checkpoints/fconv
参数 | 功能 |
---|---|
–path | 模型文件路径 |
–remove-bpe | 移除bpe标记 |
–beam | beam size;默认:5 |
–nbest | 要输出的个数,默认:1 |
上述的命令在这里都是可以使用的,不再记录。
CUDA_VISIBLE_DEVICES='-1' fairseq-interactive /data-bin --user-dir /data1/home/mRASP2/mcolt -s zh -t en --task translation_w_langtok --tokenizer moses --bpe subword_nmt --bpe-codes /data1/home/mRASP/data/vocab/codes.bpe.32000 --nbest 3 --remove-bpe --path /data1/home/mRASP2/evaltest/model/pretrain/checkpoint_6no.pt
注意: 这里的bpe以及bpe-codes的设置。
暂未使用
暂未使用
Task存储字典,并提供助手来加载/迭代数据集、初始化模型/标准和计算损失。可以通过 – task 命令行参数选择任务,一旦选中,任务可能会为进一步的配置公开附加的命令行参数。
此部分可以参考官网文档的《Tutorial: Classifying Names with a Character-Level RNN》,这里给出了一个更加详细的案例。
fairseq.tasks.register_task(name, dataclass=None)
# 示例:
@register_task('classification')
class ClassificationTask(FairseqTask):
(...)
如清洗、分词、BPE、拆分出训练集、验证集、测试集
fairseq-preprocess
fairseq-train
生成式解码:fairseq-generate;交互式解码:fairseq-interactive
这里只给出了大概的框架,详细的操作流程,请查看原作大大的博客 ⇒ \Rightarrow ⇒《使用fairseq从头开始训练一个中英神经机器翻译模型》。
fairseq-preprocess --source-lang ${src} --target-lang ${tgt} \
--trainpref ${data_dir}/train --validpref ${data_dir}/valid --testpref ${data_dir}/test \
--destdir ${data_dir}/data-bin
CUDA_VISIBLE_DEVICES=1 nohup fairseq-train ${data_dir}/data-bin --arch transformer \
--source-lang ${src} --target-lang ${tgt} \
--optimizer adam --lr 0.0001 --adam-betas '(0.95, 0.98)' \
--lr-scheduler inverse_sqrt --max-tokens 4096 --dropout 0.35 \
--criterion label_smoothed_cross_entropy --label-smoothing 0.1 \
--max-update 200000 --warmup-updates 4000 --warmup-init-lr '1e-07' \
--keep-last-epochs 10 --num-workers 8 \
--save-dir ${model_dir}/checkpoints &
fairseq-generate ${data_dir}/data-bin \
--remove-bpe \
--path ${model_dir}/checkpoints/checkpoint_best.pt \
--batch-size 32 --beam 8 > ${data_dir}/result/bestbeam8.txt
CUDA_VISIBLE_DEVICES=1 fairseq-interactive ${data_dir}/data-bin \
--input ${data_dir}/test.zh \
--path ${model_dir}/checkpoints/checkpoint_best.pt \
--batch-size 1 --beam 8 --remove-bpe > ${data_dir}/result/bestbeam8.txt