王乾龍,許達文
(合肥工業大學 電子科學與應用物理學院,安徽 合肥 230601)
深度學習加速器(deep learning accelerator,DLA)作為一種專用于深度學習任務的ASIC設計,因為具有高性能、低功耗的特點,所以在可便攜設備中大量部署,廣泛應用于人工智能場景中。然而深度學習計算高度密集,每一層都包含復雜的卷積計算任務,給硬件實現帶來一些難題。2D計算陣列因為能很好地處理矩陣乘法和卷積計算,所以在DLA中被廣泛使用。比如谷歌的深度學習加速器TPU包含了規模為256×256大小的計算陣列,其中每個處理單元(processing element,PE)承擔著復雜的卷積計算任務。
隨著半導體技術變得越來越復雜,工藝偏差也可能使DLA制造過程中產生很多缺陷,一個嚴重的影響就是永久性故障的增加。一方面,在本文實驗中,PE的錯誤會導致很多計算結果錯誤,錯誤偏差在神經網絡任務執行期間不斷累積,顯著降低分類精度;另一方面,盡管可以在芯片制造后期測試過程中檢測出故障,但丟棄每一個帶有故障的芯片會顯著降低良品率。因此對出現故障的芯片進行修復是維持芯片正常功能、減少生產商損失的重要手段。因為2D計算陣列承擔著DLA的幾乎全部計算任務,對神經網絡任務的執行非常重要,所以本文主要關注對2D計算陣列中故障的修復。
研究人員在解決計算陣列中故障帶來的影響時,通常有2種思路。第1種思路是通過硬件方法解決,早期的學者通常會刪去故障所在的行或列,從而得到無故障的陣列。這類方法雖然簡單,但是會帶來嚴重的性能損失。后來研究人員提出利用冗余PE來替換陣列中的故障PE[1-2],但當故障分布不均勻時,這些方法也很容易失效。還有研究人員[3]采用統一的點乘單元作為冗余處理單元,并在進一步的工作中增加了分組的點乘單元與故障檢測功能[4]。雖然故障修復效果較好,但是存儲連續周期內所有進入陣列的數據需要額外的存儲開銷。第2種思路是通過軟件方法來解決,一些學者針對故障計算陣列重新訓練深度學習模型,雖然可以很好地維持模型的精度[5],但是模型重新訓練的過程非常耗時,而且很難用于其他故障配置。總之,仍然缺少DLA的容錯計算陣列架構、不能夠在原始模型下運行并以較低的資源開銷可以同時容忍各種故障配置。
為了解決這些問題,本文提出一種用于容錯DLA的重計算結構(recomputing architecture,RCA)。與將同類冗余PE添加到計算陣列內部的工作不同,本文實現了計算陣列外基于冗余的重計算單元(recomputing unit,RCU)。RCU中的每個PE負責計算陣列中單個故障PE的重新計算,通過將故障重新計算所需的部分數據進行延遲,RCU在稍后的周期中將重新計算2D計算陣列中故障PE上的所有輸出特征。當2D計算陣列中故障PE的數量不超過RCU大小時,RCA可以完全修復2D計算陣列。即使PE錯誤率進一步增加,RCA可以通過增加RCU的冗余規模,進一步提高容錯能力,也可以選擇修復出最大的計算陣列區域,減少性能損失。
早期的研究人員通常在計算陣列中添加冗余單元來減輕故障對陣列的影響。不同冗余設計方法中冗余的放置如圖1所示。圖 1a、圖1b所示分別為行冗余(row redundancy,RR)和列冗余(column redundancy,CR)[1],它將冗余放置在陣列的一側,其中的每個PE完成對一列或一行中故障的替換。圖1c所示為對角線冗余(diagonal redundancy,DR)[2],它將冗余PE放置在陣列的對角線上,每個PE完成對一行和一列中故障的替換。陣列中的PE出現故障時,都能找到對應的冗余PE來替換,但是當一個區域中故障PE的數目多于其對應的冗余個數時,這些方法往往也無法完全恢復計算陣列。

圖1 不同冗余設計方法中冗余的放置
為了分析故障對計算陣列的影響,本文將隨機位翻轉故障注入32×16計算陣列中PE的寄存器中,實現用于故障分析的模擬器,并使用Mnist 數據集運行典型的手寫數字分類任務,實驗結果如圖2所示。從圖2可以看出,精度隨著PE錯誤率的增加而大幅下降,表明錯誤PE的增加對預測準確率有著非常嚴重的影響。因此,對于關鍵任務應用程序來說,對計算陣列的保護十分有必要。

圖2 不同PE錯誤率神經網絡模型在DLA上的預測精度
為了修復2D計算陣列任意位置的故障,本文提出一種重計算結構(RCA),它具有由多個PE構成的重計算單元(RCU),可以一對一地進行2D計算陣列中任意位置故障PE的重新計算,并完成對錯誤結果的替換。具有RCA的DLA如圖3所示。

圖3 具有RCA的DLA
2D計算陣列大小為16×16,其中每個PE按給定的輸出固定數據流[6]順序地計算不同的輸出特征。同一列的PE共用輸入數據,權重則在不同列之間依次向右傳遞,輸出特征的局部計算結果保存在PE本地。對于完成一個輸出特征的計算,后一列結果的輸出總是比前一列慢一個周期。而RCU需要同時并行地進行多個不同列中故障PE對應的輸出特征的計算。因為RCU所需的輸入數據儲存在片上緩沖區多個地址中,并且增加多個讀取端口會帶來更多芯片面積開銷,所以難以從片上緩沖區中獲取RCU所需要的數據。
為了解決這一問題,本文延遲了重新計算,因為權重在計算陣列中依次向右傳遞,所以將延遲設置為從PE的第1列傳輸到最后一列所需要的16個周期。在重新計算的過程中,對于權重數據,RCU可以直接從最后一列的PE中進行讀取。因為前一列PE總是比后一列PE早一個周期用到相同的權重,在權重向右傳遞的過程中,其對應的輸入數據必須保留以進行接下來的重新計算,所以本文增加輸入先入先出隊列(first in first out,FIFO)來對輸入數據進行存儲以達到延遲讀取的目的,輸入FIFO采用多個深度依次遞減的FIFO組成,以對不同PE列的輸入數據進行對齊操作,確保RCU能夠同時并行進行多個故障PE的計算。因為RCU中的每個PE都可以完成單個故障PE的所有操作,所以當故障PE的數目不超過RCU大小時,RCU總是可以完成映射到故障PE操作的重新計算。此外,RCA還有一個故障PE表來記錄2D計算陣列中故障PE的坐標。RCU中的PE可以通過坐標選擇對應于某個故障PE的權重和輸入特征,從而進行重新計算。同時,這些坐標還可以指示地址生成單元確定寫入輸出緩沖區的地址,將重新計算的結果替換錯誤結果。此外RCU輸出還有一個寄存器文件,用于存儲RCU的計算結果以及將結果寫入到輸出緩沖區。
本文以帶有3個故障PE的16×16規模大小的2D計算陣列的RCA為例,來進一步說明RCA中的故障修復過程,其中RCU包括16個PE,RCA的故障修復過程如圖4所示。

圖4 RCA的故障修復過程
假設2D計算陣列的PE需要T周期才能產生完整的輸出特征。從周期T開始,PE的第1列開始將輸出特征寫入到輸出緩沖區。2D計算陣列將連續占用輸出緩沖區16個周期,將16列的輸出結果依次寫入到輸出緩沖區中。在整個過程中,RCU一直都在進行重新計算操作,由于RCU的重新計算只比最后一列慢了一個周期,接下來RCU將繼續占用輸出緩沖區。具體步驟如下:
(1) 在周期T時,2D計算陣列寫入開始。PE的第1列將生成的輸出特征寫入到輸出緩沖區,并開始計算新的輸出特征。因為有3個PE出現故障,所以用深色來標記PE的錯誤計算結果。用于故障PE上的權重繼續向右傳遞,輸入特征則存儲在輸入FIFO中,經過FIFO的延遲之后它們會被讀取到RCU中,以便進行重新計算。
(2) 在周期T+15時,2D計算陣列寫入結束。RCU根據故障PE表中的故障PE的坐標,分別讀取對應3個故障PE的輸入特征和權重,并完成3個輸出特征的計算。最終計算結果會被寫入到輸出寄存器中。
(3) 在周期T+16到周期T+18時,因為2D計算陣列中只有3個故障PE,所以需要3個周期才能將重新計算的結果從RCU中的寄存器寫入到輸出緩沖區。寫入地址由AGU根據故障PE表中的坐標確定。并通過掩碼的形式只更新錯誤的計算結果。因為T通常遠大于16,所以有足夠的時間來將重新計算的結果更新到輸出緩沖區而不會發生寫沖突。同時,RCU開始重新計算映射到2D計算陣列中的故障PE的最新輸出特征,結果保存在PE本地。
(4) 從周期T+19到周期2T-1,RCU占用輸出緩沖區結束。2D計算陣列和RCU都在進行新的輸出特征計算,并將部分計算結果保存在本地,在計算出新的輸出特征之前,輸出緩沖區端口將處于空閑狀態。
當2D計算陣列中的故障數目增加時,RCU可以通過增加冗余PE的數量以進一步提高RCA的故障修復能力。當故障PE的數量繼續增加并超出RCA的容錯極限時,本文放棄恢復完整計算陣列的目標,轉為修復出一片可用的計算陣列區域。為了盡可能保留計算能力,本文選擇從左到右進行故障修復以得到連續可用的計算陣列區域,并丟棄無法修復的故障PE列。在這項工作中,為了保留連續可用的計算陣列,RCA先修復最左側的故障PE,將其坐標寫入故障PE表里,按照之前講述的故障修復過程就可以修復出一塊可用的計算陣列區域。
RCU可以完成2D計算陣列中故障PE的重新計算,這就要求其能從多個輸入和權重中選出對應于故障PE的數據,RCU結構如圖5所示。

圖5 RCU結構
由圖5可知,RCU中的每個PE都是相互獨立的,分別承擔不同故障PE的重新計算任務。每個PE都對輸入和權重增加了多路復用器。根據故障PE表里的坐標,故障PE重新計算所需的權重和輸入特征將被選出,并在PE中進行重新計算。一段周期后,計算完成的輸出特征將被保存在輸出寄存器中,并在接下來的時間內寫入到輸出緩沖區替換錯誤的計算結果。
(1) RCA配置。本文提出的帶有RCA的深度學習加速器在Verilog中實現,并用TSMC 40 nm技術下的Design Compiler編譯而成。所使用的權重和輸入特征的數據寬度均為8 bit。除此之外,一些單元的配置信息見表1所列。

表1 RCA配置
(2) 故障模型。受到半導體制造工藝的影響,芯片制造過程中由于相同缺陷所導致的故障往往傾向于聚集在一起。因為不同的故障配置對實驗結果的影響很大,為了增加實驗的可靠性和說服力,所以本文在隨機分布模型的基礎上,增加了集群分布模型[7]。同時,為了降低故障分布對實驗結果的影響,類似于文獻[8]中的工作,本文采用PE錯誤率作為度量,對每個PE錯誤率隨機生成10 000個錯誤配置,并對實驗結果進行平均。
具有不同冗余方法的DLA的芯片面積如圖6所示。

圖6 不同冗余設計策略下的芯片面積
因為2D計算陣列為16×16規模大小,基于RR、CR、DR的傳統設計中冗余PE數量相同,但是DR需要增加1倍的多路復用器來實現對一行PE和一列PE中的故障替換,所以需要消耗更多的芯片面積。與傳統的冗余設計相比,基于RCA的設計展現出更少的冗余開銷。雖然RCU在進行數據選擇時也使用了一部分多路復用器,但在冗余PE相同的情況下,所用的多路復用器和寄存器文件的開銷要小得多。
本文用2個主要指標來評估不同冗余設計方法的故障修復能力,類似于文獻[3-4]中的工作。其中一個指標是全功能概率,指的是完全修復2D計算陣列中所有故障的概率。因為RCU中一個冗余PE只能修復一個故障PE,所以當故障PE的數目超過RCU的容錯能力時,全功能概率迅速降為0。基于不同冗余方法的DLA的全功能概率如圖7所示。從圖7可以看出,在相同的PE錯誤率下,RCA的全功能概率仍然要比其他3種冗余設計方法高得多。

圖7 基于不同冗余方法的DLA的全功能概率
當冗余設計方法無法對所有故障進行修復時,剩余的計算能力是衡量故障修復策略是否有效的關鍵。標準化剩余計算能力指的是剩余可用計算陣列占原始陣列大小的百分比。具有不同冗余方法的DLA的標準化剩余計算能力如圖8所示。


圖8 具有不同冗余方法的DLA的標準化剩余計算能力
從圖8可以看出,當故障數目超過16時,RCA在不能修復所有故障的情況下,仍表現出較高的剩余計算能力。這說明了RCA的故障修復更加靈活有效,而其他冗余設計的優化空間則很小。
不同的應用程序對DLA的性能要求不同。為了分析比較不同的冗余設計方法的可擴展性,本文設置了3種陣列規模來進行全功能概率實驗,類似于文獻[3]中的工作。為了公平比較,實驗只對比了冗余數目隨陣列規模同等比例擴展的RR和RCA。不同計算陣列大小上RCA和RR的可擴展性如圖9所示。從圖9可以看出,RCA在計算陣列擴展時,全功能概率幾乎沒有變化,表明RCA具有良好的可擴展性。相反,RR的全功能概率隨著陣列大小的增加明顯變差。同時,在計算陣列規模固定時,RCU的擴展可以修復更多的故障,可以預見到RCA的容錯能力將與RCU的大小成正比,這一點本文不再贅述。

圖9 不同計算陣列大小上RCA和RR的可擴展性
關鍵場景中的AI應用對DLA的可靠性要求很高。基于RR、CR、DR等常規陣列的冗余方法雖然能簡單地修復一些故障,但是容易受到故障分配不均的影響,即使冗余資源充足往往也無法修復所有故障。針對這一問題,本文提出了重計算結構(RCA),與傳統即時的故障修復策略不同,它有一組冗余PE組成的重計算單元(RCU),能夠從陣列邊緣獲得流經故障PE的數據,利用冗余PE重新進行故障PE的計算,并在存儲單元中替換錯誤的計算結果。當2D計算陣列中故障PE的數量不超過RCU大小時,RCA可以完全修復2D計算陣列。即使PE錯誤率進一步增加,RCA可以通過增加RCU的冗余規模,進一步提高容錯能力,也可以選擇修復出最大的計算陣列區域,減少性能損失。實驗表明,RCA具有較高的可擴展性和較小的芯片面積開銷,并在故障修復能力上大大優于之前的冗余方法。