—— 完 ——
技術解讀:英特爾 x86 平臺上,AI 能力是如何進行演進的?(附PPT)
AI 計算力的指數增長意味著,為了解決越來越複雜的用例,即使是 1000 倍的計算效能增長也很容易被消耗。因此,需要透過軟體生態系統的助力,才能達到更好的效能。 我們相信,構建 AI 軟體生態系統,是將人工智慧和資料科學專案推向生產的關鍵。 本文整理自 龍蜥大講堂技術直播第四期, 由 龍蜥社群AI SIG核心成員、英特爾 AI 軟體開發⼯程師黃文歡 分享——用技術和例項講解英特爾 x86 平臺 AI 能力演進的關鍵。
一、英特爾 x86 平臺 AI 能力演進
-
AVX-512 VNNI:主要用於卷積神經網路的快速乘法累加。
-
AVX-512 BF16:用於更快計算的低精度 BFloat16 浮點數。
Intel ® DL Boost – VNNI
英特爾深度學習加速包括 AVX512 VNNI,VNNI 代表向量神經網路指令,是對標準英特爾指令集 AVX512 的擴充套件。AVX512 VNNI 旨在加速基於卷積神經網路的演算法。AVX512 透過引入 4 個新指令加快內部卷積神經網路環路。AVX512 VNNI 擴充套件背後的主要動機是觀察到許多緊密的迴圈需要兩個 16 位值或兩個 8 位值的重複乘法,並將結果累加到 32 位累加器。
圖2. 利用基礎AVX 512 vs. 利用AVX512 VNNI 做向量乘加
BFloat16(BF16) 主要思想是提供 16 位浮點格式,其動態範圍與標準 IEEE-FP32 相同,但精度較 FP32 變低。相當於指數區和 FP32 保持了相同的 8 位,並將 FP32 分數字段的小數區縮減到到了 7 位。大多數情況下,使用者在進行神經網路計算時,BF16 格式與 FP32 一樣準確,但是以一半的位數完成任務。因此,與 32 位相比,採用 BF16 吞吐量可以翻倍,記憶體需求可以減半。此外,fp32 到 bf16 的轉化,相對於 fp32 到 fp16 的轉化更加簡單。
二、英特爾AI 軟體開發及部署生態系統
oneDNN 是一個開源的跨平臺高效能庫,包含用於深度學習應用程式的基本構建模組。基於英特爾平臺,oneDNN 對深度神經網路進行 op 級以及指令集級的最佳化。
-
幫助開發人員建立高效能深度學習框架
-
相同的 API 為英特爾 cpu 和 gpu,使用最好的技術來完成這項工作
-
支援 Linux、Windows 和 macOS
-
支援關鍵資料型別:float32、float16、bfloat16 和 int8
-
實現了豐富的操作:convolution, matrix multiplication, pooling, batch normalization, activation functions, recurrent neural network (RNN) cells, and long short-term memory (LSTM) cells
-
支援自動檢測硬體指令,提高神經網路在指定硬體,特別是英特爾 CPU 和 GPU 上的執行速度。
- 運算元融合
- 佈局傳播
-
- 順序訪問 -
- 儘可能在最內層的迴圈中進行迭代,提高向量利用率
-
- 儘可能的重用資料,例如卷積層中的權重
通常,對於 CPU 上的某些張量操作,原生 TensorFlow 資料格式並不是最有效的資料佈局。對於 TensorFlow 中的 tensor, 所有 OneDNN 中的運算元使用都是高度最佳化的資料佈局。在這種情況下,我們插入一個從 TensorFlow 原生格式到內部格式的資料佈局轉換操作,在 CPU 上執行操作,並將操作輸出轉換回 TensorFlow 原生格式。需要注意的是我們應該避免冗餘的轉化開銷。而這些轉換會帶來效能開銷,因此帶來的挑戰在於如何避免不必要的轉換。所以,我們應該採用佈局傳播方式,佈局傳播就是用於識別出相鄰的互逆 reorder,並消除它們,從而減少了無效的操作。也就是最右邊的這張圖中的結構。
在佈局傳播方面,Intel ® Optimization for TensorFlow*中所做的最佳化為
-
查詢子圖,這個子圖中所有運算元都有OneDNN支援
-
在這樣的子圖的邊界上,引入資料佈局轉換
2.2.2 Intel ®Optimization for PyTorch*
-
運算元最佳化:為提高效能,IPEX最佳化了運算元並實現了多個定製的運算元。(透過ATen序號產生器制,一些ATen運算子會被在Intel ® Extension for PyTorch*的最佳化版本所取代。)還針對幾種流行的拓撲實現了一些定製運算元。如Mask R-CNN中的 ROIAlign and NMS.
-
圖最佳化:IPEX支援常用的運算元融合,如Conv2D+ReLU, Linear+ReLU等。運算元融合帶來的好處以透明的方式傳遞給使用者。IPEX支援FP32 和 BF16 融合模式,以及INT8融合模式
-
Runtime 最佳化: 為使用者提供了多個 PyTorch 前端 API,以便對執行緒執行時進行更細粒度的控制。它提供
-
- 透過 Python 前端模組 MultiStreamModule 進行多流推理
-
- 從 Python 和 C++ 前端生成非同步任務
-
- 從 Python 和 C++ 前端為 OpenMP 執行緒配置核心繫結
2.3 最佳化工具 INC
-
訓練後靜態量化(Post-training Static Quatization)
-
訓練後動態量化(Post training dynamic Quatization)
-
量化感知訓練(Quantization-aware training)
對於剪枝部分,深度學習網路模型從卷積層到全連線層存在著大量冗餘的引數,大量神經元啟用值趨近於 0,將這些神經元去除後可以表現出同樣的模型表達能力,這種情況被稱為過引數化,而對應的技術則被稱為模型剪枝。INC 中採用多種剪枝演算法,如非結構化剪枝(Magnitude-based 基於幅度剪枝), 結構化剪枝(Gradient sensitivity梯度敏感剪枝),生成具有預定義稀疏性目標的剪枝模型。
為了減少記憶體訪問,我們將 FP32 權重轉換為 BF16 權重,像下圖中右邊的圖結構所示。我們將 FP32 權重轉換為 BF16 權重並將 BF16 權重快取在 BF16 MatMul op 中以供重用,並在每次執行時並行的將 FP32 輸入轉換為 BF16 輸入。
在這樣的轉化下,我們可以使用 bfloat16 的點積計算 MatMul op,可以看到輸入為 BF16 型別, 輸出為 fp32 型別。
這些實現是利用了 oneDNN的 支援。
因此,我們只需要建立一個新的 BF16 MatMul op 來替換最佳化的 FP32 解決方案(Baseline)MatMul op,然後我們就可以實現BF16與 FP32 最佳化相比帶來的效能提升。
對於 BF16 最佳化方案,透過簡單的運算替換來提高效能,可以保持儘可能高的精度。對於 BiasAdd 操作,我們仍然保持 FP32 操作,以減少精度損失。
最後是一個最佳化後方案的效能和進度評估結果,為了比較最佳化後的 FP32 Bert 和最佳化後的 BF16 Bert 的效能差異,我們將batch size 設為1,token size 設為128,這也符合實際的線上業務。輸入是 MRPC 資料集。以延時為 21.70 毫秒的 FP32 解決方案為基準,可以看到最佳化的 BF16 解決方案與基線相比,延遲為 11.83 毫秒,端到端的效能提升達到了 1.83 倍,並且沒有 Accuracy 的損失。
本次直播影片回放已上線至龍蜥社群官網(首頁-社群-影片),直播 PPT 獲取方式:關注龍蜥社群公眾號,後臺回覆 【龍蜥課件】 或 【龍蜥影片回放】 即可。
相關連結地址 也可移步龍蜥社群公眾號2022年3月11日相同推送檢視
加入龍蜥社群
加入微信群:新增社群助理-龍蜥社群小龍(微信:openanolis_assis),備註【龍蜥】與你同在;加入釘釘群:掃描下方釘釘群二維碼。歡迎開發者/使用者加入龍蜥社群(OpenAnolis)交流,共同推進龍蜥社群的發展,一起打造一個活躍的、健康的開源作業系統生態!
龍蜥社群( OpenAnolis)是由 企事業單位、高等院校、科研單位、非營利性組織、個人等在自願、平等、開源、協作的基礎上組成的非盈利性開源社群。龍蜥社群成立於 2020 年 9 月,旨在構建一個開源、中立、開放的Linux 上游發行版社群及創新平臺。
龍蜥社群成立的短期目標是開發龍蜥作業系統(Anolis OS)作為 CentOS 停服後的應對方案,構建一個相容國際 Linux 主流廠商的社群發行版。中長期目標是探索打造一個面向未來的作業系統,建立統一的開源作業系統生態,孵化創新開源專案,繁榮開源生態。
目前, 龍蜥OS 8.4 已釋出,支援 X86_64 、Arm64、LoongArch 架構,完善適配 Intel、飛騰、海光、兆芯、鯤鵬、龍芯等晶片,並提供全棧國密支援。
歡迎加入我們,一起打造面向未來的開源作業系統!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70004278/viewspace-2871018/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 跨平臺技術演進
- Web技術持續演進,英特爾助力其隨變而變Web
- 移動開發的跨平臺技術演進移動開發
- 跨平臺技術演進及Flutter未來Flutter
- Flutter:移動端跨平臺技術演進之路Flutter
- 新技術如何促進線上教學平臺開發?
- 小菜前端的技術棧是如何規劃和演進的前端
- Flutter 基礎(一)移動開發的跨平臺技術演進Flutter移動開發
- jaeger的技術演進之路
- Codidate - 一個先進的線上技術面試平臺面試
- OTN技術的進展及演進趨勢
- 技術架構演進的思考架構
- 獨家解讀 | 滴滴機器學習平臺架構演進之路機器學習架構
- 雲端計算平臺上的大資料技術解讀!大資料
- vivo推送平臺架構演進架構
- 前端技術演進(七):前端跨棧技術前端
- 前端技術演進:參考文章前端
- 一文讀懂資料平臺建設的演進歷程
- 廣告引擎平臺化演進之路
- Apache SeaTunnel技術架構演進及其在AI領域的應用Apache架構AI
- 前端技術演進(一):Web前端技術基礎前端Web
- 讀AI未來進行式筆記06自動駕駛技術AI筆記自動駕駛
- 給AI開發者的新年禮物,技術公開課大放送(附演講PPT)AI
- 資料團隊是如何演進的?
- 前端技術演進(九):參考文章前端
- ByteHouse實時匯入技術演進
- 頁面靜態化技術演進
- 阿里雲的“全站加速”技術演進歷程阿里
- 研發協同平臺架構演進架構
- 解析UCloud人工智慧與英特爾背後的技術故事「上」Cloud人工智慧
- 如何進行合適的前端技術選型前端
- 從“智慧湖倉”架構的技術演進,看現代化資料平臺的發展方向架構
- 高德深度資訊接入的平臺化演進
- 如何利用AI技術推進班組建設?AI
- 程式設計師如何讓自己的技術能力突飛猛進?程式設計師
- Windows平臺上也可以進行iOS App的開發WindowsiOSAPP
- 螞蟻自研移動端 xNN-OCR 技術演進與能力開放
- 前端技術演進(二):前端與協議前端協議