基于OpenSeq2Seq的NLP与语音识别混合精度训练
基于OpenSeq2Seq的NLP與語音識別混合精度訓練
Mixed Precision Training for NLP and Speech Recognition with
OpenSeq2Seq
迄今為止,神經網絡的成功建立在更大的數據集、更好的理論模型和縮短的訓練時間上。特別是順序模型,可以從中受益更多。為此,我們創建了OpenSeq2Seq——一個開源的、基于TensorFlow的工具包。OpenSeq2Seq支持一系列現成的模型,其特點是多GPU和混合精度訓練,與其他開源框架相比,大大縮短了訓練時間。機器翻譯和語音識別任務的基準測試表明,根據模型和訓練超參數,使用OpenSeq2Seq構建的模型在1.5-3倍更快的訓練時間下提供最新的性能。
OpenSeq2Seq包含了大量的對話式人工智能示例,這些示例都經過了混合FP16/FP32精度的訓練:
·
Natural Language Translation: GNMT, Transformer, ConvS2S
·
Speech Recognition: Wave2Letter, DeepSpeech2
·
Speech Synthesis: Tacotron 2
·
Language Modeling and transfer learning for NLP tasks
Overview of OpenSeq2Seq
自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的目的如下:
模塊化架構,允許從可用組件輕松組裝新模型
支持混合精度訓練[6],使用NVIDIA Volta GPUs中引入的張量核
快速,簡單易用,基于Horovod的分布式訓練和數據并行,支持多GPU和多節點
Modular architecture
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 2、Wav2Letter)、語音合成(Tacotron 2)、圖像分類(ResNets、AlexNet)、語言建模和情感分析傳輸學習創建模型。它們存儲在example_configs文件夾中。您可以使用工具箱中提供的模塊創建一個新的模型配置,其中包含TensorFlow中的基本知識。編寫新模塊或修改現有模塊以滿足您的特定需求也很簡單。
OpenSeq2Seq還提供了各種可以處理流行數據集的數據層,包括用于機器翻譯的WMT、用于語言建模的WikiText-103、用于語音識別的LibriSpeech、用于情緒分析的SST和IMDB、用于語音合成的LJ語音數據集等等。
Mixed-precision training
神經網絡訓練的速度取決于三個主要硬件因素:計算吞吐量、帶寬和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”, …}
Distributed training with Horovod
OpenSeq2Seq利用了兩種主要的分布式訓練方法:
·
Parameter server-based approach (used in native TensorFlow towers)
o
§ Builds a separate graph for each GPU
§ Sometimes faster for 2 to 4 GPUs
MPI-based approach[9] (used
in Uber’s Horovod)
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
在下一部分中,我們將介紹神經機器翻譯、語音識別和語音合成等任務的一些流行模型的混合精度訓練結果。
Models
Machine Translation
目前OpenSeq2Seq有三種機器翻譯模型:
·
Google NMT
·
Facebook ConvS2S
·
Google Transformer
所有模型均在WMT英德數據集上接受過訓練:
這些模型的混合精度訓練比FP32快1.5-2.7倍[10]。
Speech Recognition
OpenSeq2Seq有兩個用于語音識別任務的模型:
·
Wave2Letter+ (fully convolutional model based on Facebook Wav2Letter)
DeepSpeech2 (recurrent model originally proposed by Baidu)
這些模型僅在LibriSpeech數據集上訓練(約1k小時):
WER(單詞錯誤率)是在LibriSpeech數據集的dev clean部分使用貪婪解碼器(即在每個時間步取最可能的字符,而不需要任何額外的語言模型重新評分)來測量的。
與FP32相比,OpenSeq2Seq中的語音識別模型在混合精度模式下的訓練速度提高了3.6倍。
Speech Synthesis
OpenSeq2Seq支持Tacotron 2和Griffin Lim進行語音合成。該模型當前支持LJSpeech數據集。我們計劃另外支持MAILABS數據集。兩個數據集上的音頻示例可以在此處找到。
與FP32相比,Tacotron 2在混合精度模式下的訓練速度快1.6倍。
Conclusion
OpenSeq2Seq是一個基于TensorFlow的工具包,它建立在當前可用的序列到序列工具包的優勢之上,具有額外的功能,可以加速3倍的大型神經網絡訓練。它允許用戶切換到混合精度訓練,利用Tensor核中可用的計算能力單標簽。它結合了Horovod庫以減少多GPU和多節點系統的訓練時間。
目前在語音識別、機器翻譯、語音合成、語言建模、情感分析等方面擁有一整套最先進的模型。它的模塊化架構允許快速開發出現有模塊之外的新模型。代碼庫是開源的
總結
以上是生活随笔為你收集整理的基于OpenSeq2Seq的NLP与语音识别混合精度训练的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用NVIDIA-NGC对BERT进行训练
- 下一篇: 提示和技巧:光线跟踪最佳实践