基於OpenSeq2Seq的NLP與語音識別混合精度訓練node
Mixed Precision Training for NLP and Speech Recognition with OpenSeq2Seqpython
迄今爲止,神經網絡的成功創建在更大的數據集、更好的理論模型和縮短的訓練時間上。特別是順序模型,能夠從中受益更多。爲此,咱們建立了OpenSeq2Seq——一個開源的、基於TensorFlow的工具包。OpenSeq2Seq支持一系列現成的模型,其特色是多GPU和混合精度訓練,與其餘開源框架相比,大大縮短了訓練時間。機器翻譯和語音識別任務的基準測試代表,根據模型和訓練超參數,使用OpenSeq2Seq構建的模型在1.5-3倍更快的訓練時間下提供最新的性能。 git
OpenSeq2Seq包含了大量的對話式人工智能示例,這些示例都通過了混合FP16/FP32精度的訓練:github
自2014年引入序列到序列範式(Cho等人,2014[1])以來,其受歡迎程度持續增加。序列到序列模型一般由編碼器和解碼器組成,可用於各類任務。規範的序列到序列模型對於編碼器和解碼器都有RNN,而且適用於機器翻譯、文本摘要和對話框系統等任務,如圖1所示。然而,序列模型也能夠用於其餘任務。例如,用於解決情感分析任務的神經網絡能夠由RNN編碼器和softmax線性解碼器組成。圖像分類任務可能須要卷積編碼器和softmax線性解碼器。甚至編碼器和解碼器的數量也能夠改變。例如,將英語翻譯爲多種語言的模型可能有一個編碼器和多個解碼器。算法
Figure 1: Sequence-to-sequence model for a dialog system網絡
已經有許多工具包使用序列到序列範式來構造和訓練模型來解決各類任務。一些最流行的包括Tensor2Tensor[2]、seq2seq[3]、OpenNMT[4]和fairseq[5]。前兩個基於TensorFlow,後兩個基於PyTorch。這些框架採用模塊化設計,許多現成的模塊能夠組裝成理想的模型,下降了想要使用順序到順序模型來解決問題的人的進入壁壘,並有助於推進人工智能研究和生產的進展。 架構
OpenSeq2Seq創建在這些現有框架的基礎上,具備額外的特性,以減小訓練時間,使API更易於使用。咱們之因此選擇使用TensorFlow,是由於TensorFlow已經成爲應用最普遍的機器學習框架,併爲機器學習模型的生產提供了一條巨大的管道。咱們建立OpenSeq2Seq的目的以下: app
模塊化架構,容許從可用組件輕鬆組裝新模型 框架
支持混合精度訓練[6],使用NVIDIA Volta GPUs中引入的張量核 機器學習
快速,簡單易用,基於Horovod的分佈式訓練和數據並行,支持多GPU和多節點
OpenSeq2Seq模型由Python配置文件描述,該文件定義要使用的數據讀取器、編碼器、解碼器、優化器、損失函數、正則化、超參數的類型。例如,爲機器翻譯建立GNMT[7]模型的配置文件可能以下所示:
base_params = {
"batch_size_per_gpu": 32,
"optimizer": "Adam",
"lr_policy": exp_decay,
"lr_policy_params": {
"learning_rate": 0.0008,
...
},
"encoder": GNMTLikeEncoderWithEmbedding,
"encoder_params": {
"core_cell": tf.nn.rnn_cell.LSTMCell,
...
"encoder_layers": 7,
"src_emb_size": 1024,
},
"decoder": RNNDecoderWithAttention,
"decoder_params": {
"core_cell": tf.nn.rnn_cell.LSTMCell,
...
},
"loss": BasicSequenceLoss,
...
}
目前,OpenSeq2Seq使用配置文件爲機器翻譯(GNMT、ConvS2S、Transformer)、語音識別(Deep speech 二、Wav2Letter)、語音合成(Tacotron 2)、圖像分類(ResNets、AlexNet)、語言建模和情感分析傳輸學習建立模型。它們存儲在example_configs文件夾中。您可使用工具箱中提供的模塊建立一個新的模型配置,其中包含TensorFlow中的基本知識。編寫新模塊或修改現有模塊以知足您的特定需求也很簡單。
OpenSeq2Seq還提供了各類能夠處理流行數據集的數據層,包括用於機器翻譯的WMT、用於語言建模的WikiText-10三、用於語音識別的LibriSpeech、用於情緒分析的SST和IMDB、用於語音合成的LJ語音數據集等等。
神經網絡訓練的速度取決於三個主要硬件因素:計算吞吐量、帶寬和GPU-DRAM大小。現在,大型神經網絡擁有數千萬甚至數億個參數。它們須要大量的算術和內存資源才能在合理的時間範圍內進行訓練。加速訓練須要現代的深度學習硬件來知足這些不斷增加的資源需求。
Volta和Turing GPU上提供的張量核提供了訓練大型神經網絡所需的性能。它容許在單精度浮點(FP32)和半精度浮點(FP16)中進行矩陣乘法,即神經網絡訓練和推理的核心操做,如圖2所示。爲了訓練,張量核心提供高達12倍的峯值TFLOPS相比,在P100的標準FP32操做。爲了便於推斷,張量核提供了高達6倍的峯值TFLOPS,相比於P100上的標準FP16操做[8]。
Figure 2: Arithmetic is done in FP16 and accumulated in FP32
利用張量核的計算能力,須要使用混合精度算法訓練模型。OpenSeq2Seq提供了一個簡單的接口。當啓用混合精度訓練時,數學運算在FP16中完成,但結果在FP32中累積,如圖3所示。結果在存儲到內存以前被轉換成FP16。FP16提升了計算吞吐量,由於當前一代gpu爲下降精度的數學運算提供了更高的吞吐量。除了提升速度外,混合精度還減小了訓練所需的內存量。這容許用戶增長批次或模型的大小,進而增長模型的學習能力並減小訓練時間。
Figure 3: Mixed-precision training iteration for a layer
爲了防止因爲精度下降而形成的精度損失,使用了兩種技術:
自動縮放損失功能,防止梯度在反向傳播期間下溢和溢出。
維護一份FP32權重副本,以便在每一個優化器步驟以後累積梯度。
利用這些技術,混合精度訓練能夠在不損失模型精度或修改超參數的狀況下顯著加快訓練時間。與僅使用FP32相比,在Volta GPU上使用混合精度時,OpenSeq2Seq型號(如Transformer、ConvS2S和Wave2Letter)的端到端加速比爲1.5-3倍。
要在OpenSeq2Seq中啓用混合精度訓練,只需在配置文件中將model_params的dtype參數更改成「mixed」。您可能須要經過將model_params中的loss_scale參數設置爲所需的數字,或者經過將loss_scaling參數設置爲「Backoff」或「LogMax」來動態啓用損耗縮放。您可能須要注意輸入和輸出的類型,以免某些計算類型的不匹配類型。不須要修改體系結構或超級參數。
base_params = {
...
"dtype": "mixed",
# enabling static or dynamic loss scaling might improve model convergence
# "loss_scale": 10.0,
# "loss_scaling": "Backoff",
...
}
OpenSeq2Seq利用了兩種主要的分佈式訓練方法:
o
§ Builds a separate graph for each GPU
§ Sometimes faster for 2 to 4 GPUs
o Uses MPI and NVIDIA’s NCCL library to utilize NVLINK between GPUs
o Significantly faster for 8 to 16 GPUs
o Fast multi-node training
要使用第一種方法,只需將配置參數num_gpus更新爲要使用的gpu數量。
您須要安裝Horovod for GPU、MPI和NCCL才能使用Horovod(能夠找到Horovod for GPU安裝的詳細說明)。以後,只需在配置文件中將參數「use_horovod」設置爲True並執行run.py使用mpirun或mpiexec編寫腳本。例如:
mpiexec --allow-run-as-root -np <num_gpus> python run.py --config_file=... --mode=train_eval --use_horovod=True --enable_logs
Horovod還容許您啓用多節點執行。用戶惟一須要作的是定義數據「分割」,僅用於評估和推斷。不然,用戶爲多個/單個GPU或Horovod/塔式機箱編寫徹底相同的代碼。
與Tensorflow原生塔式方法相比,Horovod爲多GPU訓練提供了更好的縮放效果。具體的縮放取決於許多因素,如數據類型、模型大小、計算量。例如,Transformer模型的比例因子爲0.7,而ConvS2S的比例因子接近0.875,如圖4所示。
Figure 4: Multi-GPU speed-up for ConvS2S
在下一部分中,咱們將介紹神經機器翻譯、語音識別和語音合成等任務的一些流行模型的混合精度訓練結果。
目前OpenSeq2Seq有三種機器翻譯模型:
全部模型均在WMT英德數據集上接受過訓練:
這些模型的混合精度訓練比FP32快1.5-2.7倍[10]。
OpenSeq2Seq有兩個用於語音識別任務的模型:
這些模型僅在LibriSpeech數據集上訓練(約1k小時):
WER(單詞錯誤率)是在LibriSpeech數據集的dev clean部分使用貪婪解碼器(即在每一個時間步取最可能的字符,而不須要任何額外的語言模型從新評分)來測量的。
與FP32相比,OpenSeq2Seq中的語音識別模型在混合精度模式下的訓練速度提升了3.6倍。
OpenSeq2Seq支持Tacotron 2和Griffin Lim進行語音合成。該模型當前支持LJSpeech數據集。咱們計劃另外支持MAILABS數據集。兩個數據集上的音頻示例能夠在此處找到。 與FP32相比,Tacotron 2在混合精度模式下的訓練速度快1.6倍。
OpenSeq2Seq是一個基於TensorFlow的工具包,它創建在當前可用的序列到序列工具包的優點之上,具備額外的功能,能夠加速3倍的大型神經網絡訓練。它容許用戶切換到混合精度訓練,利用Tensor核中可用的計算能力單標籤。它結合了Horovod庫以減小多GPU和多節點系統的訓練時間。
目前在語音識別、機器翻譯、語音合成、語言建模、情感分析等方面擁有一整套最早進的模型。它的模塊化架構容許快速開發出現有模塊以外的新模型。代碼庫是開源的