日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

低数值精度推理和训练

發(fā)布時間:2023/11/28 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 低数值精度推理和训练 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

低數(shù)值精度推理和訓(xùn)練
介紹
如今,大多數(shù)商業(yè)深度學(xué)習(xí)應(yīng)用程序使用 32 位浮點精度 ( ) 來處理訓(xùn)練和推理工作負(fù)載。各種研究人員已經(jīng)證明,深度學(xué)習(xí)訓(xùn)練和推理都可以以較低的數(shù)值精度進行,使用 16 位乘法器進行訓(xùn)練,使用 8 位乘法器進行推理,精度損失最小甚至沒有。使用這些較低的數(shù)值精度(使用累積到 32 位的 16 位乘法器進行訓(xùn)練,以及使用累積到 32 位的 8 位乘法器進行推理)可能會成為明年的標(biāo)準(zhǔn)。
英特爾? 正積極致力于在英特爾? 至強? 處理器和其他產(chǎn)品中實現(xiàn)較低數(shù)值精度的推理和訓(xùn)練。較低的數(shù)值精度有兩個主要好處。首先,許多操作都受內(nèi)存帶寬限制,降低精度將允許更好地使用緩存并減少帶寬瓶頸。因此,可以更快地通過內(nèi)存層次結(jié)構(gòu)移動數(shù)據(jù),以最大限度地利用計算資源。其次,硬件可以在較低的數(shù)值精度下實現(xiàn)更高的每秒運算 (OPS),因為這些乘法器需要更少的硅面積和功率。
在本文中,回顧了較低數(shù)值精度訓(xùn)練和推理的歷史,并描述了英特爾? 如何為深度學(xué)習(xí)推理和訓(xùn)練實現(xiàn)較低數(shù)值精度。具體而言,描述了當(dāng)前英特爾? 至強? 可擴展處理器中可用的指令以及未來英特爾? 至強? 可擴展處理器中可用的指令,這些處理器充當(dāng)稱為英特爾? 深度學(xué)習(xí)加速(英特爾? DL Boost)的嵌入式加速器。描述了如何量化模型權(quán)重和激活以及適用于深度神經(jīng)網(wǎng)絡(luò)的英特爾? 數(shù)學(xué)核心函數(shù)庫(英特爾? MKL-DNN)。
https://github.com/oneapi-src/oneDNN
最后,描述了深度學(xué)習(xí)框架如何利用這些較低數(shù)值精度的函數(shù)并減少不同數(shù)值精度之間的轉(zhuǎn)換開銷。每個部分都可以獨立于其他部分閱讀。包括深學(xué)習(xí)培訓(xùn)與英特爾至強處理器的可擴展商業(yè)實例進行詳細(xì)的論述,提出
https://software.intel.com/content/www/us/en/develop/articles/intel-processors-for-deep-learning-training.html
深度學(xué)習(xí)中低精度的簡史
研究人員已經(jīng)展示了使用 16 位乘法器進行深度學(xué)習(xí)訓(xùn)練,并使用 8 位乘法器或更少的數(shù)值精度進行推理,累積到更高的精度,并且各種模型的精度損失最小甚至沒有損失。將激活和權(quán)重量化為 8 位,并將偏差和第一層輸入保持在全精度 ( ),用于 CPU 上的語音識別任務(wù)。在前饋傳播中訓(xùn)練了一個具有 -1、0 和 1 量化權(quán)重的簡單網(wǎng)絡(luò),并使用 MNIST* 和 TIMIT* 數(shù)據(jù)集更新了反向傳播中的高精度權(quán)重,性能損失可忽略不計。在 MNIST、CIFAR-10* 和 SVHN* 數(shù)據(jù)集上訓(xùn)練模型,使用較低的數(shù)值精度乘法器和高精度累加器,并更新高精度權(quán)重;提議將動態(tài)不動點(張量或高維數(shù)組具有一個共享指數(shù))與隨機舍入作為未來的工作。
將權(quán)重和激活編碼為以 2 為底的對數(shù)表示(因為權(quán)重/激活具有非均勻分布);使用 5 位權(quán)重和 4 位激活對 CIFAR-10 進行了訓(xùn)練,從而最大限度地降低了性能下降。用二進制權(quán)重(第一層和最后一層除外)訓(xùn)練 AlexNet,并更新全精度權(quán)重,精度損失為 top-1 2.9%。根據(jù)實驗,建議避免在全連接層和具有小通道或濾波器大小(例如,1x1 內(nèi)核)的卷積層中進行二值化。
來自英特爾實驗室,在卷積層中使用 4 位權(quán)重和 8 位激活訓(xùn)練 ResNet-101,同時以最高 1 2% 的精度損失進行全精度更新。使用 16 位浮點 ( ) 乘法器和全精度累加器進行訓(xùn)練,并更新了全精度權(quán)重,AlexNet*、VGG-D*、GoogLeNet*、ResNet-50*、Faster R 的精度損失可以忽略不計甚至沒有損失-CNN*、Multibox SSD*、DeepSpeech2*、Sequence-to-Sequence*、bigLSTM* 和 DCGAN*(某些模型需要梯度縮放以匹配全精度結(jié)果)。
成功使用 8 位固定精度,1 個符號位,4 位整數(shù)部分和 3 位小數(shù)部分。使用了各種量化技術(shù)(見論文中的表 3),顯示在降低的精度下?lián)p失最小或沒有損失(除了第一層和最后一層保持全精度)。使用 16 位整數(shù)乘法器和 32 位累加器訓(xùn)練了 ResNet-50、GoogLeNet、VGG-16 和 AlexNet。描述了 Google 的 Tensorflow 處理單元 (TPU)* 原生支持用于訓(xùn)練工作負(fù)載的 bfloat16 數(shù)字格式,并將在未來的英特爾至強處理器和英特爾 Nervana 神經(jīng)處理器中使用。
最常見的 16 位數(shù)字格式和 8 位數(shù)字格式分別是 16 位 IEEE 浮點數(shù) ( fp16 )、bfloat16 ( bf16 )、16 位整數(shù) ( int16 )、 8 位整數(shù) ( int8 ) 和8 位 Microsoft* 浮點 ( ms-fp8 )。圖 1 顯示了其中一些格式之間的差異。

圖 1. 各種數(shù)字格式表示。s 表示符號位。FP32 和 BF16 提供與 FP32 相同的動態(tài)范圍,由于尾數(shù)較大,精度更高。
英特爾?至強?可擴展處理器采用英特爾? AVX-512 和英特爾? Deep Learning Boost,降低數(shù)值精度
英特爾至強可擴展處理器現(xiàn)在包括英特爾? Advance Vector Extension 512指令集。這些指令使較低的數(shù)值精度乘以較高的精度累加。將兩個 8 位值相乘并將結(jié)果累加到 32 位需要 3 條指令,并且需要 8 位向量之一為unsigned int8 ( u8 ) 格式,另一個為singed int8 ( s8 ) 格式,累加為singed int32 ( s32) 格式。以 3 倍多指令或 33.33% 多計算為代價的 4 倍多輸入。用于較低數(shù)值精度操作的減少的內(nèi)存和更高的頻率可以提供額外的性能增益。詳見圖 2。

圖 2. 英特爾至強可擴展處理器內(nèi)核通過 3 條指令實現(xiàn) 8 位乘法和 32 位累加:VPMADDUBSW υ8×s8→ s16 倍數(shù)、VPMADDWD broadcast1 s16 →s32和 VPADDD s32→s32將結(jié)果添加到累加器。這允許比fp32多 4 倍的輸入,代價是多 3 倍的指令或 33.33% 的計算量和 1/4 的內(nèi)存要求。減少的內(nèi)存和更高的頻率以及較低的數(shù)值精度使其更快。圖片來源以色列 Hirsh。
一個潛在的問題是在使用 VPMADDUBSW 指令υ8×s8→s16 時可能發(fā)生的未定義溢出行為(見圖 2)。當(dāng)接近最大值時,這是一個問題。這可以通過將輸入精度降低 1 位來緩解。另一種技術(shù)是將矩陣乘法分解為兩個矩陣乘法:一個使用 8 位乘法和 16 位累加的小值(以防止溢出),另一個使用全精度的稀疏大值。
英特爾正在添加一組新的英特爾 AVX-512 指令,稱為英特爾深度學(xué)習(xí)加速(英特爾 DL Boost),以進一步加速未來英特爾至強可擴展處理器的深度學(xué)習(xí)性能。第一套英特爾 DL Boost 技術(shù)稱為 AVX512_VNNI(矢量神經(jīng)網(wǎng)絡(luò)指令)將與代號為 Cascade Lake 的英特爾至強可擴展處理器和其他未來微架構(gòu)一起推出。AVX512_VNNI 包含一條 FMA 指令,用于 8 位乘法與 32 位累加u8×s8→s32 ,如圖 3 所示。累加到 s32 消除了溢出的風(fēng)險。理論峰值計算收益是4個的int8 在OPS FP32 OPS。實際上,由于內(nèi)存帶寬瓶頸,收益可能較低。

圖 3. Intel DL Boost AVX512_VNNI VPDPBUSD 指令通過 1 條指令u8×s8→s32實現(xiàn) 8 位乘法和 32 位累加,提供比 fp32 OPS 高 4 倍 int8 OPS 的理論峰值計算增益。 圖片來自 Israel Hirsh。
對這些 AVX512_VNNI 指令的編譯器支持正在進行中。開發(fā)代碼和編譯器已經(jīng)支持 AVX512_VNNI 指令。在2017年10月更新增加了對AVX512_VNNI指令的支持。
英特爾? MKL-DNN 庫低數(shù)值精度原語
英特爾 MKL-DNN 庫包含在各種模型中使用的流行深度學(xué)習(xí)函數(shù)或基元,例如內(nèi)積、卷積、整流線性單元 (ReLU) 和批量歸一化 (BN),以及操縱張量或高維數(shù)組。英特爾 MKL-DNN 針對采用英特爾 AVX-512、英特爾? AVX-2 和英特爾? Streaming SIMD Extensions 4.2(英特爾? SSE4.2)指令的英特爾處理器進行了優(yōu)化。這些函數(shù)使用?p32用于訓(xùn)練和推理工作負(fù)載。
引入了新函數(shù)來支持卷積、ReLU、融合卷積加 ReLU 和池化層中具有 8 位精度的推理工作負(fù)載。用于長短期記憶 (LSTM)、其他融合運算和 8 位 Winograd 卷積的函數(shù)被指定為未來的工作。英特爾 MKL-DNN 使用 AVX512_VNNI 指令對 16 位乘法的支持被設(shè)計為指令可用時的未來工作。
由于以下原因,英特爾 MKL-DNN 沒有以 8 位精度(僅使用fp32)實現(xiàn)的局部響應(yīng)歸一化 (LRN)、softmax 或批量歸一化 (BN) 層。現(xiàn)代模型不使用 LRN,可以修改舊模型以使用批量歸一化。softmax 函數(shù)和 BN 需要全精度,因為不能保持 8 位精度的精度。此外,不需要 BN 推理層后跟卷積,因為可以通過縮放權(quán)重值和修改偏差被其前一層吸收,如框架部分的啟用較低的數(shù)值精度中所述。
英特爾 MKL-DNN 使用υ8格式的激活(或輸入)值、s8格式的權(quán)重和s32格式的偏差來實現(xiàn) 8 位卷積運算(偏差可以保留在?p32中,們只占很小的百分比)的整體計算)。圖 4 顯示了將 8 位乘法器累積到s32的推理操作過程。

圖 4. 數(shù)據(jù)層或第一個卷積層激活被量化為υ8作為下一個卷積層的輸入。權(quán)重被量化為s8,偏差被格式化為s32并添加到s32卷積累加。框架根據(jù)下一層的參數(shù)選擇卷積輸出的格式為s8、υ8或s32。圖片來源:Jong Gong。
具有非負(fù)值和權(quán)重的 8 位激活量化
英特爾 MKL-DNN 當(dāng)前假設(shè)激活是非負(fù)的,這是在 ReLU 激活函數(shù)之后的情況。可將討論如何用負(fù)值量化激活。英特爾 MKL-DNN 量化給定張量或張量中每個通道的值(選擇取決于框架開發(fā)人員),如下所示。
R {a,w} = max? (abs(Τ {a,w} ) ),其中 Τ {a,w}是對應(yīng)于權(quán)重w或激活或模型輸入a的張量。
Q a = 255 / R a是非負(fù)值激活的量化因子,Q w = 127 / R w是權(quán)重的量化因子。量化的激活、權(quán)重和偏差是:

其中函數(shù) ||?|| 舍入到最接近的整數(shù)。雖然s8格式支持 -128,但最小的量化s8權(quán)重值使用是 -127。
使用8位乘法器和32位累加器的仿射變換得到

近似值是因為方程忽略了舍入運算,

是f32格式的仿射變換,D = 1 / Q a Q w是去量化因子。
在量化為υ8和s8格式時,零值映射到特定值而不進行任何舍入。鑒于零是最常見的值之一,擁有精確映射以減少量化誤差和提高統(tǒng)計精度是有利的。
在英特爾至強可擴展處理器中,上述量化因子可以采用 fp32 格式。但是,某些架構(gòu)不支持除法(例如 FPGA)并使用移位。對于這些架構(gòu),標(biāo)量四舍五入到最接近的 2 的冪,縮放是通過位移完成的。統(tǒng)計準(zhǔn)確性的降低是最小的(通常<1%)。
高效的 8 位乘法
在圖 5 中,演示了如何有效地執(zhí)行A × W的 8 位乘法。英特爾 MKL-DNN對激活張量使用NHWC數(shù)據(jù)布局,其中N是批量大小,H是高度,W是寬度,C是通道數(shù),一個 ( O / 16 )Κ ( C / 4 )Τ16o4c權(quán)重張量的數(shù)據(jù)布局,其中O是核數(shù)或輸出通道數(shù),C是輸入通道數(shù),Κ是高度,而Τ是寬度。以灰色顯示的張量A的前 32 位(4 個int8值)廣播 16 次以填充 512 位寄存器。英特爾 MKL-DNN在量化權(quán)重后修改張量W的數(shù)據(jù)布局。張量W數(shù)據(jù)布局按 16 列的組重新排列為W’,每列具有 32 位(4 個 int8 值),從第 1 列中的前 4 個值開始,在內(nèi)存中連續(xù)讀取,占據(jù)第 32 位寄存器(紅色),下一個 4x1 占用寄存器的下一個 32 位(橙色),依此類推(綠色)。第一個塊下方的第二個、第三個和第四個塊(黃色)以相同的模式重新排列。接下來是下一組塊(藍色)。在實踐中,張量W通常在重新排列內(nèi)存布局之前轉(zhuǎn)置,以便在重新排列數(shù)據(jù)布局時訪問 1x4 連續(xù)內(nèi)存值而不是 4x1 分散值。修改此數(shù)據(jù)布局通常完成一次并存儲以供所有推理迭代重復(fù)使用。

圖 5. 有效使用int8乘法來計算乘積A×W需要對張量W進行數(shù)據(jù)布局轉(zhuǎn)換,以便讀取連續(xù)位。A的 32 位組廣播 16 次以填充 512 位寄存器,然后乘以來自張量W’的 512 位組。
與第一寄存器INT8的值(拷貝16次),由64個乘以INT8的值(512位)W’和積累。A中接下來的 4 個值被廣播 16 次到另一個寄存器,該寄存器與W’的接下來 64 個int8值相乘。這一直持續(xù)到讀取A的第一行并累加結(jié)果。輸出(在 8 位 FMA 的所有 3 條指令之后)是前 16 個輸出值(在s32需要 512 位)。然后將A的第一行乘以W’的下一個值 產(chǎn)生接下來的 16 個輸出值。
英特爾至強可擴展處理器具有多達 32 個寄存器。在具有兩個 FMA 單元的處理器上以 512 位寄存器端口方案執(zhí)行時,端口 0 FMA 的延遲為 4 個周期,而端口 5 FMA 的延遲為 6 個周期。用于int8深度學(xué)習(xí)工作負(fù)載的指令支持旁路,并且端口 0 和 5 的延遲均為 5 個周期。實際上,多行W’被加載到多個寄存器以隱藏這些延遲。
用于訓(xùn)練的 16 位函數(shù)
英特爾 MKL-DNN 使用 AVX512_VNNI 指令對 16 位乘法的支持被設(shè)計為指令可用時的未來工作。盡管如此,研究人員已經(jīng)了通過利用 AVX512_4VNNI 指令(也稱為 QVNNI,在某些英特爾? 至強? Phi? 處理器上可用),特別是 AVX512_4VNNI VP4DPWSSD,使用 16 位乘法和 32 位累加的訓(xùn)練指令(類似于前面討論的 AVX512_VNNI VPDPWSSD 指令)。
這些研究人員匹配FP32 RESNET-50的統(tǒng)計性能,GoogLeNet-V1,VGG-16和AlexNet具有相同的迭代次數(shù)為?p32模式不改變超參數(shù)。用S16來存儲激活,權(quán)重和梯度,同時還保持的主副本?p32的權(quán)重為獲得量化回權(quán)重更新S16在每次迭代后。們使用二次冪的量化因子,這有助于通過張量乘法管理量化/反量化因子。
在框架中啟用較低的數(shù)值精度
流行的框架使用戶能夠定義模型,而無需自己編寫所有函數(shù)定義。各種功能的實現(xiàn)細(xì)節(jié)可以對框架用戶隱藏。這些實現(xiàn)由框架開發(fā)人員完成。本節(jié)解釋了框架級別所需的修改,以實現(xiàn)較低的數(shù)值精度
在推理開始之前完成權(quán)重的量化。有效地量化激活需要預(yù)先計算量化因子。激活量化因子通常是預(yù)先計算的,通常對驗證數(shù)據(jù)集進行采樣以找到如上所述的范圍。超出此范圍的測試數(shù)據(jù)集中的值已飽和到該范圍。對于負(fù)激活值,飽和前的范圍可以放寬到 - 128R a’ / 127以使用s8 = -128值,其中R a’是這些激活的最大絕對值。然后將這些標(biāo)量寫入文件。
具有負(fù)值的激活或輸入的 8 位量化
量化激活或具有負(fù)值的輸入值可以在框架級別實現(xiàn)如下。Q a’ = 127 / Ra’是負(fù)值激活的量化因子。在S8量化格式是一個S8 = ||常見一個’ 一個?32 || ∈ [-128, 127 ],其中函數(shù) ||?|| 舍入到最接近的整數(shù)。但是,激活必須是υ8格式才能利用 AVX512_VNNI VPMADDUBSW 指令或 AVX512_VNNI VPDPBUSD 指令(兩者都在使用英特爾至強可擴展處理器降低數(shù)值精度部分中進行了描述)。因此,所有值一s8移位Κ = 128為非負(fù)數(shù):

其中1是全 1 的向量,偏置b ?32修改為

量化權(quán)重和修正偏差的方法與以前相同:

使用8位乘法器和32位的仿射變換積聚在結(jié)果

其中

其中D = 1 / Q a′ Q w是去量化因子。
當(dāng)輸入信號已經(jīng)是υ8格式(例如 RGB 圖像)但需要預(yù)處理步驟來減去均值信號時,可以使用上述等式 其中K是均值,一個υ8是輸入信號(未預(yù)處理) ),且Q a′ = 1。
研究人員通常將第一個卷積層保留在?p32格式中,并在int8 中執(zhí)行其他卷積層(有關(guān)示例,請參見深度學(xué)習(xí)中低精度簡史部分)。觀察到,使用這些量化技術(shù)可以在int8 中使用所有卷積層,而不會顯著降低統(tǒng)計精度。
回顧一下,要使用具有負(fù)值的激活,激活被量化為s8格式,然后通過K=128 轉(zhuǎn)換為υ8格式。唯一的額外變化是修改偏差:
對于卷積層,乘積W ?32 1被推廣為等于W ?32沿所有維度的所有值的總和,除了與b ?32共享的維度。有關(guān)詳細(xì)信息,請參閱附錄 A。
融合量化
融合量化通過如下組合反量化和量化來提高性能,因此無需轉(zhuǎn)換為fp32。第l+1層的激活為:

其中g(shù)(?)是一個非線性激活函數(shù)。假設(shè) ReLU 激活函數(shù),激活可以表示為υ8格式,

其中乘積Q a (l+1) D (l)能夠以υ8格式計算下一層的量化激活,而無需計算?p32表示。
當(dāng)g(?)是 ReLU 函數(shù)(如下面的等式)且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 函數(shù)之前,并且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 的命名法。用藍色箭頭標(biāo)記的層依賴于 2 個或更多激活。圖片來源:Barukh Ziv、Etay Meiri、Eden Segal。
批量標(biāo)準(zhǔn)化
不需要批量歸一化 (BN)推理層,因為可以通過縮放權(quán)重值和修改偏差被其前一層吸收。這種技術(shù)僅適用于推理,并不是降低數(shù)值精度所獨有的。可以在框架級別而不是英特爾 MKL-DNN 實現(xiàn)。BN 通常應(yīng)用在仿射變換x = W a + b 之后和激活函數(shù)之前。BN 將x歸一化為零均值和單位范數(shù),然后將歸一化的向量分別縮放和移動 γ 和 β,這也是在訓(xùn)練期間學(xué)習(xí)的參數(shù)。在訓(xùn)練迭代期間,x使用小批量統(tǒng)計進行歸一化。為推論,平均è和方差V的X所使用的整個訓(xùn)練數(shù)據(jù)集或變體的統(tǒng)計數(shù)據(jù),諸如運行平均值這些統(tǒng)計訓(xùn)練期間計算的預(yù)先計算。在推理過程中,BN 輸出y為:

其中W′ = γ / V W和b′ = γ / V b + (β ? γ E / V ) 1. 也就是說,在推理過程中,BN 層可以通過調(diào)整前面的卷積層或全連接層中的權(quán)重和偏差來代替。
構(gòu)架
英特爾在啟用了 8 位推理。英特爾的 DL、Apache* * 和 * 優(yōu)化。所有這些 8 位優(yōu)化目前僅限于 CNN 模型。RNN 模型和其它框架都已推出。
在 Intel Distribution of Caffe 中,model.prototxt 文件被修改為包含預(yù)先計算的標(biāo)量,如圖 7 所示。目前,Caffe 的 Intel 優(yōu)化可以提供量化因子作為 2 的冪或常規(guī)?p32值,并且可以使用每個張量 1 個量化因子或每個通道 1 個量化因子。這些量化因子是使用英特爾 Caffe 發(fā)行版中內(nèi)置的采樣工具計算得出的。

圖 7. 量化因子被添加到 model.prototxt 文件中。圖片由 Haihao Shen 提供。
英特爾的深度學(xué)習(xí)是英特爾? 計算機視覺 SDK 的一部分。在 Linux* 和 Windows* 操作系統(tǒng)上可用,最初支持從 Caffe、MXNet* 和 TensorFlow* 框架訓(xùn)練的模型。推理引擎通過為各種硬件后端提供統(tǒng)一的 API 來促進深度學(xué)習(xí)解決方案的部署:采用英特爾 AVX-2 和英特爾 AVX-512 的英特爾至強處理器、英特爾凌動? 處理器、英特爾? 高清顯卡和英特爾? Arria ? 10(英特爾? A10) 不同數(shù)值精度的離散卡,具體取決于硬件。從 2018 年第二季度開始,推理引擎將支持英特爾至強可擴展處理器上的 8 位推理。
TensorFlow 已經(jīng)支持 8 位推理和各種量化。可以在訓(xùn)練或校準(zhǔn)階段動態(tài)計算比例或收集統(tǒng)計數(shù)據(jù),然后分配量化因子。包含這些標(biāo)量的 TensorFlow 圖形被寫入文件。具有相應(yīng)標(biāo)量的圖在推理過程中被量化和運行。TensorFlow 支持兩種量化方法。一種方法類似于英特爾 MKL-DNN,將最小值和最大值設(shè)置為加法倒數(shù)。另一個使用需要偏移加比例的最小值和最大值的任意值(英特爾 MKL-DNN 不支持)。有關(guān)更多詳細(xì)信息,請參閱 Pete Warden 的,但該博客已過時,因為不包含在 TensorFlow 中進行量化的所有方法。
TensorFlow 的另一個是以較低的數(shù)值精度重新訓(xùn)練或微調(diào)。微調(diào)可以提高統(tǒng)計性能。給定一個在?p32訓(xùn)練的模型,在其權(quán)重被量化后,然后使用量化的權(quán)重對模型進行微調(diào),并在每次訓(xùn)練迭代后重新量化權(quán)重。
TensorFlow Lite* 中采用的 Google 庫。使用 υ8 乘法,其中?32 = D × (υ8 ? Κ),Κ是映射到?p32 = 0的υ8值,而D > 0是去量化因子。
Apache MXNet 分支目前不支持 8 位。但是,MXNet 主要貢獻者之一的支持 8 位推理。在該分支中,有兩種量化值的方法:一種是將最小值映射到 0,將最大值映射到 255(零不會映射到精確值);其中絕對值的最大值映射到 -127 或 127(注意零映射到零——類似于英特爾 MKL-DNN)。與所提出的方法的主要區(qū)別在于,此 MXNet 分支中的標(biāo)量不是預(yù)先計算的。相反,們是在實際推理步驟中計算的,這降低了較低數(shù)值精度的好處。在該分支中,激活的標(biāo)量是通過將來自輸入的標(biāo)量與來自權(quán)重的標(biāo)量相乘來計算的:激活標(biāo)量 = 輸入標(biāo)量 * 權(quán)標(biāo)標(biāo)量,其中輸入 = 輸入標(biāo)量 * 量化輸入;權(quán)重 = 權(quán)重標(biāo)量 * 量化權(quán)重;激活 = 激活標(biāo)量 * 量化激活;輸入、權(quán)重、激活和標(biāo)量采用?p32格式,量化輸入和量化權(quán)重采用int8格式,量化激活采用int32格式)。雖然跟蹤激活的最小值和最大值,但僅在遇到fp32層(例如,softmax)時才對這些值進行反量化。
TensorRT為類似于英特爾 MKL-DNN 的s8格式,并通過最小化量化分布和參考分布之間的 KL 散度來尋找更緊密的范圍。
TPU 團隊,使用int8乘法的TPU被用于各種模型,包括 LSTM 模型。軟件堆棧來自 TensorFlow 圖形的 API 調(diào)用轉(zhuǎn)換為 TPU 指令。
Caffe2的文檔目前對量化沒有計劃已經(jīng)被透露,有“靈活的未來發(fā)展方向,如量化計算,”不過。
PyTorch 有一個quantize.py,提供各種量化選項,但沒有討論哪個更好。
Microsoft使用在英特爾? Stratix ? 10 FPGA上運行的自定義 8 位浮點格式 ( ms-fp8 ) 。這種格式、量化技術(shù)或框架實現(xiàn)的細(xì)節(jié)尚未公開。Project Brainwave* 支持 CNTK* 和 TensorFlow,并計劃通過將在流行框架中訓(xùn)練的模型轉(zhuǎn)換為基于圖形的內(nèi)部中間表示來支持許多其他模型。
模型和圖形優(yōu)化
模型優(yōu)化可以進一步提高推理性能。例如,在 ResNet 中,可以將 stride 操作移到更早的層,而無需修改最終結(jié)果并減少操作次數(shù),如圖 8 所示。此修改適用于 8 位和 32 位。

圖 8. 左側(cè)塊上顯示的步長 2 可以在推理期間移動到較早的層,這減少了操作次數(shù)并且不會修改結(jié)果。由 Eden Segal 和 Etay Meiri 提供。
結(jié)論
較低的數(shù)值精度推理和訓(xùn)練可以提高計算性能,而統(tǒng)計精度的降低最小或不降低。英特爾正在為當(dāng)前一代英特爾至強可擴展處理器的推理提供 8 位精度。英特爾還在支持編譯器、英特爾 MKL-DNN 庫和流行的深度學(xué)習(xí)框架的硬件和軟件中啟用 8 位精度進行推理和 16 位精度用于訓(xùn)練未來微架構(gòu)的硬件和軟件。
附錄 A:有關(guān)負(fù)值激活或輸入量化的詳細(xì)信息
為了讓讀者相信這些相同的公式(參見 8 位激活或負(fù)值輸入的量化部分)可以推廣到卷積層,使用每個張量條目的索引并通過步驟來顯示卷積輸出。令W ?32 ∈ ? O×C×K×T是具有O核或輸出通道、C輸入通道、Κ高度和Τ寬度的權(quán)重張量。修正后的偏差可以表示為:

其中

和ó我,C我,κ我,和τ我是谷粒或輸出通道,輸入通道,內(nèi)核高度指數(shù)分別和內(nèi)核寬度。卷積輸出可以表示如下。假設(shè)批量大小酮(省略為簡單起見批處理指數(shù))時,激活已已經(jīng)在零填充FP32格式(或等價地與填充Κ= 128在υ8格式),并且卷積是步幅一個。

附錄 B – 使用跳過連接的融合量化的詳細(xì)信息
是激活輸入通過圖6中的藍色箭頭標(biāo)記的層如下,其中層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,每個內(nèi)核并行計算可用于英特爾至強鉑金處理器、英特爾至強金牌處理器 6000 系列和 5122。其他英特爾至強可擴展處理器庫存單元 (SKU) 的每個內(nèi)核都有一個 FMA 單元,位于端口 0(有關(guān)詳細(xì)信息,請參閱第 15 章)。?p32、int16和int8 FMA 分別需要 1、2 和 3 條指令,使用英特爾 AVX-512 指令。Intel Xeon Platinum 8180 每個插槽有 28 個內(nèi)核,每個內(nèi)核有 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 頻率(這些對應(yīng)于?p64操作——數(shù)值精度較低的頻率更高,上面 fp32 和 int8 TOPS 計算中使用的頻率是估計值)。運行高 OPS 工作負(fù)載時,AVX-512 最大睿頻可能無法完全維持。
  2. 在實踐中,如果這些υ8值是在 ReLU 激活函數(shù)之前的激活,則它們通常更接近其最小值而不是最大值。
  3. 英特爾至強鉑金處理器、英特爾至強金牌處理器 6000 系列和 5122 提供每個內(nèi)核并行計算的兩個 512 位 FMA 單元。其他英特爾至強可擴展處理器 SKU 每個內(nèi)核具有一個 FMA 單元。

參考鏈接:
https://software.intel.com/content/www/us/en/develop/articles/lower-numerical-precision-deep-learning-inference-and-training.html

總結(jié)

以上是生活随笔為你收集整理的低数值精度推理和训练的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。