快速使用opennmt-tf
1 快速使用opennmt
http://opennmt.net/OpenNMT-tf/quickstart.html#
新建项目目录如下:
1.1 准备数据
- 获取 10k 条 English-German 预料对
wget https://s3.amazonaws.com/opennmt-trainingdata/toy-ende.tar.gz
tar xf toy-ende.tar.gz
cd toy-ende
windows直接到相应地址下载即可
- 根据训练文件获取 word vocabularies
onmt-build-vocab --size 50000 --save_vocab src-vocab.txt src-train.txt
onmt-build-vocab --size 50000 --save_vocab tgt-vocab.txt tgt-train.txt
- 准备ymal 配置文件:data.yml
model_dir: run/
data:
train_features_file: toy-ende/src-train.txt
train_labels_file: toy-ende/tgt-train.txt
eval_features_file: toy-ende/src-val.txt
eval_labels_file: toy-ende/tgt-val.txt
source_words_vocabulary: toy-ende/src-vocab.txt
target_words_vocabulary: toy-ende/tgt-vocab.txt
最好data.yml和run和语言文件放在统一目录下,更容易管理, 推荐下面的方式
model_dir: run/
data:
train_features_file: src-train.txt
train_labels_file: tgt-train.txt
eval_features_file: src-val.txt
eval_labels_file: tgt-val.txt
source_words_vocabulary: src-vocab.txt
target_words_vocabulary: tgt-vocab.txt
1.2 训练数据
1.2.1 训练过程
下面的命令将启动基于RNN的小序列到序列模型的训练和评估循环。
onmt-main train_and_eval --model_type NMTSmall --auto_config --config data.yml
--auto_config:选择此类型号的最佳设置
训练结束后,可以看到bleu分数:
1.2.2 训练结果
训练将定期在run/目录中生成检查点。要监视培训进度,控制台中会显示一些日志。但是,为了直观地监控培训,可以使用
tensorboard --logdir="run"
tensorboard --logdir="."
注意:命令最好在run目录下调用,否则board不显示图形
显示内容
训练和调整损失 training and evaluation loss
训练速度training speed
学习率 learning rate
梯度规范 gradients norm
计算图 computation graphs
单词嵌入向量word embeddings
解码器采样概率 decoder sampling probability
1.2.3 复制训练
例如,如果您的计算机有4个GPU,只需添加--num_gpus选项:
onmt-main train [...] --num_gpus 4
可以在4个GPU中并行计算,
请注意,评估和推断将在单个设备上运行。
1.2.4 并行训练
OpenNMT-tf还支持使用复制图的异步分布式训练。在此模式下,每个图形副本独立处理batch,计算梯度,并异步更新共享参数集。
要启用分布式培训,用户应使用train_and_eval运行类型并在命令行上进行设置:
chief worker 负责训练循环并管理检查点
list workor 运行训练循环的工作主机列表
list parameter server用于同步参数
然后应在每个具有所选任务的主机上启动训练实例,例如:
CUDA_VISIBLE_DEVICES=0 onmt-main train_and_eval [...] \
--ps_hosts localhost:2222 \
--chief_host localhost:2223 \
--worker_hosts localhost:2224,localhost:2225 \
--task_type worker \
--task_index 1
将在当前计算机和第一个GPU上启动worker 1。通过CUDA_VISIBLE_DEVICES正确设置,可以在单个多GPU机器上运行异步分布式培训。
和复制训练的区别在于:可以在多个机器上并行训练
有关更多详细信息,请参阅文档tf.estimator.train_and_evaluate。另请参阅tensorflow / ecosystem,将分布式培训与Docker或Kubernetes等开源框架集成。
1.2.5 重新启动训练
由于opennmt在运行过程中会记录检查点,把之前保存的结果记录下来,中断后,和初始运行命令一样,即可以继续执行
# Start the training.
onmt-main train_and_eval --model_type NMTSmall --auto_config --config data.yml
# ... the training is interrupted or stopped ...
# Continue from the latest checkpoint.
onmt-main train_and_eval --model_type NMTSmall --auto_config --config data.yml
注意:如果train是因为train_steps到达而停止,应该先继续增加此值
1.2.6 微调训练
retraining对于微调现有模型也很有用。例如,在机器翻译中,与从头开始训练相比,将通用模型适应特定域往往速度更快。
OpenNMT-tf提供了一些功能,使这个过程更容易:
-
该脚本onmt-update-vocab可用于更改检查点中包含的单词词汇表,同时保持共享单词的学习权重(例如,添加域术语)
-
命令行参数--checkpoint_path可用于从新的训练状态开始加载现有检查点的权重(例如: 使用新的学习速率计划和优化器变量)
1.3 翻译数据
一旦训练保存了检查点,就可以执行该命令:
//结果输出在控制台
onmt-main infer --auto_config --config data.yml --features_file src-test.txt
//结果保存在文件中
onmt-main infer --auto_config --config="data.yml" --features_file="src-test.txt" --predictions_file="predict.txt"
默认情况下将使用最新的检查点,翻译结果将打印在标准输出上。
1.4 Inference推理
1.4.1 检查点平均
该脚本onmt-average-checkpoints可用于平均多个检查点的参数,通常可提高模型性能。例如:
onmt-average-checkpoints \
--model_dir run/baseline-enfr \
--output_dir run/baseline-enfr/avg \
--max_count 5
将平均run/baseline-enfr模型目录中5个最新检查点的参数,并在目录中保存新的检查点run/baseline-enfr/avg。
然后,通过设置--checkpoint_path选项执行推理,例如:
onmt-main infer \
--config config/my_config.yml \
--features_file newstest2014.en.tok \
--predictions_file newstest2014.en.tok.out \
--checkpoint_path run/baseline-enfr/avg/model.ckpt-200000
要在培训期间控制检查点的保存,请在配置文件中配置以下选项:
train:
# (optional) Save a checkpoint every this many steps.
save_checkpoints_steps: 5000
# (optional) How many checkpoints to keep on disk.
keep_checkpoint_max: 10
1.4.2 采样 Sampling
如Edunov等人所述,来自输出分布的采样预测可以是用于反向翻译的有效解码策略。
要启用此功能,您应配置参数sampling_topk。可能的值是:
k,样本中k个最有可能的tokens
0,来自完整输出分布的样本
1,没有采样(默认)例如:
params:
beam_width: 1
sampling_topk: 0
sampling_temperature: 1
1.4.3 N最佳列表N-best list
可以使用定向搜索为模型生成n个最佳列表。您可以在配置文件中配置它:
infer:
n_best: 5
使用此选项,每个输入行将在输出中简单地生成N个连续行,从最佳到最差排序。请注意,N不能大于配置beam_width。
1.4.3 得分Scoring
OpenNMT-tf脚本还可用于通过score运行类型对现有翻译进行评分。它需要设置2个命令行选项:
--features_file,输入标签;
--predictions_file,翻译文件。
例如:
onmt-main score \
--config config/my_config.yml \
--features_file newstest2014.en.tok \
--predictions_file newstest2014.en.tok.out
onmt-main score --auto_config --config="data.yml" --features_file="src-test.txt" --predictions_file="predict.txt"
onmt-main score --auto_config --config="data.yml" --features_file="tgt-test.txt" --predictions_file="predict_04261523.txt"
该命令将在标准输出上写入以下格式为每行生成的分数:
<score> ||| <translation>
<score>是:提供的翻译的负对数似然结果。
提示:N-best list和score联合使用可用于重新排名翻译。
1.5 服务
1.5.1 导出SavedModel
OpenNMT-tf定期导出模型以在其他环境中进行推理,例如使用TensorFlow服务。
模型导出包含推理所需的所有信息:图形定义,权重和外部资产(如词汇文件)。它通常在磁盘上看起来像这样:
toy-ende/export/latest/1507109306/
├── assets
│ ├── src-vocab.txt
│ └── tgt-vocab.txt
├── saved_model.pb
└── variables
├── variables.data-00000-of-00001
└── variables.index
1.5.2 自动导出
在train_and_eval运行类型中,可以按照一个或多个导出计划自动导出模型:
last:export/latest在每次评估后导出模型(默认);
final:模型export/final在训练结束时导出;
best:export/best只有在到目前为止达到最佳评估损失时才会导出模型。导出计划由配置文件部分中的exporters字段设置eval,例如:
eval:
exporters: best
1.5.3 手动导出
此外,可以使用export运行类型手动导出模型。默认情况下,手动导出的模型位于export/manual/模型目录中;
可以使用命令行选项配置自定义目标--export_dir_base,例如:
onmt-main export --export_dir_base ~/my-models/ende --auto-config --config my_config.yml
1.5.4 运行SavedModel
使用导出的模型时,您需要知道模型的输入和输出节点。您可以使用TensorFlow提供的脚本: saved_model_cli进行检查,例如:
saved_model_cli show --dir toy-ende/export/latest/1507109306/ \
--tag_set serve --signature_def serving_default
examples/ 目录中提供了一些使用导出模型的示例:examples/serving 使用TensorFlow服务为模特服务examples/cpp 使用TensorFlow C ++ API进行推理
注意:因为使用的Python函数tf.py_func未在图中序列化,所以模型导出不支持图中分词,并且文本输入应该被分词。
1.6 更多
-
下载更大的训练集,例如从[WMT任务中]
-
下载训练一个更大的模型,像 Transformer
-
运行现有的培训
-
发现调整超参数的配置参考
2 opennmt-tf常用命令
2.1 模型配置
2.1.1 Catalog目录
OpenNMT-tf附带了一组在目录中定义的标准模型。可以使用--model_type命令行选项直接选择这些模型,例如:
onmt-main train --model_type Transformer [...]
2.1.2 Custom models自定义模型
自定义模型模型是从Python代码定义的,以实现高水平的建模自由度。它们是opennmt.models.Model使用用户定义模块的实例。其中一些模块定义为包含其他模块,可用于设计复杂的体系结构:
opennmt.encoders.ParallelEncoder
opennmt.encoders.SequentialEncoder
opennmt.inputters.MixedInputter
opennmt.inputters.ParallelInputter
例如,这些容器模块可用于实现多源输入,多模式训练,混合字/字符嵌入和任意复杂的编码器架构(例如,混合卷积,RNN,自注意等)。
config/models Git存储库中的目录中提供了一些示例。
应使用--model命令行选项选择自定义模型文件,例如:
onmt-main train --model config/models/custom_model.py [...]
2.2 参数配置
具体参数含义详见
http://opennmt.net/OpenNMT-tf/configuration.html
2.2.1 自动配置Automatic configuration
预定义模型声明了默认参数,这些参数应该提供开箱即用的可靠性能。要启用自动配置,请使用--auto_config标志:
onmt-main train_and_eval --model_type Transformer --config my_data.yml --auto_config
用户提供的my_data.yml文件将极少需要数据配置。您可能还想配置检查点相关设置,记录频率和培训步骤数。在训练开始时,将记录实际使用的配置值。如果要更改其中一些,只需在配置文件中添加该参数即可覆盖默认值。
注意:默认训练值通常假设GPU具有至少8GB的内存和大的系统内存:如果遇到GPU内存不足问题,请尝试覆盖batch_size较低的值。
如果遇到CPU内存不足问题,请尝试覆盖sample_buffer_size固定值。
2.2.2 多个配置文件Multiple configuration files
命令行接受多个配置文件,以便某些部分可以重复使用,例如:
onmt-main [...] --config config/opennmt-defaults.yml config/optim/adam_with_decay.yml \
config/data/toy-ende.yml
如果配置密钥重复,则最右侧配置文件中定义的值具有优先级。如果您不确定实际使用的配置或只是更喜欢使用单个文件,请考虑使用merge_config脚本:
onmt-merge-config config/opennmt-defaults.yml config/optim/adam_with_decay.yml \
config/data/toy-ende.yml > config/my_config.yml
2.2.3 TensorFlow会话 session
命令行选项--session_config可用于配置为执行TensorFlow图而创建的TensorFlow会话。
该选项采用包含tf.ConfigProto以文本格式序列化的消息的文件。
以下是启用allow_growthGPU选项的示例:
$ cat config/session_config.txt
gpu_options {
allow_growth: true
}
onmt-main [...] --session_config config/session_config.txt
有关可能的选项和值,请参阅该tf.ConfigProto文件。
2.3 性能查看
lspci:查看pci设备
image.pngnvidia-smi:查看GPU的使用情况
image.pngwatch -n 1 nvidia-smi 实时显示
显存占用和GPU占用是两个不一样的东西,显卡是由GPU和显存等组成的,显存和GPU的关系有点类似于内存和CPU的关系。
image.pnghtop查看使用率:
image.pngPID:进行的标识号USER:运行此进程的用户
PRI:进程的优先级
NI:进程的优先级别值,默认的为0,可以进行调整VIRT:进程占用的虚拟内存值
RES:进程占用的物理内存值
SHR:进程占用的共享内存值
S:进程的运行状况,R表示正在运行、S表示休眠,等待唤醒、Z表示僵死状态
%CPU:该进程占用的CPU使用率
%MEM:该进程占用的物理内存和总内存的百分比TIME+:该进程启动后占用的总的CPU时间COMMAND:进程启动的启动命令名称是一个 Linux 下的交互式的进程浏览器,可以用来替换
nvidia-settings:查看nvida配置
dpkg -l | grep nvidia:查看nvida安装包