低數值精度推理和訓練
介紹
如今,大多數商業深度學習應用程序使用 32 位浮點精度 ( ) 來處理訓練和推理工作負載。各種研究人員已經證明,深度學習訓練和推理都可以以較低的數值精度進行,使用 16 位乘法器進行訓練,使用 8 位乘法器進行推理,精度損失最小甚至沒有。使用這些較低的數值精度(使用累積到 32 位的 16 位乘法器進行訓練,以及使用累積到 32 位的 8 位乘法器進行推理)可能會成為明年的標准。
英特爾® 正積極致力於在英特爾® 至強® 處理器和其他產品中實現較低數值精度的推理和訓練。較低的數值精度有兩個主要好處。首先,許多操作都受內存帶寬限制,降低精度將允許更好地使用緩存並減少帶寬瓶頸。因此,可以更快地通過內存層次結構移動數據,以最大限度地利用計算資源。其次,硬件可以在較低的數值精度下實現更高的每秒運算 (OPS),因為這些乘法器需要更少的硅面積和功率。
在本文中,回顧了較低數值精度訓練和推理的歷史,並描述了英特爾® 如何為深度學習推理和訓練實現較低數值精度。具體而言,描述了當前英特爾® 至強® 可擴展處理器中可用的指令以及未來英特爾® 至強® 可擴展處理器中可用的指令,這些處理器充當稱為英特爾® 深度學習加速(英特爾® DL Boost)的嵌入式加速器。描述了如何量化模型權重和激活以及適用於深度神經網絡的英特爾® 數學核心函數庫(英特爾® MKL-DNN)。
https://github.com/oneapi-src/oneDNN
最后,描述了深度學習框架如何利用這些較低數值精度的函數並減少不同數值精度之間的轉換開銷。每個部分都可以獨立於其他部分閱讀。包括深學習培訓與英特爾至強處理器的可擴展商業實例進行詳細的論述,提出
https://software.intel.com/content/www/us/en/develop/articles/intel-processors-for-deep-learning-training.html
深度學習中低精度的簡史
研究人員已經展示了使用 16 位乘法器進行深度學習訓練,並使用 8 位乘法器或更少的數值精度進行推理,累積到更高的精度,並且各種模型的精度損失最小甚至沒有損失。將激活和權重量化為 8 位,並將偏差和第一層輸入保持在全精度 ( ),用於 CPU 上的語音識別任務。在前饋傳播中訓練了一個具有 -1、0 和 1 量化權重的簡單網絡,並使用 MNIST* 和 TIMIT* 數據集更新了反向傳播中的高精度權重,性能損失可忽略不計。在 MNIST、CIFAR-10* 和 SVHN* 數據集上訓練模型,使用較低的數值精度乘法器和高精度累加器,並更新高精度權重;提議將動態不動點(張量或高維數組具有一個共享指數)與隨機舍入作為未來的工作。
將權重和激活編碼為以 2 為底的對數表示(因為權重/激活具有非均勻分布);使用 5 位權重和 4 位激活對 CIFAR-10 進行了訓練,從而最大限度地降低了性能下降。用二進制權重(第一層和最后一層除外)訓練 AlexNet,並更新全精度權重,精度損失為 top-1 2.9%。根據實驗,建議避免在全連接層和具有小通道或濾波器大小(例如,1x1 內核)的卷積層中進行二值化。
來自英特爾實驗室,在卷積層中使用 4 位權重和 8 位激活訓練 ResNet-101,同時以最高 1 2% 的精度損失進行全精度更新。使用 16 位浮點 ( ) 乘法器和全精度累加器進行訓練,並更新了全精度權重,AlexNet*、VGG-D*、GoogLeNet*、ResNet-50*、Faster R 的精度損失可以忽略不計甚至沒有損失-CNN*、Multibox SSD*、DeepSpeech2*、Sequence-to-Sequence*、bigLSTM* 和 DCGAN*(某些模型需要梯度縮放以匹配全精度結果)。
成功使用 8 位固定精度,1 個符號位,4 位整數部分和 3 位小數部分。使用了各種量化技術(見論文中的表 3),顯示在降低的精度下損失最小或沒有損失(除了第一層和最后一層保持全精度)。使用 16 位整數乘法器和 32 位累加器訓練了 ResNet-50、GoogLeNet、VGG-16 和 AlexNet。描述了 Google 的 Tensorflow 處理單元 (TPU)* 原生支持用於訓練工作負載的 bfloat16 數字格式,並將在未來的英特爾至強處理器和英特爾 Nervana 神經處理器中使用。
最常見的 16 位數字格式和 8 位數字格式分別是 16 位 IEEE 浮點數 ( fp16 )、bfloat16 ( bf16 )、16 位整數 ( int16 )、 8 位整數 ( int8 ) 和8 位 Microsoft* 浮點 ( ms-fp8 )。圖 1 顯示了其中一些格式之間的差異。
圖 1. 各種數字格式表示。s 表示符號位。FP32 和 BF16 提供與 FP32 相同的動態范圍,由於尾數較大,精度更高。
英特爾®至強®可擴展處理器采用英特爾® AVX-512 和英特爾® Deep Learning Boost,降低數值精度
英特爾至強可擴展處理器現在包括英特爾® Advance Vector Extension 512指令集。這些指令使較低的數值精度乘以較高的精度累加。將兩個 8 位值相乘並將結果累加到 32 位需要 3 條指令,並且需要 8 位向量之一為unsigned int8 ( u8 ) 格式,另一個為singed int8 ( s8 ) 格式,累加為singed int32 ( s32) 格式。以 3 倍多指令或 33.33% 多計算為代價的 4 倍多輸入。用於較低數值精度操作的減少的內存和更高的頻率可以提供額外的性能增益。詳見圖 2。
圖 2. 英特爾至強可擴展處理器內核通過 3 條指令實現 8 位乘法和 32 位累加:VPMADDUBSW υ8×s8→ s16 倍數、VPMADDWD broadcast1 s16 →s32和 VPADDD s32→s32將結果添加到累加器。這允許比fp32多 4 倍的輸入,代價是多 3 倍的指令或 33.33% 的計算量和 1/4 的內存要求。減少的內存和更高的頻率以及較低的數值精度使其更快。圖片來源以色列 Hirsh。
一個潛在的問題是在使用 VPMADDUBSW 指令υ8×s8→s16 時可能發生的未定義溢出行為(見圖 2)。當接近最大值時,這是一個問題。這可以通過將輸入精度降低 1 位來緩解。另一種技術是將矩陣乘法分解為兩個矩陣乘法:一個使用 8 位乘法和 16 位累加的小值(以防止溢出),另一個使用全精度的稀疏大值。
英特爾正在添加一組新的英特爾 AVX-512 指令,稱為英特爾深度學習加速(英特爾 DL Boost),以進一步加速未來英特爾至強可擴展處理器的深度學習性能。第一套英特爾 DL Boost 技術稱為 AVX512_VNNI(矢量神經網絡指令)將與代號為 Cascade Lake 的英特爾至強可擴展處理器和其他未來微架構一起推出。AVX512_VNNI 包含一條 FMA 指令,用於 8 位乘法與 32 位累加u8×s8→s32 ,如圖 3 所示。累加到 s32 消除了溢出的風險。理論峰值計算收益是4個的int8 在OPS FP32 OPS。實際上,由於內存帶寬瓶頸,收益可能較低。
圖 3. Intel DL Boost AVX512_VNNI VPDPBUSD 指令通過 1 條指令u8×s8→s32實現 8 位乘法和 32 位累加,提供比 fp32 OPS 高 4 倍 int8 OPS 的理論峰值計算增益。 圖片來自 Israel Hirsh。
對這些 AVX512_VNNI 指令的編譯器支持正在進行中。開發代碼和編譯器已經支持 AVX512_VNNI 指令。在2017年10月更新增加了對AVX512_VNNI指令的支持。
英特爾® MKL-DNN 庫低數值精度原語
英特爾 MKL-DNN 庫包含在各種模型中使用的流行深度學習函數或基元,例如內積、卷積、整流線性單元 (ReLU) 和批量歸一化 (BN),以及操縱張量或高維數組。英特爾 MKL-DNN 針對采用英特爾 AVX-512、英特爾® AVX-2 和英特爾® Streaming SIMD Extensions 4.2(英特爾® SSE4.2)指令的英特爾處理器進行了優化。這些函數使用ƒp32用於訓練和推理工作負載。
引入了新函數來支持卷積、ReLU、融合卷積加 ReLU 和池化層中具有 8 位精度的推理工作負載。用於長短期記憶 (LSTM)、其他融合運算和 8 位 Winograd 卷積的函數被指定為未來的工作。英特爾 MKL-DNN 使用 AVX512_VNNI 指令對 16 位乘法的支持被設計為指令可用時的未來工作。
由於以下原因,英特爾 MKL-DNN 沒有以 8 位精度(僅使用fp32)實現的局部響應歸一化 (LRN)、softmax 或批量歸一化 (BN) 層。現代模型不使用 LRN,可以修改舊模型以使用批量歸一化。softmax 函數和 BN 需要全精度,因為不能保持 8 位精度的精度。此外,不需要 BN 推理層后跟卷積,因為可以通過縮放權重值和修改偏差被其前一層吸收,如框架部分的啟用較低的數值精度中所述。
英特爾 MKL-DNN 使用υ8格式的激活(或輸入)值、s8格式的權重和s32格式的偏差來實現 8 位卷積運算(偏差可以保留在ƒp32中,們只占很小的百分比)的整體計算)。圖 4 顯示了將 8 位乘法器累積到s32的推理操作過程。
圖 4. 數據層或第一個卷積層激活被量化為υ8作為下一個卷積層的輸入。權重被量化為s8,偏差被格式化為s32並添加到s32卷積累加。框架根據下一層的參數選擇卷積輸出的格式為s8、υ8或s32。圖片來源:Jong Gong。
具有非負值和權重的 8 位激活量化
英特爾 MKL-DNN 當前假設激活是非負的,這是在 ReLU 激活函數之后的情況。可將討論如何用負值量化激活。英特爾 MKL-DNN 量化給定張量或張量中每個通道的值(選擇取決於框架開發人員),如下所示。
R {a,w} = max (abs(Τ {a,w} ) ),其中 Τ {a,w}是對應於權重w或激活或模型輸入a的張量。
Q a = 255 / R a是非負值激活的量化因子,Q w = 127 / R w是權重的量化因子。量化的激活、權重和偏差是:
其中函數 ||⋅|| 舍入到最接近的整數。雖然s8格式支持 -128,但最小的量化s8權重值使用是 -127。
使用8位乘法器和32位累加器的仿射變換得到
近似值是因為方程忽略了舍入運算,
是f32格式的仿射變換,D = 1 / Q a Q w是去量化因子。
在量化為υ8和s8格式時,零值映射到特定值而不進行任何舍入。鑒於零是最常見的值之一,擁有精確映射以減少量化誤差和提高統計精度是有利的。
在英特爾至強可擴展處理器中,上述量化因子可以采用 fp32 格式。但是,某些架構不支持除法(例如 FPGA)並使用移位。對於這些架構,標量四舍五入到最接近的 2 的冪,縮放是通過位移完成的。統計准確性的降低是最小的(通常<1%)。
高效的 8 位乘法
在圖 5 中,演示了如何有效地執行A × W的 8 位乘法。英特爾 MKL-DNN對激活張量使用NHWC數據布局,其中N是批量大小,H是高度,W是寬度,C是通道數,一個 ( O / 16 )Κ ( C / 4 )Τ16o4c權重張量的數據布局,其中O是核數或輸出通道數,C是輸入通道數,Κ是高度,而Τ是寬度。以灰色顯示的張量A的前 32 位(4 個int8值)廣播 16 次以填充 512 位寄存器。英特爾 MKL-DNN在量化權重后修改張量W的數據布局。張量W數據布局按 16 列的組重新排列為W',每列具有 32 位(4 個 int8 值),從第 1 列中的前 4 個值開始,在內存中連續讀取,占據第 32 位寄存器(紅色),下一個 4x1 占用寄存器的下一個 32 位(橙色),依此類推(綠色)。第一個塊下方的第二個、第三個和第四個塊(黃色)以相同的模式重新排列。接下來是下一組塊(藍色)。在實踐中,張量W通常在重新排列內存布局之前轉置,以便在重新排列數據布局時訪問 1x4 連續內存值而不是 4x1 分散值。修改此數據布局通常完成一次並存儲以供所有推理迭代重復使用。
圖 5. 有效使用int8乘法來計算乘積A×W需要對張量W進行數據布局轉換,以便讀取連續位。A的 32 位組廣播 16 次以填充 512 位寄存器,然后乘以來自張量W'的 512 位組。
與第一寄存器INT8的值(拷貝16次),由64個乘以INT8的值(512位)W'和積累。A中接下來的 4 個值被廣播 16 次到另一個寄存器,該寄存器與W'的接下來 64 個int8值相乘。這一直持續到讀取A的第一行並累加結果。輸出(在 8 位 FMA 的所有 3 條指令之后)是前 16 個輸出值(在s32需要 512 位)。然后將A的第一行乘以W'的下一個值 產生接下來的 16 個輸出值。
英特爾至強可擴展處理器具有多達 32 個寄存器。在具有兩個 FMA 單元的處理器上以 512 位寄存器端口方案執行時,端口 0 FMA 的延遲為 4 個周期,而端口 5 FMA 的延遲為 6 個周期。用於int8深度學習工作負載的指令支持旁路,並且端口 0 和 5 的延遲均為 5 個周期。實際上,多行W'被加載到多個寄存器以隱藏這些延遲。
用於訓練的 16 位函數
英特爾 MKL-DNN 使用 AVX512_VNNI 指令對 16 位乘法的支持被設計為指令可用時的未來工作。盡管如此,研究人員已經了通過利用 AVX512_4VNNI 指令(也稱為 QVNNI,在某些英特爾® 至強® Phi™ 處理器上可用),特別是 AVX512_4VNNI VP4DPWSSD,使用 16 位乘法和 32 位累加的訓練指令(類似於前面討論的 AVX512_VNNI VPDPWSSD 指令)。
這些研究人員匹配FP32 RESNET-50的統計性能,GoogLeNet-V1,VGG-16和AlexNet具有相同的迭代次數為ƒp32模式不改變超參數。用S16來存儲激活,權重和梯度,同時還保持的主副本ƒp32的權重為獲得量化回權重更新S16在每次迭代后。們使用二次冪的量化因子,這有助於通過張量乘法管理量化/反量化因子。
在框架中啟用較低的數值精度
流行的框架使用戶能夠定義模型,而無需自己編寫所有函數定義。各種功能的實現細節可以對框架用戶隱藏。這些實現由框架開發人員完成。本節解釋了框架級別所需的修改,以實現較低的數值精度
在推理開始之前完成權重的量化。有效地量化激活需要預先計算量化因子。激活量化因子通常是預先計算的,通常對驗證數據集進行采樣以找到如上所述的范圍。超出此范圍的測試數據集中的值已飽和到該范圍。對於負激活值,飽和前的范圍可以放寬到 - 128R a' / 127以使用s8 = -128值,其中R a'是這些激活的最大絕對值。然后將這些標量寫入文件。
具有負值的激活或輸入的 8 位量化
量化激活或具有負值的輸入值可以在框架級別實現如下。Q a' = 127 / Ra'是負值激活的量化因子。在S8量化格式是一個S8 = ||常見一個' 一個ƒ32 || ∈ [-128, 127 ],其中函數 ||⋅|| 舍入到最接近的整數。但是,激活必須是υ8格式才能利用 AVX512_VNNI VPMADDUBSW 指令或 AVX512_VNNI VPDPBUSD 指令(兩者都在使用英特爾至強可擴展處理器降低數值精度部分中進行了描述)。因此,所有值一s8移位Κ = 128為非負數:
其中1是全 1 的向量,偏置b ƒ32修改為
量化權重和修正偏差的方法與以前相同:
使用8位乘法器和32位的仿射變換積聚在結果
其中
其中D = 1 / Q a′ Q w是去量化因子。
當輸入信號已經是υ8格式(例如 RGB 圖像)但需要預處理步驟來減去均值信號時,可以使用上述等式 其中K是均值,一個υ8是輸入信號(未預處理) ),且Q a′ = 1。
研究人員通常將第一個卷積層保留在ƒp32格式中,並在int8 中執行其他卷積層(有關示例,請參見深度學習中低精度簡史部分)。觀察到,使用這些量化技術可以在int8 中使用所有卷積層,而不會顯着降低統計精度。
回顧一下,要使用具有負值的激活,激活被量化為s8格式,然后通過K=128 轉換為υ8格式。唯一的額外變化是修改偏差:
對於卷積層,乘積W ƒ32 1被推廣為等於W ƒ32沿所有維度的所有值的總和,除了與b ƒ32共享的維度。有關詳細信息,請參閱附錄 A。
融合量化
融合量化通過如下組合反量化和量化來提高性能,因此無需轉換為fp32。第l+1層的激活為:
其中g(⋅)是一個非線性激活函數。假設 ReLU 激活函數,激活可以表示為υ8格式,
其中乘積Q a (l+1) D (l)能夠以υ8格式計算下一層的量化激活,而無需計算ƒp32表示。
當g(⋅)是 ReLU 函數(如下面的等式)且Q ≥ 0 時,以下屬性成立:
此屬性對於具有跳過連接的模型很有用,例如 ResNet,其中跳過連接分支可能依賴於各種激活。例如,使用 ResNet-50 作者在 Caffe 的deploy.prototxt 中的命名法(見圖 6),res2b_branch2a層(在下面的等式中縮寫為2b2a)中的量化輸入激活是
其中aυ8 (2b2a) ∈ [0,127 ](而不是 [0,255 ] )因為Qa (2b2a) D (2a1) x s32 (2a1) ∈ [ -128, 127 ]是s8格式,因為乘積在 ReLU 函數之前,並且Qa (2b2a) = 127 / R a (2b2a)是量化因子。按照這個過程,在附錄 B 中表明激活a (2c2a) υ8取決於x s32 (2a1) , x s32 (2a2c) 和x s32(2b2c)。類似地,激活a υ8 (3ca) 取決於x s32 (2a1)、 x s32 (2a2c)、 x s32 (2b2c) 和x s32 (2c2c)。
圖 6. ResNet-50 中第二組殘差塊(以及第三組中的第一個分支)的圖,使用了 ResNet-50 作者在 Caffe 的命名法。用藍色箭頭標記的層依賴於 2 個或更多激活。圖片來源:Barukh Ziv、Etay Meiri、Eden Segal。
批量標准化
不需要批量歸一化 (BN)推理層,因為可以通過縮放權重值和修改偏差被其前一層吸收。這種技術僅適用於推理,並不是降低數值精度所獨有的。可以在框架級別而不是英特爾 MKL-DNN 實現。BN 通常應用在仿射變換x = W a + b 之后和激活函數之前。BN 將x歸一化為零均值和單位范數,然后將歸一化的向量分別縮放和移動 γ 和 β,這也是在訓練期間學習的參數。在訓練迭代期間,x使用小批量統計進行歸一化。為推論,平均È和方差V的X所使用的整個訓練數據集或變體的統計數據,諸如運行平均值這些統計訓練期間計算的預先計算。在推理過程中,BN 輸出y為:
其中W′ = γ / V W和b′ = γ / V b + (β − γ E / V ) 1. 也就是說,在推理過程中,BN 層可以通過調整前面的卷積層或全連接層中的權重和偏差來代替。
構架
英特爾在啟用了 8 位推理。英特爾的 DL、Apache* * 和 * 優化。所有這些 8 位優化目前僅限於 CNN 模型。RNN 模型和其它框架都已推出。
在 Intel Distribution of Caffe 中,model.prototxt 文件被修改為包含預先計算的標量,如圖 7 所示。目前,Caffe 的 Intel 優化可以提供量化因子作為 2 的冪或常規ƒp32值,並且可以使用每個張量 1 個量化因子或每個通道 1 個量化因子。這些量化因子是使用英特爾 Caffe 發行版中內置的采樣工具計算得出的。
圖 7. 量化因子被添加到 model.prototxt 文件中。圖片由 Haihao Shen 提供。
英特爾的深度學習是英特爾® 計算機視覺 SDK 的一部分。在 Linux* 和 Windows* 操作系統上可用,最初支持從 Caffe、MXNet* 和 TensorFlow* 框架訓練的模型。推理引擎通過為各種硬件后端提供統一的 API 來促進深度學習解決方案的部署:采用英特爾 AVX-2 和英特爾 AVX-512 的英特爾至強處理器、英特爾凌動® 處理器、英特爾® 高清顯卡和英特爾® Arria ® 10(英特爾® A10) 不同數值精度的離散卡,具體取決於硬件。從 2018 年第二季度開始,推理引擎將支持英特爾至強可擴展處理器上的 8 位推理。
TensorFlow 已經支持 8 位推理和各種量化。可以在訓練或校准階段動態計算比例或收集統計數據,然后分配量化因子。包含這些標量的 TensorFlow 圖形被寫入文件。具有相應標量的圖在推理過程中被量化和運行。TensorFlow 支持兩種量化方法。一種方法類似於英特爾 MKL-DNN,將最小值和最大值設置為加法倒數。另一個使用需要偏移加比例的最小值和最大值的任意值(英特爾 MKL-DNN 不支持)。有關更多詳細信息,請參閱 Pete Warden 的,但該博客已過時,因為不包含在 TensorFlow 中進行量化的所有方法。
TensorFlow 的另一個是以較低的數值精度重新訓練或微調。微調可以提高統計性能。給定一個在ƒp32訓練的模型,在其權重被量化后,然后使用量化的權重對模型進行微調,並在每次訓練迭代后重新量化權重。
TensorFlow Lite* 中采用的 Google 庫。使用 υ8 乘法,其中ƒ32 = D × (υ8 −Κ),Κ是映射到ƒp32 = 0的υ8值,而D > 0是去量化因子。
Apache MXNet 分支目前不支持 8 位。但是,MXNet 主要貢獻者之一的支持 8 位推理。在該分支中,有兩種量化值的方法:一種是將最小值映射到 0,將最大值映射到 255(零不會映射到精確值);其中絕對值的最大值映射到 -127 或 127(注意零映射到零——類似於英特爾 MKL-DNN)。與所提出的方法的主要區別在於,此 MXNet 分支中的標量不是預先計算的。相反,們是在實際推理步驟中計算的,這降低了較低數值精度的好處。在該分支中,激活的標量是通過將來自輸入的標量與來自權重的標量相乘來計算的:激活標量 = 輸入標量 * 權標標量,其中輸入 = 輸入標量 * 量化輸入;權重 = 權重標量 * 量化權重;激活 = 激活標量 * 量化激活;輸入、權重、激活和標量采用ƒp32格式,量化輸入和量化權重采用int8格式,量化激活采用int32格式)。雖然跟蹤激活的最小值和最大值,但僅在遇到fp32層(例如,softmax)時才對這些值進行反量化。
TensorRT為類似於英特爾 MKL-DNN 的s8格式,並通過最小化量化分布和參考分布之間的 KL 散度來尋找更緊密的范圍。
TPU 團隊,使用int8乘法的TPU被用於各種模型,包括 LSTM 模型。軟件堆棧來自 TensorFlow 圖形的 API 調用轉換為 TPU 指令。
Caffe2的文檔目前對量化沒有計划已經被透露,有“靈活的未來發展方向,如量化計算,”不過。
PyTorch 有一個quantize.py,提供各種量化選項,但沒有討論哪個更好。
Microsoft使用在英特爾® Stratix ® 10 FPGA上運行的自定義 8 位浮點格式 ( ms-fp8 ) 。這種格式、量化技術或框架實現的細節尚未公開。Project Brainwave* 支持 CNTK* 和 TensorFlow,並計划通過將在流行框架中訓練的模型轉換為基於圖形的內部中間表示來支持許多其他模型。
模型和圖形優化
模型優化可以進一步提高推理性能。例如,在 ResNet 中,可以將 stride 操作移到更早的層,而無需修改最終結果並減少操作次數,如圖 8 所示。此修改適用於 8 位和 32 位。
圖 8. 左側塊上顯示的步長 2 可以在推理期間移動到較早的層,這減少了操作次數並且不會修改結果。由 Eden Segal 和 Etay Meiri 提供。
結論
較低的數值精度推理和訓練可以提高計算性能,而統計精度的降低最小或不降低。英特爾正在為當前一代英特爾至強可擴展處理器的推理提供 8 位精度。英特爾還在支持編譯器、英特爾 MKL-DNN 庫和流行的深度學習框架的硬件和軟件中啟用 8 位精度進行推理和 16 位精度用於訓練未來微架構的硬件和軟件。
附錄 A:有關負值激活或輸入量化的詳細信息
為了讓讀者相信這些相同的公式(參見 8 位激活或負值輸入的量化部分)可以推廣到卷積層,使用每個張量條目的索引並通過步驟來顯示卷積輸出。令W ƒ32 ∈ℜ O×C×K×T是具有O核或輸出通道、C輸入通道、Κ高度和Τ寬度的權重張量。修正后的偏差可以表示為:
其中
和Ó我,C我,κ我,和τ我是谷粒或輸出通道,輸入通道,內核高度指數分別和內核寬度。卷積輸出可以表示如下。假設批量大小酮(省略為簡單起見批處理指數)時,激活已已經在零填充FP32格式(或等價地與填充Κ= 128在υ8格式),並且卷積是步幅一個。
附錄 B – 使用跳過連接的融合量化的詳細信息
是激活輸入通過圖6中的藍色箭頭標記的層如下,其中層res2b_branch2a縮寫為2b2a在下面的方程與其它層類似的縮寫。
1. 原始計算可以計算為 AVX-512-frequency * number-of-cores * number-of-FMAs-per-core * 2-operations-per-FMA * SIMD-vector-length / number-of-bits -in-numeric-format / number-of-instructions。兩個 512 位 FMA 單元位於端口 0 和 5,每個內核並行計算可用於英特爾至強鉑金處理器、英特爾至強金牌處理器 6000 系列和 5122。其他英特爾至強可擴展處理器庫存單元 (SKU) 的每個內核都有一個 FMA 單元,位於端口 0(有關詳細信息,請參閱第 15 章)。ƒp32、int16和int8 FMA 分別需要 1、2 和 3 條指令,使用英特爾 AVX-512 指令。Intel Xeon Platinum 8180 每個插槽有 28 個內核,每個內核有 2 個 FMA。該ƒp32每個插槽的 OPS 約為 1.99-GHz-AVX-512 頻率 * 28 核 * 每核 2-FMA-units-per-FMA * 2-OPS-per-FMA * 512-bits / 32-bits / 1-instruction = 3.570 ƒp32 上衣。每個插槽的int8 OPS 約為 2.17-GHz-AVX-512-frequency * 28-cores * 2-FMA-units-per-core * 2-OPS-per-FMA * 512-bits / 8-bits / 3-instruction = 5.185 int8 TOPS。可以找到多個 SKU 的 AVX-512 頻率(這些對應於ƒp64操作——數值精度較低的頻率更高,上面 fp32 和 int8 TOPS 計算中使用的頻率是估計值)。運行高 OPS 工作負載時,AVX-512 最大睿頻可能無法完全維持。
2. 在實踐中,如果這些υ8值是在 ReLU 激活函數之前的激活,則它們通常更接近其最小值而不是最大值。
3. 英特爾至強鉑金處理器、英特爾至強金牌處理器 6000 系列和 5122 提供每個內核並行計算的兩個 512 位 FMA 單元。其他英特爾至強可擴展處理器 SKU 每個內核具有一個 FMA 單元。
參考鏈接:
https://software.intel.com/content/www/us/en/develop/articles/lower-numerical-precision-deep-learning-inference-and-training.html