快速使用opennmt-tf

1 快速使用opennmt

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

image.png

1.1 準備數(shù)據(jù)

  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. 根據(jù)訓練文件獲取 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和語言文件放在統(tǒng)一目錄下,更容易管理, 推薦下面的方式

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 訓練數(shù)據(jù)

1.2.1 訓練過程

下面的命令將啟動基于RNN的小序列到序列模型的訓練和評估循環(huán)。

onmt-main train_and_eval --model_type NMTSmall --auto_config --config data.yml

--auto_config:選擇此類型號的最佳設置
訓練結束后,可以看到bleu分數(shù):

image.png

1.2.2 訓練結果

訓練將定期在run/目錄中生成檢查點。要監(jiān)視培訓進度,控制臺中會顯示一些日志。但是,為了直觀地監(jiān)控培訓,可以使用

tensorboard --logdir="run"
tensorboard --logdir="."

注意:命令最好在run目錄下調(diào)用,否則board不顯示圖形
顯示內(nèi)容
訓練和調(diào)整損失 training and evaluation loss
訓練速度training speed
學習率 learning rate
梯度規(guī)范 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,計算梯度,并異步更新共享參數(shù)集。

要啟用分布式培訓,用戶應使用train_and_eval運行類型并在命令行上進行設置:
chief worker 負責訓練循環(huán)并管理檢查點
list workor 運行訓練循環(huán)的工作主機列表
list parameter server用于同步參數(shù)

然后應在每個具有所選任務的主機上啟動訓練實例,例如:

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機器上運行異步分布式培訓。

和復制訓練的區(qū)別在于:可以在多個機器上并行訓練

有關更多詳細信息,請參閱文檔tf.estimator.train_and_evaluate。另請參閱tensorflow / ecosystem,將分布式培訓與Docker或Kubernetes等開源框架集成。

1.2.5 重新啟動訓練

由于opennmt在運行過程中會記錄檢查點,把之前保存的結果記錄下來,中斷后,和初始運行命令一樣,即可以繼續(xù)執(zhí)行

# 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到達而停止,應該先繼續(xù)增加此值

1.2.6 微調(diào)訓練

retraining對于微調(diào)現(xiàn)有模型也很有用。例如,在機器翻譯中,與從頭開始訓練相比,將通用模型適應特定域往往速度更快。

OpenNMT-tf提供了一些功能,使這個過程更容易:

  • 該腳本onmt-update-vocab可用于更改檢查點中包含的單詞詞匯表,同時保持共享單詞的學習權重(例如,添加域術語)

  • 命令行參數(shù)--checkpoint_path可用于從新的訓練狀態(tài)開始加載現(xiàn)有檢查點的權重(例如: 使用新的學習速率計劃和優(yōu)化器變量)

1.3 翻譯數(shù)據(jù)

一旦訓練保存了檢查點,就可以執(zhí)行該命令:

//結果輸出在控制臺
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可用于平均多個檢查點的參數(shù),通常可提高模型性能。例如:

onmt-average-checkpoints \
    --model_dir run/baseline-enfr \
    --output_dir run/baseline-enfr/avg \
    --max_count 5

將平均run/baseline-enfr模型目錄中5個最新檢查點的參數(shù),并在目錄中保存新的檢查點run/baseline-enfr/avg。
然后,通過設置--checkpoint_path選項執(zhí)行推理,例如:

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等人所述,來自輸出分布的采樣預測可以是用于反向翻譯的有效解碼策略。
要啟用此功能,您應配置參數(shù)sampling_topk??赡艿闹凳牵?br> 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個連續(xù)行,從最佳到最差排序。請注意,N不能大于配置beam_width。

1.4.3 得分Scoring

OpenNMT-tf腳本還可用于通過score運行類型對現(xiàn)有翻譯進行評分。它需要設置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"

該命令將在標準輸出上寫入以下格式為每行生成的分數(shù):

<score> ||| <translation>

<score>是:提供的翻譯的負對數(shù)似然結果。
提示:N-best list和score聯(lián)合使用可用于重新排名翻譯。

1.5 服務

1.5.1 導出SavedModel

OpenNMT-tf定期導出模型以在其他環(huán)境中進行推理,例如使用TensorFlow服務。

模型導出包含推理所需的所有信息:圖形定義,權重和外部資產(chǎn)(如詞匯文件)。它通常在磁盤上看起來像這樣:

 
 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

使用導出的模型時,您需要知道模型的輸入和輸出節(jié)點。您可以使用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函數(shù)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代碼定義的,以實現(xiàn)高水平的建模自由度。它們是opennmt.models.Model使用用戶定義模塊的實例。其中一些模塊定義為包含其他模塊,可用于設計復雜的體系結構:

opennmt.encoders.ParallelEncoder
opennmt.encoders.SequentialEncoder
opennmt.inputters.MixedInputter
opennmt.inputters.ParallelInputter

例如,這些容器模塊可用于實現(xiàn)多源輸入,多模式訓練,混合字/字符嵌入和任意復雜的編碼器架構(例如,混合卷積,RNN,自注意等)。
config/models Git存儲庫中的目錄中提供了一些示例。
應使用--model命令行選項選擇自定義模型文件,例如:

onmt-main train --model config/models/custom_model.py [...]

2.2 參數(shù)配置

具體參數(shù)含義詳見
http://opennmt.net/OpenNMT-tf/configuration.html

2.2.1 自動配置Automatic configuration

預定義模型聲明了默認參數(shù),這些參數(shù)應該提供開箱即用的可靠性能。要啟用自動配置,請使用--auto_config標志:

onmt-main train_and_eval --model_type Transformer --config my_data.yml --auto_config

用戶提供的my_data.yml文件將極少需要數(shù)據(jù)配置。您可能還想配置檢查點相關設置,記錄頻率和培訓步驟數(shù)。在訓練開始時,將記錄實際使用的配置值。如果要更改其中一些,只需在配置文件中添加該參數(shù)即可覆蓋默認值。

注意:默認訓練值通常假設GPU具有至少8GB的內(nèi)存和大的系統(tǒng)內(nèi)存:如果遇到GPU內(nèi)存不足問題,請嘗試覆蓋batch_size較低的值。
如果遇到CPU內(nèi)存不足問題,請嘗試覆蓋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

如果配置密鑰重復,則最右側配置文件中定義的值具有優(yōu)先級。如果您不確定實際使用的配置或只是更喜歡使用單個文件,請考慮使用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可用于配置為執(zhí)行TensorFlow圖而創(chuàng)建的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的關系有點類似于內(nèi)存和CPU的關系。

image.png

htop查看使用率:

image.png

PID:進行的標識號USER:運行此進程的用戶
PRI:進程的優(yōu)先級
NI:進程的優(yōu)先級別值,默認的為0,可以進行調(diào)整VIRT:進程占用的虛擬內(nèi)存值
RES:進程占用的物理內(nèi)存值
SHR:進程占用的共享內(nèi)存值
S:進程的運行狀況,R表示正在運行、S表示休眠,等待喚醒、Z表示僵死狀態(tài)
%CPU:該進程占用的CPU使用率
%MEM:該進程占用的物理內(nèi)存和總內(nèi)存的百分比TIME+:該進程啟動后占用的總的CPU時間COMMAND:進程啟動的啟動命令名稱是一個 Linux 下的交互式的進程瀏覽器,可以用來替換

nvidia-settings:查看nvida配置
dpkg -l | grep nvidia:查看nvida安裝包

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容