基于OpenSeq2Seq的NLP与语音识别混合精度训练
基于OpenSeq2Seq的NLP與語音識別混合精度訓(xùn)練
Mixed Precision Training for NLP and Speech Recognition with
OpenSeq2Seq
迄今為止,神經(jīng)網(wǎng)絡(luò)的成功建立在更大的數(shù)據(jù)集、更好的理論模型和縮短的訓(xùn)練時(shí)間上。特別是順序模型,可以從中受益更多。為此,我們創(chuàng)建了OpenSeq2Seq——一個(gè)開源的、基于TensorFlow的工具包。OpenSeq2Seq支持一系列現(xiàn)成的模型,其特點(diǎn)是多GPU和混合精度訓(xùn)練,與其他開源框架相比,大大縮短了訓(xùn)練時(shí)間。機(jī)器翻譯和語音識別任務(wù)的基準(zhǔn)測試表明,根據(jù)模型和訓(xùn)練超參數(shù),使用OpenSeq2Seq構(gòu)建的模型在1.5-3倍更快的訓(xùn)練時(shí)間下提供最新的性能。
OpenSeq2Seq包含了大量的對話式人工智能示例,這些示例都經(jīng)過了混合FP16/FP32精度的訓(xùn)練:
·
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])以來,其受歡迎程度持續(xù)增長。序列到序列模型通常由編碼器和解碼器組成,可用于各種任務(wù)。規(guī)范的序列到序列模型對于編碼器和解碼器都有RNN,并且適用于機(jī)器翻譯、文本摘要和對話框系統(tǒng)等任務(wù),如圖1所示。然而,序列模型也可以用于其他任務(wù)。例如,用于解決情感分析任務(wù)的神經(jīng)網(wǎng)絡(luò)可以由RNN編碼器和softmax線性解碼器組成。圖像分類任務(wù)可能需要卷積編碼器和softmax線性解碼器。甚至編碼器和解碼器的數(shù)量也可以改變。例如,將英語翻譯為多種語言的模型可能有一個(gè)編碼器和多個(gè)解碼器。
Figure 1: Sequence-to-sequence model for a dialog system
已經(jīng)有許多工具包使用序列到序列范式來構(gòu)造和訓(xùn)練模型來解決各種任務(wù)。一些最流行的包括Tensor2Tensor[2]、seq2seq[3]、OpenNMT[4]和fairseq[5]。前兩個(gè)基于TensorFlow,后兩個(gè)基于PyTorch。這些框架采用模塊化設(shè)計(jì),許多現(xiàn)成的模塊可以組裝成理想的模型,降低了想要使用順序到順序模型來解決問題的人的進(jìn)入壁壘,并有助于推動(dòng)人工智能研究和生產(chǎn)的進(jìn)展。
OpenSeq2Seq建立在這些現(xiàn)有框架的基礎(chǔ)上,具有額外的特性,以減少訓(xùn)練時(shí)間,使API更易于使用。我們之所以選擇使用TensorFlow,是因?yàn)門ensorFlow已經(jīng)成為應(yīng)用最廣泛的機(jī)器學(xué)習(xí)框架,并為機(jī)器學(xué)習(xí)模型的生產(chǎn)提供了一條巨大的管道。我們創(chuàng)建OpenSeq2Seq的目的如下:
模塊化架構(gòu),允許從可用組件輕松組裝新模型
支持混合精度訓(xùn)練[6],使用NVIDIA Volta GPUs中引入的張量核
快速,簡單易用,基于Horovod的分布式訓(xùn)練和數(shù)據(jù)并行,支持多GPU和多節(jié)點(diǎn)
Modular architecture
OpenSeq2Seq模型由Python配置文件描述,該文件定義要使用的數(shù)據(jù)讀取器、編碼器、解碼器、優(yōu)化器、損失函數(shù)、正則化、超參數(shù)的類型。例如,為機(jī)器翻譯創(chuàng)建GNMT[7]模型的配置文件可能如下所示:
base_params = {
“batch_size_per_gpu”: 32,
“optimizer”: “Adam”,
“l(fā)r_policy”: exp_decay,
“l(fā)r_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,
…
},
“l(fā)oss”: BasicSequenceLoss,
…
}
目前,OpenSeq2Seq使用配置文件為機(jī)器翻譯(GNMT、ConvS2S、Transformer)、語音識別(Deep speech 2、Wav2Letter)、語音合成(Tacotron 2)、圖像分類(ResNets、AlexNet)、語言建模和情感分析傳輸學(xué)習(xí)創(chuàng)建模型。它們存儲(chǔ)在example_configs文件夾中。您可以使用工具箱中提供的模塊創(chuàng)建一個(gè)新的模型配置,其中包含TensorFlow中的基本知識。編寫新模塊或修改現(xiàn)有模塊以滿足您的特定需求也很簡單。
OpenSeq2Seq還提供了各種可以處理流行數(shù)據(jù)集的數(shù)據(jù)層,包括用于機(jī)器翻譯的WMT、用于語言建模的WikiText-103、用于語音識別的LibriSpeech、用于情緒分析的SST和IMDB、用于語音合成的LJ語音數(shù)據(jù)集等等。
Mixed-precision training
神經(jīng)網(wǎng)絡(luò)訓(xùn)練的速度取決于三個(gè)主要硬件因素:計(jì)算吞吐量、帶寬和GPU-DRAM大小。如今,大型神經(jīng)網(wǎng)絡(luò)擁有數(shù)千萬甚至數(shù)億個(gè)參數(shù)。它們需要大量的算術(shù)和內(nèi)存資源才能在合理的時(shí)間范圍內(nèi)進(jìn)行訓(xùn)練。加速訓(xùn)練需要現(xiàn)代的深度學(xué)習(xí)硬件來滿足這些不斷增長的資源需求。
Volta和Turing GPU上提供的張量核提供了訓(xùn)練大型神經(jīng)網(wǎng)絡(luò)所需的性能。它允許在單精度浮點(diǎn)(FP32)和半精度浮點(diǎn)(FP16)中進(jìn)行矩陣乘法,即神經(jīng)網(wǎng)絡(luò)訓(xùn)練和推理的核心操作,如圖2所示。為了訓(xùn)練,張量核心提供高達(dá)12倍的峰值TFLOPS相比,在P100的標(biāo)準(zhǔn)FP32操作。為了便于推斷,張量核提供了高達(dá)6倍的峰值TFLOPS,相比于P100上的標(biāo)準(zhǔn)FP16操作[8]。
Figure 2: Arithmetic is done in FP16 and accumulated in FP32
利用張量核的計(jì)算能力,需要使用混合精度算法訓(xùn)練模型。OpenSeq2Seq提供了一個(gè)簡單的接口。當(dāng)啟用混合精度訓(xùn)練時(shí),數(shù)學(xué)運(yùn)算在FP16中完成,但結(jié)果在FP32中累積,如圖3所示。結(jié)果在存儲(chǔ)到內(nèi)存之前被轉(zhuǎn)換成FP16。FP16提高了計(jì)算吞吐量,因?yàn)楫?dāng)前一代gpu為降低精度的數(shù)學(xué)運(yùn)算提供了更高的吞吐量。除了提高速度外,混合精度還減少了訓(xùn)練所需的內(nèi)存量。這允許用戶增加批次或模型的大小,進(jìn)而增加模型的學(xué)習(xí)能力并減少訓(xùn)練時(shí)間。
Figure 3: Mixed-precision training iteration for a layer
為了防止由于精度降低而造成的精度損失,使用了兩種技術(shù):
自動(dòng)縮放損失功能,防止梯度在反向傳播期間下溢和溢出。
維護(hù)一份FP32權(quán)重副本,以便在每個(gè)優(yōu)化器步驟之后累積梯度。
利用這些技術(shù),混合精度訓(xùn)練可以在不損失模型精度或修改超參數(shù)的情況下顯著加快訓(xùn)練時(shí)間。與僅使用FP32相比,在Volta GPU上使用混合精度時(shí),OpenSeq2Seq型號(如Transformer、ConvS2S和Wave2Letter)的端到端加速比為1.5-3倍。
要在OpenSeq2Seq中啟用混合精度訓(xùn)練,只需在配置文件中將model_params的dtype參數(shù)更改為“mixed”。您可能需要通過將model_params中的loss_scale參數(shù)設(shè)置為所需的數(shù)字,或者通過將loss_scaling參數(shù)設(shè)置為“Backoff”或“LogMax”來動(dòng)態(tài)啟用損耗縮放。您可能需要注意輸入和輸出的類型,以避免某些計(jì)算類型的不匹配類型。不需要修改體系結(jié)構(gòu)或超級參數(shù)。
base_params = { … “dtype”: “mixed”, # enabling static or dynamic loss scaling might improve model convergence # “l(fā)oss_scale”: 10.0, # “l(fā)oss_scaling”: “Backoff”, …}
Distributed training with Horovod
OpenSeq2Seq利用了兩種主要的分布式訓(xùn)練方法:
·
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
要使用第一種方法,只需將配置參數(shù)num_gpus更新為要使用的gpu數(shù)量。
您需要安裝Horovod for GPU、MPI和NCCL才能使用Horovod(可以找到Horovod for GPU安裝的詳細(xì)說明)。之后,只需在配置文件中將參數(shù)“use_horovod”設(shè)置為True并執(zhí)行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還允許您啟用多節(jié)點(diǎn)執(zhí)行。用戶唯一需要做的是定義數(shù)據(jù)“分割”,僅用于評估和推斷。否則,用戶為多個(gè)/單個(gè)GPU或Horovod/塔式機(jī)箱編寫完全相同的代碼。
與Tensorflow原生塔式方法相比,Horovod為多GPU訓(xùn)練提供了更好的縮放效果。具體的縮放取決于許多因素,如數(shù)據(jù)類型、模型大小、計(jì)算量。例如,Transformer模型的比例因子為0.7,而ConvS2S的比例因子接近0.875,如圖4所示。
Figure 4: Multi-GPU speed-up for ConvS2S
在下一部分中,我們將介紹神經(jīng)機(jī)器翻譯、語音識別和語音合成等任務(wù)的一些流行模型的混合精度訓(xùn)練結(jié)果。
Models
Machine Translation
目前OpenSeq2Seq有三種機(jī)器翻譯模型:
·
Google NMT
·
Facebook ConvS2S
·
Google Transformer
所有模型均在WMT英德數(shù)據(jù)集上接受過訓(xùn)練:
這些模型的混合精度訓(xùn)練比FP32快1.5-2.7倍[10]。
Speech Recognition
OpenSeq2Seq有兩個(gè)用于語音識別任務(wù)的模型:
·
Wave2Letter+ (fully convolutional model based on Facebook Wav2Letter)
DeepSpeech2 (recurrent model originally proposed by Baidu)
這些模型僅在LibriSpeech數(shù)據(jù)集上訓(xùn)練(約1k小時(shí)):
WER(單詞錯(cuò)誤率)是在LibriSpeech數(shù)據(jù)集的dev clean部分使用貪婪解碼器(即在每個(gè)時(shí)間步取最可能的字符,而不需要任何額外的語言模型重新評分)來測量的。
與FP32相比,OpenSeq2Seq中的語音識別模型在混合精度模式下的訓(xùn)練速度提高了3.6倍。
Speech Synthesis
OpenSeq2Seq支持Tacotron 2和Griffin Lim進(jìn)行語音合成。該模型當(dāng)前支持LJSpeech數(shù)據(jù)集。我們計(jì)劃另外支持MAILABS數(shù)據(jù)集。兩個(gè)數(shù)據(jù)集上的音頻示例可以在此處找到。
與FP32相比,Tacotron 2在混合精度模式下的訓(xùn)練速度快1.6倍。
Conclusion
OpenSeq2Seq是一個(gè)基于TensorFlow的工具包,它建立在當(dāng)前可用的序列到序列工具包的優(yōu)勢之上,具有額外的功能,可以加速3倍的大型神經(jīng)網(wǎng)絡(luò)訓(xùn)練。它允許用戶切換到混合精度訓(xùn)練,利用Tensor核中可用的計(jì)算能力單標(biāo)簽。它結(jié)合了Horovod庫以減少多GPU和多節(jié)點(diǎn)系統(tǒng)的訓(xùn)練時(shí)間。
目前在語音識別、機(jī)器翻譯、語音合成、語言建模、情感分析等方面擁有一整套最先進(jìn)的模型。它的模塊化架構(gòu)允許快速開發(fā)出現(xiàn)有模塊之外的新模型。代碼庫是開源的
總結(jié)
以上是生活随笔為你收集整理的基于OpenSeq2Seq的NLP与语音识别混合精度训练的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用NVIDIA-NGC对BERT进行训练
- 下一篇: 提示和技巧:光线跟踪最佳实践