快速使用opennmt-tf

1 快速使用opennmt

http://opennmt.net/OpenNMT-tf/quickstart.html#
新建项目目录如下:

image.png

1.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直接到相应地址下载即可

  1. 根据训练文件获取 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
  1. 准备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分数:

image.png

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"

该命令将在标准输出上写入以下格式为每行生成的分数:

 ||| 

是:提供的翻译的负对数似然结果。
提示: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.png

nvidia-smi:查看GPU的使用情况

image.png

watch -n 1 nvidia-smi 实时显示

显存占用和GPU占用是两个不一样的东西,显卡是由GPU和显存等组成的,显存和GPU的关系有点类似于内存和CPU的关系。

image.png

htop查看使用率:

image.png

PID:进行的标识号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安装包

你可能感兴趣的:(快速使用opennmt-tf)