1 快速使用opennmt
http://opennmt.net/OpenNMT-tf/quickstart.html#
新建項目目錄如下:

1.1 準備數(shù)據(jù)
- 獲取 10k 條 English-German 預料對
wget https://s3.amazonaws.com/opennmt-trainingdata/toy-ende.tar.gz
tar xf toy-ende.tar.gz
cd toy-ende
windows直接到相應地址下載即可
- 根據(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
- 準備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ù):

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 更多
下載更大的訓練集,例如從[WMT任務中]
下載訓練一個更大的模型,像 Transformer
運行現(xiàn)有的培訓
發(fā)現(xiàn)調(diào)整超參數(shù)的配置參考
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設備

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

watch -n 1 nvidia-smi 實時顯示
顯存占用和GPU占用是兩個不一樣的東西,顯卡是由GPU和顯存等組成的,顯存和GPU的關系有點類似于內(nèi)存和CPU的關系。

htop查看使用率:

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安裝包