會話式人工智能正在改變我們與計算機的交互方式。它包括三個令人興奮的人工智能研究領域:自動語言識別(Automatic Speech Recognition,ASR)、自然語言處理(Natural Language Processing,NLP)和語言合成(或文本到語音,Text-to-Speech,TTS)。NVIDIA 的目標是通過讓研究人員和從業人員更容易地訪問、重用和建立這些領域的最新構建模塊和預訓練模型,使這些領域的進展能夠實現民主化并得到加速。
NVIDIA NeMo 是一個基于 PyTorch 的開源工具包,它允許開發者快速構建、訓練和微調會話式人工智能模型。NeMo 由 NeMo Core 和 NeMo Collection 組成,NeMo Core 為所有模型和模塊提供了一個通用的“外觀”,NeMo Collection 是特定領域模塊和模型的組合。在 NeMo 的 Speech Collection(nemo_asr)中,你可以找到用于語音識別、命令識別、說話人識別、說話人驗證和語音活動檢測的模型和各種構建模塊。NeMo 的 NLP Collection(nemo_nlp)包含了諸如問題回答、標點符號、命名實體識別等任務的模型。最后,在 NeMo 的 Speech Synthesis(nemo_tts)中,你會發現一些譜圖生成器和聲碼器,它們將讓你能夠生成合成語音。
語音交換示例
讓我們從一個簡單的原型開始介紹 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_nam) # 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_nam) # Vocoder model which takes spectrograms and produces actual audio vocoder = nemo_tts.models.WaveGlowModel.from_pretrained(model_nam)
大多數 NeMo 模型可以使用from_pretrained()函數直接從 NVIDIA NGC 目錄 中直接實例化。通過調用list_available_models()函數,你可以查看每個模型的可用預訓練權重列表。
從上面的代碼片段中可以看到,我們將使用 QuartzNet 模型 進行語音識別,一個基于 DistillBert 的標點模型,以及 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 目錄 上的倉庫使用特定的預訓練權重進行實例化。
深度神經網絡通常可以被認為是由負責不同任務的概念構建塊組成的。編碼器 - 解碼器架構就是一個著名的例子。編碼器負責學習輸入表示,而解碼器則負責根據輸入表示生成輸出序列。在 NeMo 中,我們稱這些模塊為“神經模塊”(順便說一句,這就是 NeMo 名字的由來)。神經模塊(nemo.core.NeuralModule)表示神經網絡的邏輯部分,如語言模型、編碼器、解碼器、數據增強算法、損失函數等。它們構成了描述模型和訓練該模型過程的基礎。NeuralModule 類是直接從torch.nn派生的。因此,你可以在 PyTorch 應用程序中使用 NeMo Collection 中的模塊。Collection 中有數百個神經模塊可供你在模型中重用。
神經模塊的輸入和輸出按神經類型輸入。神經類型是一對包含有關張量軸布局(類似于 PyTorch 中的命名張量)及其元素語義的信息對。每個神經模塊都有input_type和output_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 進行訓練和微調
NeMo 是為訓練和微調會話式人工智能模型而構建的。雖然可以使用“純”PyTorch 來處理 NeMo 的模型和模塊,但它們可有效地用于 PyTorch 生態系統中的其他兩個項目:PyTorch Lightning 和 Hydra。
NeMo 模型派生自 PyTorch Lightning 模塊,可用于 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_pat, config_nam) 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 高級產品經理。
本文轉自 公眾號:AI前線 ,作者Oleksii Kuchaiev
審核編輯 黃昊宇
-
人工智能
+關注
關注
1796文章
47643瀏覽量
240078 -
開源
+關注
關注
3文章
3398瀏覽量
42685 -
pytorch
+關注
關注
2文章
808瀏覽量
13348
發布評論請先 登錄
相關推薦
評論