NVIDIA NeMo始終如一地開發自動語音辨識 (ASR)模型,這些模型樹立了行業標桿,尤其是那些在Hugging Face Open ASR 排行榜上名列前茅的模型。
這些將語音轉錄為文字的NVIDIA NeMo ASR 模型提供了一系列旨在優化速度和準確性的架構:
- CTC 模型 ( nvidia/parakeet-ctc-1.1b ):模型具有FastConformer編碼器和 softmax 預測頭。它是非自回歸的,這意味著未來的預測不依賴先前的預測,從而實現快速且有效率的推理。
- RNN-T 模型 ( nvidia/parakeet-rnnt-1.1b ):此感測器模型為 FastConformer 編碼器添加了預測和聯合網絡,使其具有自回歸功能 – 每個預測都取決於先前的預測歷史記錄。由於這項特性,存在著常見的誤解,認為 RNN-T 模型對於 GPU 推理速度較慢,更適合 CPU。
- TDT 模型 ( nvidia/parakeet-tdt-1.1b ):另一個感測器模型,但使用稱為令牌和持續時間感測器 (TDT) 的精煉感測器目標進行訓練。雖然仍然是自回歸,但它可以在每個步驟執行多個預測,從而使其推理速度更快。
自動混合精密鑄造費用
從 NeMo 的早期開始,推理就在上下文管理器中執行。這會自動將float32權重投射到矩陣乘法或之前,從而允許使用半精度張量核心運算。在幕後,自動混合精度 (AMP) 維護一個儲存這些轉換的“轉換快取”,通常可以加快訓練速度。然而,出現了幾個問題: float16bfloat16
- 過時的自動施放行為:自動施放是在softmax和 等操很 少見時發展出來的。在Conformers和Transformers等現代模型中,這些操 作很 菲律賓電話號碼數據 常見,並導致float16或bfloat16輸入被強制轉換回float32,從而導致在每次矩陣乘法之前進行額外的強制轉換。
- 參數處理:為了讓 AMP 轉換快取有效,參數需要。不幸的是,在 NeMo 轉錄 API 中,該標誌設定為 False ( ),從而阻止快取工作並導致不必要的轉換開銷。 requires_grad=Truerequires_grad=False
- 頻繁清除快每次退出上下文管理器時都會清除強制轉換快取。使用者經常將單一推理呼叫包裝在上下文管理器中,從而阻礙了快取的有效利用。
透過全半精度推理解決 AMP 開銷
為了解決與 AMP 相關的挑戰,我們透過以半精度(float16或bfloat16)完全執行推理來實施最佳實踐。這種方法(在 GitHub 上的NVIDIA/NeMo Pull requests中描述)消除了不必要的轉換開銷,而不會影響準確性,因為即使指定了半精度輸入,精度敏感的操作(例如softmax 和 )仍然在幕後layer norm使用。float32請參閱AccumulateType和SoftMax範例。
優化批次以增強效能
在 NeMo 中,某些操作最初是依序執行的,一次處理小批量的一個元素。這種方法會導致速度減慢,因為每個核心操作都以批次大小 1 快速運行,但為每 最後的資料庫 個元素啟動 CUDA 核心的開銷會導致效率低下。透過切換到完全批次處理,我們充分利用了 GPU 串流多處理器資源。
CTC 貪婪解碼和特徵歸一化這兩個特定操作受到此問題的影響。透過從順序處理轉向完全批次處理,我們將每個操作的吞吐量提高了 10%,從而使整體速度提高了約 20%。
解決類似問題後, SpecAugment 的速度提高了 8-10 倍。 (這僅在訓練期間運行,因此不是這裡的重點。)
RNN-T 和 TDT 預測網路的計算強度低
RNN-T 和 TDT 模型由於其自回歸預測和聯合網絡,長期以來被認為不適合伺服器端 GPU 推理。例如,在 Parakeet RNN-T 1.1B 模型中,貪婪解碼消耗了總運行時間的 67%,儘管預測和聯合網路只佔模型參數的不到 1%。
原因是什麼?這些核心執行的工作非常少,以至於它們的 資料庫數據 效能完全受到核心啟動開銷的限制,從而使 GPU 大部分時間處於空閒狀態。舉例來說,執行 CUDA 核心可能只需要 1 到 3 微秒,而啟動一個核心可能需要 5 到 10 微秒。在實踐中,我們發現 GPU 大約 80% 的時間處於空閒狀態,這表明消除該空閒時間可以將推理速度提高 5 倍。
透過 CUDA 圖形條件節點中的動態控制流消除低計算強度
傳統上,CUDA Graph 用於消除核心啟動開銷。然而,它們不支援動態控制流,例如while循環,使得它們不適合在貪婪解碼中直接使用。CUDA Toolkit 12.4引入了CUDA Graphs 條件節點,可實現動態控制流。
我們使用這些節點來實現 RNN-T 和 TDT 模型的貪婪解碼,有效地消除了以下檔案中的所有核心啟動開銷
RNN-T 和 TDT 預測網路的分歧
執行批次 RNN-T 和 TDT 推理的一個重要問題是普通貪婪搜尋演算法的分歧。這種差異可能會導致一些輸入進行,而另一些輸入停滯,從而導致使用較大批次大小時延遲增加。因此,許多實作選擇批量大小為 1 的推理來避免此問題。然而,使用批量大小 1 會阻礙硬體的充分利用,這是低效且不經濟的。
常用於感測器解碼的傳統解碼演算法(圖 4)涉及嵌套循環設計:
- 外循環:迭代幀(編碼器輸出)
- 內循環:逐一檢索標籤,直到遇到特殊的空白符號
對於每個非空白符號,隱藏狀態和自回歸預測網路的輸出都應該更新。在批量推理過程中,內部循環可以為批次中的不同話語產生不同數量的標籤。因此,預測網路的呼叫數量由每幀所有話語中非空白標籤的最大數量決定,這是次優的。
使用高效的新解碼演算法解決分歧
為了解決傳統的幀循環解碼演算法問題,我們引入了一種新的標籤循環演算法,該演算法也使用嵌套循環,但有一個關鍵區別:循環的角色交換了(圖 5)。
- 外循環:迭代標籤,直到所有幀都已解碼。
- 內部循環:迭代幀,為批次中的每個話語標識帶有非空白標籤的下一幀。這是透過推進指向當前編碼器幀的索引來完成的,該索引針對批次中的每個話語而變化。
效能提升高達 10 倍,成本效益提升高達 4.5 倍
標籤循環和 CUDA 圖表使感測器模型的逆實時因子,即 RTFx(音訊產生的持續時間/計算時間;越高越好)比以往更接近 CTC 模型。這種影響在較小的模型中尤其明顯,其中減少的核心啟動開銷(尤其是在涉及預測網路權重和輸入張量等小資料大小的操作中)會帶來更大的效能提升。此外,由於新實施的向量化特徵歸一化解碼實現,CTC 模型的速度得到了顯著提高。