Training
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UbJxLnTC-1575711469237)(/images/photo/dockeye.png)]
数据表示
Sockeye
在训练时间可以凭借--source
以及--target
命令行,按行来读取平行语料中的数据。您还可以提前准备数据并将其作为MXNet NDArrays
格式转储到磁盘。这基本上消除了运行训练时的数据加载时间(因为需要三次传递原始数据),也能减少内存消耗,因为准备好的数据也被放入随机的碎片中(默认情况下每行有100万行)。运行数据表示,你可以按照下面的命令:
对应文件是:prepare_data.py
python -m sockeye.prepare_data
usage: prepare_data.py [-h] --source SOURCE
[--source-factors SOURCE_FACTORS [SOURCE_FACTORS ...]]
--target TARGET [--source-vocab SOURCE_VOCAB]
[--target-vocab TARGET_VOCAB]
[--source-factor-vocabs SOURCE_FACTOR_VOCABS [SOURCE_FACTOR_VOCABS ...]]
[--shared-vocab] [--num-words NUM_WORDS]
[--word-min-count WORD_MIN_COUNT]
[--pad-vocab-to-multiple-of PAD_VOCAB_TO_MULTIPLE_OF]
[--no-bucketing] [--bucket-width BUCKET_WIDTH]
[--max-seq-len MAX_SEQ_LEN]
[--num-samples-per-shard NUM_SAMPLES_PER_SHARD]
[--min-num-shards MIN_NUM_SHARDS] [--seed SEED]
--output OUTPUT
prepare_data.py: error: the following arguments are required: --source/-s, --target/-t, --output/-o
最重要的参数是上面所需要的(--source
, --target
, --output
将确定预处理文件的写入路径。)
- 其他比较重要的参数:
--shared-vocab
: 在语料库的源方和目标方之间产生一个共享的词汇表。--num-samples-per-shard
: 控制共享尺寸。
在训练时间(下一节),用指定的预训练数据来代替源数据和目标数据。
训练
训练是通过sockeye.train
这个模块。基础的用法,下面将会给出:
对应文件:train.py
python -m sockeye.train
usage: train.py [-h] --source SOURCE --target TARGET --validation-source VALIDATION_SOURCE --validation-target VALIDATION_TARGET --output OUTPUT [...]
-
训练一共需要5个参数:
--source
,--target
: 需要提供训练所需要的文件。支持Gzipped
文件,前提是它们的文件名以.gz
结尾--validation-source
,--validation-target
: 需要提供连个验证集;gzip
文件也同上--output
: 给出将写入中间结果和最终结果的输出路径。如果需要中间结果,也可以提供中间结果的输出路径。日志会被写入到模型所在目录的log文件夹内,并且输出。
注:如果想知道更多的参数,可以考虑选择
--help
,来寻求帮助。
数据格式
所有的输入文件应该是UTF-8编码的,用标准的空格来标记。每一行包含一个单独的序列,源文件和目标文件应该包含相同的行数,词汇表将根据训练数据自动创建,并将报告初始化期间验证集的词汇表覆盖率。
Checkpointing and early-stopping
训练是通过Checkpoints
这个概念来管理,而不是epoch
。你可以更新/批次--checkpoint-interval
来指定检查点的间隔。提前结束训练过程可以有效的避免过拟合,例如:一旦对给定的参数设置的检查点的数量没有改善,那么在给定的验证数据上计算的评估指标就会停止训练--max-num-checkpoint-not-improved
。你可以指定一个最大数目的更新/批次通过使用--max-updates
。
Perplexity
是作为提早停止训练的默认标准,但是您也可以使用--optimized-metric
参数选择优化准确性或BLEU 。如果要针对BLEU进行优化,则需要指定 --monitor-bleu
。出于效率原因,sockeye
在每个检查点之后都生成一个子过程,以对验证数据进行解码并计算BLEU。这可能会在结果报告中引入一些延迟,即,可能包括一些checkpoints
没有包括BLEU的结果报告,一些结果数据和以前的checkpoints
对应。这是预期的行为,sockeye内部会按照正确的顺序跟踪结果。
请注意,训练数据和保留的验证数据的评估指标将写入一个名为的制表符分隔文件中metrics
。
对于每一个checkpoints
,训练过程的内部状态都存储到磁盘上。如果训练过程被中断(硬盘问题),你可以再开始sockeye
进程,则可以使用与初始训练相同的参数再次启动sockeye
,训练过程将会从最后一个checkpoint
恢复。请注意,这与使用--params
参数不同。此参数仅用于使用模型参数的预先计算的值来初始化训练,而优化器和系统其他部分的参数是从头开始初始化的。
使用可视化工具监视训练过程
Sockeye
可以使用Tensorboard
兼容格式编写所有评估指标。这样你就可以在浏览器中监控训练进程。要启用此功能,请安装与mxnet兼容的接口mxboard:
pip install mxboard
为了可视化,你仍然需要官方的tensorboard版本(即 pip install tensorboard)。启动tensorboard并将其指向模型目录(或任何父目录):
tensorboard --logdir model_dir
CPU/GPU训练
训练过程默认的是在你自己设备中的第一块GPU设备上执行。你可以选择,指定特定的GPU设备,利用--device-ids
指令,你也可以多个GPU来训练。如果指令为--device-ids -1
这种情况,sockeye
将尝试在你的机器上找到一个空闲的GPU并阻塞,直到有一个可用。锁定机制基于文件,因此假定所有进程都运行在具有相同文件系统的同一台机器上。如果不是这种情况,有可能两个进程将使用相同的GPU和你用完GPU内存。如果你没有或者不想使用GPU,指定--use-cpu
。在这种情况下,预期性能会下降。
多个GPU训练
你可以利用多块GPU,通过指定GPU设备的id:--device-ids 0 1 2 3
,或者指定需要GPU的块数:--device-ids -n
(尝试获取n块GPU,利用上述描述的锁定机制)。这将使用数据并行性进行训练。MXNet将会将数据切分成若干干批次,然后将他们输入到不同的GPU设备中。在这里需要注意的是:你应该增加批次的数量:for k GPU s use --bach-size k*<original_batch_size>
.还要注意,这可能会以句子/秒为单位线性增加您的吞吐量,但不一定会增加模型的收敛速度。
Checkpoint averaging
提高模型性能的一种常见技术是对最后一个检查点的权重进行平均。可以这样做:
python -m sockeye.average <model_dir> -o <model_dir>/model.best.avg.params