Categories
程式開發

NVIDIA開源NeMo:基於PyTorch,允許快速創建會話式人工智能模型


日前,NVIDIA 發布了NeMo,這是一種會話式人工智能的神經模塊和模型。

會話式人工智能正在改變我們與計算機的交互方式。它包括三個令人興奮的人工智能研究領域:自動語言識別(Automatic Speech Recognition,ASR)、自然語言處理(Natural Language Processing,NLP)和語言合成(或文本到語音,Text-to-Speech,TTS )。 NVIDIA 的目標是通過讓研究人員和從業人員更容易地訪問、重用和建立這些領域的最新構建模塊和預訓練模型,使這些領域的進展能夠實現民主化並得到加速。

NVIDIA NeMo天生烏拉爾dules)是一個基於PyTorch 的開源工具包,它允許開發者快速構建、訓練和微調會話式人工智能模型。 NeMo 由NeMo Core 和NeMo Collection 組成,NeMo Core 為所有模型和模塊提供了一個通用的“外觀”,NeMo Collection 是特定領域模塊和模型的組合。在NeMo的演講集(nemo_asr)中,你可以找到用於語音識別、命令識別、說話人識別、說話人驗證和語音活動檢測的模型和各種構建模塊。NeMo的NLP系列(nemo_nlp)包含了諸如問題回答、標點符號、命名實體識別等任務的模型。最後,在NeMo的語音合成(nemo_tts)中,你會發現一些譜圖生成器和聲碼器,它們將讓你能夠生成合成語音。

NVIDIA開源NeMo:基於PyTorch,允許快速創建會話式人工智能模型 1

圖1:NeMo 的應用棧

語音交換示例

讓我們從一個簡單的原型開始介紹NeMo。在這個示例中,我們將獲取一個音頻文件,並用NeMo 模型生成的合成語音來替換其中的語音。點擊此處可以獲取此語音文件。

從概念上講,這個應用程序演示了會話式人工智能係統的所有三個階段:(1)語音識別;(2)推導意義或理解所說的內容;(3)生成合成語音作為響應。如果你有支持GPU 的PyTorch 1.6 版或更高版本,NeMo 可以簡單地通過PIP 安裝,如下所示:

pip install nemo_toolkit[all]==1.0.0b1

基於NeMo 的應用程序的第一步是導入必要的Collection。在這個應用程序中,我們將使用這三種Collection。

import nemo
# Import Speech Recognition collection
import nemo.collections.asr as nemo_asr
# Import Natural Language Processing collection
import nemo.collections.nlp as nemo_nlp
# Import Speech Synthesis collection
import nemo.collections.tts as nemo_tts

Collection 使我們可以訪問NeMo 模型,我們可以使用它們來執行某些會話式人工智能任務。模型是NeMo 的關鍵概念之一,我們將在下面更詳細地討論它們,但我們只使用現在需要的那些:

# Speech Recognition model - QuartzNet
quartznet =
nemo_asr.models.EncDecCTCModel.from_pretrained(model_name="QuartzNet15x5Base-En")
# Punctuation and capitalization model
punctuation =
nemo_nlp.models.PunctuationCapitalizationModel.from_pretrained(model_name="Punctuation
_Capitalization_with_DistilBERT")
# Spectrogram generator which takes text as an input and produces spectrograms
spectrogram_generator =
nemo_tts.models.Tacotron2Model.from_pretrained(model_name="Tacotron2-22050Hz")
# Vocoder model which takes spectrograms and produces actual audio
vocoder = nemo_tts.models.WaveGlowModel.from_pretrained(model_name="WaveGlow-22050Hz")

大多數NeMo 模型可以使用from_pretrained()函數直接從NVIDIA NGC 目錄中直接實例化。通過調用list_available_models()函數,你可以查看每個模型的可用預訓練權重列表。

從上面的代碼片段中可以看到,我們將使用QuartzNet 模型進行語音識別,一個基於蒸餾瓶的標點​​模型,以及Tacotron2+WaveGlow模型進行語音合成、語音識別。注意,NeMo 的NLP Collection 與出色的Hugging Face 轉換器兼容,其語言模型通常被NeMo 的NLP 模型用作編碼器。一旦所有模型被實例化之後,它們就可以使用了。下面是一個使用ASR 模型轉錄音頻文件和NLP 模型在轉錄文本中添加標點符號的例子:

transcription = quartznet.transcribe(paths2audio_files=files)
result = punctuation.add_punctuation_capitalization(queries=transcription)

有關完整的運行示例,請參考這個交互式Google Colab Notebook。請注意,標點符號模型是如何在所生成的語音質量產生巨大影響的。基於標點符號模型的輸出生成的語音比直接從ASR 模型的原始輸出生成的語音更容易理解,因為它會在適當的位置包含停頓和語調

NeMo 模型、神經模塊和神經類型

在NeMo 中,主要有三個概念:模型、神經模塊和神經類型。模型包含了訓練和優化所需的所有信息。因此,它們封裝瞭如下內容:

  1. 神經網絡實現:所有神經模塊都連接在一起進行訓練和評估。
  2. 所有必要的預處理和後處理:標記化、數據增強等。
  3. 可用於此模型的Dataset 類。
  4. 優化算法和學習率調度。
  5. 基礎設施細節:例如,有多少GPU、節點以及應使用哪種訓練精度。

正如我們在上面的演示中所看到的,大多數模型可以直接從NVIDIA NGC 目錄上的倉庫使用特定的預訓練權重進行實例化。

NVIDIA開源NeMo:基於PyTorch,允許快速創建會話式人工智能模型 2

深度神經網絡通常可以被認為是由負責不同任務的概念構建塊組成的。編碼器-解碼器架構就是一個著名的例子。編碼器負責學習輸入表示,而解碼器則負責根據輸入表示生成輸出序列。在NeMo 中,我們稱這些模塊為“神經模塊”(順便說一句,這就是NeMo 名字的由來)。神經模塊(nemo.core.NeuralModule)表示神經網絡的邏輯部分,如語言模型、編碼器、解碼器、數據增強算法、損失函數等。它們構成了描述模型和訓練該模型過程的基礎。 NeuralModule 類是直接從torch.nn派生的。因此,你可以在PyTorch 應用程序中使用NeMo Collection 中的模塊。 Collection 中有數百個神經模塊可供你在模型中重用。

神經模塊的輸入和輸出按神經類型輸入。神經類型是一對包含有關張量軸佈局(類似於PyTorch 中的命名張量)及其元素語義的信息對。每個神經模塊都有input_typeoutput_type屬性,這些屬性描述(並幫助強制執行)這個模塊接受什麼類型的輸入以及它返回什麼類型的輸出。

讓我們考慮模型、神經模塊和類型是如何相互作用的。如果我們仔細查看QuartzNet 模型的forward()方法,就會看到:

@typecheck()
def forward(self, input_signal, input_signal_length):
processed_signal, processed_signal_len = self.preprocessor(
input_signal=input_signal, length=input_signal_length,
)
# Spec augment is not applied during evaluation/testing
if self.spec_augmentation is not None and self.training:
processed_signal = self.spec_augmentation(input_spec=processed_signal)
encoded, encoded_len = self.encoder(audio_signal=processed_signal,
length=processed_signal_len)
log_probs = self.decoder(encoder_output=encoded)
greedy_predictions = log_probs.argmax(dim=-1, keepdim=False)
return log_probs, encoded_len, greedy_predictions

QuartzNet 模型包含預處理器、(可選)譜圖增強、編碼器和解碼器神經模塊。請注意,它們的使用方式與使用torch.nn.Module模塊完全相同,但增加了類型安全性。以下是這個模型的神經模塊的一些輸入/輸出類型:

print(quartznet.preprocessor.input_types['input_signal'])
print(quartznet.preprocessor.output_types['processed_signal'])
print(quartznet.spec_augmentation.input_types['input_spec'])
axes: (batch, time); elements_type: AudioSignal
axes: (batch, dimension, time); elements_type: MelSpectrogramType
axes: (batch, dimension, time); elements_type: SpectrogramType

正如你所見到的,類型決定了其元素的張量佈局和語義。預處理器不僅將檢查傳遞給它的張量是否為2 維[batch,time]張量,而且還將強制張量內的元素表示AudioSignal。神經類型支持繼承,這就是為什麼MelSpectrogramType`` 输出在任何地方都可以接受的原因。类型在@typecheck`修飾器的幫助下被強制執行,並且可以打開或關閉強制。這是一個實驗性的特性,但我們發現,它有助於幫助模塊的用戶正確使用它們。

使用NeMo 進行訓練和微調

尼莫是為訓練和微調會話式人工智能模型而構建的。雖然可以使用“純”PyTorch 來處理NeMo 的模型和模塊,但它們可有效地用於PyTorch 生態系統中的其他兩個項目:PyTorch閃電九頭蛇

NeMo 模型派生自PyTorch閃電模塊,可用於Lightning 的Trainer 實例。這種與Lightning 的集成使得使用Tensor Core 可以非常輕鬆地以混合精度來訓練模型,並且可以將訓練擴展到多個GPU 和計算節點。例如,我們將一些NeMo 模型的訓練擴展為使用512 個GPU。 Lightning 還為用戶提供了許多其他方便的功能,如日誌記錄、檢查點、過擬合檢查等等。

NeMo 的用戶可以使用Facebook 的Hydra來參數化腳本。一個典型的深度學習實驗可以包含數百個甚至數千個參數。這就是為什麼將它們保存在組織良好的配置文件中很方便。 NeMo 模型和模塊使用Hydra 進行參數化,為用戶提供了Hydra 的靈活性和錯誤檢查功能。

與PyTorch Lighting 和Hydra 的集成使得為用戶簡化任務成為可能。請考慮下面的示例。它是一個完整的Python 腳本,能夠獲取.yaml 配置文件並訓練語音識別模型。 NeMo + Lightning + Hydra 標準化了很多東西,只需修改兩行代碼,就可以將其轉換為一個腳本,用於訓練基於BERT 的問答模型。

import pytorch_lightning as pl
from nemo.core.config import hydra_runner
from nemo.collections.asr.models import EncDecCTCModel
#from nemo.collections.nlp.models.question_answering.qa_model import QAModel
@hydra_runner(config_path="conf", config_name="config")
def main(cfg):
trainer = pl.Trainer(**cfg.trainer)
#model = QAModel(cfg.model, trainer=trainer)
model = EncDecCTCModel(cfg=cfg.model, trainer=trainer)
trainer.fit(asr_model)

結論

NeMo 是為對會話式人工智能——語音識別、自然語言處理和語音合成感到好奇的開發者而打造的。 NVIDIA 還投入了大量精力和算力來創建對用戶有用的預訓練模型的Collection。

NVIDIA 鼓勵開發者嘗試NeMo。請訪問NVIDIA 的GitHub,以使用 NeMo 的交互式教程。本文開頭討論的語音交換示例就是一個很好的起點。

最後,NeMo 是GitHub 上的一個開源項目,NVIDIA 歡迎外部的貢獻,人們可以通過許多方式做出貢獻,從編寫代碼或文檔到使用新語言訓練模型。

作者介紹:

Oleksii Kuchaiev,NVIDIA 高級應用科學家;Poonam Chitale,NVIDIA 高級產品經理。

原文鏈接:

https://medium.com/@samfarahzad/nvidia-nemo-neural-modules-and-models-for-conversational-ai-ea041e4cd4