美文网首页
快速使用opennmt-tf

快速使用opennmt-tf

作者: 小飞侠fayer | 来源:发表于2019-06-29 12:09 被阅读0次

    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"
    

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

    <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 更多

    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

          本文链接:https://www.haomeiwen.com/subject/qitpcctx.html