現在都2202年了,用CPU做AI推理訓練到底能不能行?

語言: CN / TW / HK

機器之心原創

作者:思

CPU 不適合模型推理和訓練?那已經是老刻板印象了,英特 ® 至強 ® 可擴展 處理器搭配 AVX-512 指令集,單核一次能同時進行 128 次 BF16 浮點運算,這對於一般的深度學習模型不論在訓練還是推理已經是足夠的了。

説到模型訓練,很多算法工程師首先想到的就是各種深度學習框架,以及 CUDA、cuDNN、NCCL 等 GPU 訓練環境,似乎我們很少優先考慮在 CPU 上直接訓練模型。這可能是在潛意識裏,我們將 CPU 視為不適合並行計算的設備,思考着,也許 CPU 訓練模型不僅速度慢,同時內存等資源佔用也不少。

但實際上,經過這麼多年的發展,像英特爾 ® 至強 ® 可擴展處理器這種 AI build-in 的 CPU 在支持模型訓練上已經有了極大的提升,基本上每一代 CPU 都比上一代提升個 1.5 倍左右,運用或不運用 CPU 模型訓練加速庫的差別,能達到 8 倍。因此整體上 CPU 的訓練速度已經非常可觀了,再加上相比顯存更易擴展的 CPU 內存,很多推薦算法、排序模型、圖片 / 影像識別等應用,已經在大規模使用 CPU 作為基礎計算設備。

本文將主要介紹近幾年 英特爾 ® 至強 ® 可擴展處理器 在模型訓練上的努力與進展,包括 AVX-512 指令集、DL Boost 低精度訓練模型等等;用這一套配置實操訓練模型也很簡單,這裏我們將簡單看看 英特爾 ® 至強 ® 可擴展處理器 上的模型該怎麼訓練最為高效;最後,相比高昂的 GPU,CPU 其實是一種性價比很高的訓練硬件,也非常適合對結果準確度要求高兼顧成本考量的製造業、圖像處理與分析等行業客户的深度學習模型。

CPU 上的深度模型訓練

在 CPU 上訓練模型,看起來很簡單,但實際上要做到高效訓練還是很複雜的。作為一種通用計算設備,英特爾 ® 至強 ® 可擴展處理器要為各種設備或者軟件提供計算支持。如果想要更好地支持深度學習模型,那麼從底層指令集的設計,到矩陣運算加速庫,再到神經網絡加速庫,都需要額外的設計與優化。

底層優化:AVX-512 指令集

瞭解過計算機組成原理的同學們都知道,CPU 指令集或者説指令系統,是實現計算機能力的核心部分。在 CPU 的眼裏,它只會一條條執行指令,例如加法指令,從內存讀取某個值的指令等等。如果放到神經網絡計算流,那麼優化或者增加一些基礎指令,例如支持 FP16 的矩陣運算、支持單指令多條運算數據等等,就能大大提高 CPU 運行神經網絡計算流的能力。

英特爾 AVX-512 指令集的目的就旨在提升單條指令的計算數量,從而提升 CPU 的矩陣運算效率。簡單而言,一條指令一般分為操作碼部分與地址碼(內存地址)部分,早期通用處理器一般是基於 SISD(單指令單數據流)指令,即每個核心中,一個指令單次操作一條數據。因此當我們計算一個向量內積,一個值需要和好幾個值進行乘加運算,因此就需要好幾條類似的指令,它們具有相同的操作碼,只是不同的地址碼。

SIMD(單指令多數據流)就為了解決這個問題,它能讓一個指令可以單次操作多條數據。此外,英特爾還為特意為矩陣運算場景加入了 FMA (Fused multiply-add)指令集,讓處理器一次能同時完成乘法和加法兩種基本操作。

同樣一個向量內積,單指令單數據流需要拆分成多條指令,單指令多數據流只需要一條指令。

現在,英特爾至強處理器所採用的 AVX-512 指令集(Advanced Vector Extensions,AVX),在 SIMD 的基本想法上,已經經過 20 多年的優化與發展,其寄存器已由最初的 64 位升級到了 512 位,且具備兩個 512 位的 FMA (融合乘加運算指令)單元,這意味着應用程序可同時執行 32 次雙精度、64 次單精度浮點運算,或操作八個 64 位和十六個 32 位整數。

加速訓練:DL Boost

前面我們介紹了非常基礎的 AVX-512 指令集,假設數值精度是模型訓練常用的 FP32,單個 512 位寄存器能存儲 16 個浮點數,如果配合兩個 FMA 單元可以同時執行 16*2*2=64 次浮點運算。那麼我們會想到,要是訓練和推理模型,用不上 FP32 精度,只需要 BF16 或者 INT8,豈不是並行計算的數量要翻一到兩倍?再加上內存可以移動更多的數據量,總體低精度計算要快上好幾倍?

英特爾 DL Boost 就是這樣思考的,其技術的精髓就是把對低精度數據格式的操作指令融入到了 AVX-512 指令集中,即 AVX-512_VNNI (矢量神經網絡指令) 和 AVX-512_BF16(bfloat16),分別提供了對 INT8(主要用於量化推理)和 BF16(兼顧推理和訓練)的支持。

不同指令集中,單條 SIMD 指令能包含的數據類型及數據量。

2020 年問世的第三代英特爾 ® 至強 ® 可擴展處理器家族已集成了英特爾深度學習加速技術這兩種 AI 加速指令集,並被廣泛運用於商業深度學習的訓練和推理過程。其中,AVX-512_VNNI 理論上可使推理效率提升至 4 倍,而 AVX-512_BF16 則能幫助訓練性能提升達 1.93 倍。

讓我們來看看更接地氣的實踐場景。以圖像分析為例,如圖三所示,如果在影像分析場景中引入集成有英特爾深度學習加速技術的英特爾 ® 至強 ® 可擴展處理器,配合 OpenVINO 工具套件,在對檢測模型進行了 INT8 轉換和優化後,推理速度較原始方案提升高達 8.24 倍,且精確度損失不到 0.17%。

對模型進行轉換、優化前後在英特爾 ® 至強 ® 可擴展處理器上的效果對比 。

AI 實訓:極高性價比

在瞭解 英特爾 ® 至強 ® 可擴展處理器加速模型訓練的基本原理之後,我們再來考慮一件事,在模型計算量不那麼大的情況下,使用 CPU 來訓練模型有什麼優勢?顯然,與昂貴的 GPU 不同,英特爾 ® 至強 ® 可擴展處理器 推理和訓練的性價比極高。在只使用英特爾 ® 至強 ® 可擴展處理器的情況下,內存可以便捷地根據需要擴充,同時也可以根據任務和場景分配計算核心,這樣的靈活性是其它硬件很難具備的。

例如拿一個入門級的小模型 LeNet-5 作為示例,我們可以討論一下如何用幾塊性價比極高的英特爾 ® 至強 ® 可擴展處理器,打造一個計算核心可分配的深度學習系統。當然,在本例子中,分配計算資源主要為了多個「用户」,也許是學生,都能高效地訓練 LeNet-5。實際上這種計算資源分配在企業中也非常常見,分割不同深度學習應用、不同用户的計算資源都是比較大的需求。

現在如果我們在英特爾 ® 至強 ® 可擴展處理器上使用 TensorFlow 訓練 LeNet-5,那麼重要的是確定最優併發線程數,以及最優算力分配方案,這樣才能充分利用 CPU 的能力。

首先對於確定最優併發線程數,TensorFlow 在 CPU 上有三個重要參數:

  • OMP 併發線程數:單個進程中線程的併發數

  • intra_op 線程併發數:執行單個 OP 算子 時的並行線程數

  • inter_op 線程併發數:執行多個 OP 算子之間的線程併發數

如上圖所示為經典的經驗參數,一般 inter_op 在絕大多數情況下設置為 1 效果最好,但確定前兩個參數需要實際運行一段時間。具體而言,我們可以給模型足夠多的算力,並選擇不同的併發線程數 thread_num,以查看模型的迭代速度。

首先我們可以選擇默認配置,這樣 LeNet-5 在 Fashion-MNIST 訓練一個 epoch 需要 160 秒左右。當然這裏因為數據集、模型特別小,所以可以用 epoch 的遍歷時間作為指標,在真實數據集中我們還可以以迭代多少次的時間作為指標。

CPU 在默認參數下訓練一個 epoch 的時間。

如下訓練代碼所示,現在我們可以將 OMP 與 intra_op 的並行數設置為 2,這樣就能嘗試新配置的訓練迭代時間。實驗表明這樣的配置能大幅度降低訓練耗時,最終只需要 4.55 秒。

LeNet-5 參數配置及訓練代碼,這一套配置迭代一個 epoch 的時間只需要 4.55 秒。

最後,依次將 thread_num 設置為不同的數值,我們就能得到一份並行數的分佈表,從而選出最優 thread_num。當然,不同模型會有不同的最優並行數,只是因為 LeNet-5 模型比較小,所以兩個並行數就能獲得非常好的效果。

LeNet-5 在 Fashion-MNIST 數據集上的最優線程數的分佈。

在確定最優線程數之後,我們還能確定為每個用户分配的最優核心數,即查看不同核數下的訓練時間與 CPU 利用率。這裏使用 numactl 命令就可以測試不同 Socket 與核心數運行模型。例如「numactl -C 0,48 -m 0 python train-lenet5.py」,則表明採用 0 與 48 兩個核心,第 0 個 Socket。

如上圖所示,這樣的配置看起來訓練速度也不是太低,只需要 6 秒就能迭代一個 epoch。這是由於 LeNet-5 模型較小,核多的時候,每個核分配到的計算量過小,導致整體計算效率不高,還不如分配少一點計算核心。

當我們跑完整個不同核心數的測試,就能得到下圖關於訓練時間、分配核心數、 CPU 利用率三者的關係。當然我們會選擇更加經濟高效的 2 核心配置。

總的而言,經過上面兩種實驗,我們能確定為單個 LeNet-5 模型配置的線程數、CPU 核心數這兩大參數。這樣的配置可以稱得上具有極高性價比了,假設單張至強 CPU 具有 32 核,那麼能為 16 個用户分配可觀的訓練資源,還不需要怎麼降低訓練速度。

所以説如果沒有超高時延要求,主要對訓練精度有要求的場景,CPU 的確是個高性價比的選擇,比如在製造業等領域。

AI 產業應用:CPU 也可以是主角

在企業中部署 AI 模型,CPU 服務器其實也特別常用,只要模型對推斷速度沒有那麼高的要求,只要模型不算特別大,使用搭載英特爾 ® 至強 ® 可擴展處理器的服務器部署可是能省太多預算了。在現實應用場景中,大多數 AI 實際要求的是併發量,要求計算的 指標是 Query Per Seconds, 這對於英特爾 ® 至強 ® 可擴展處理器來説特別合適。我們可以為每個模型進程配置適當的 CPU 核心數,從而獲得極高的併發量。

在製造業與圖像 / 影像業,模型都不會太大,它們就特別適合用 CPU 充當計算設備。

在製造業,基於機器視覺的工業輔助檢測,或者基於雲邊協同新架構的 AI 瑕疵檢測系統,都能引入了英特爾 ® 至強 ® 可擴展處理器作為邊緣服務器的核心計算引擎,並藉助英特爾 AVX-512 技術,為深度學習推理任務中的密集計算提供硬件加速,還引入 OpenVINO 工具套件來為檢測提供軟件調優,可大幅提升檢測準確率並降低人力成本。

在製造業中,至強可擴展處理器可作為邊緣計算設備,也可為多功能平台提供基本計算能力,以支持各種 AI 場景與模型。

此外對於常規的圖像、影像識別,若引入英特爾 ® 至強 ® 可擴展處理器,並利用 OpenVINO 工具套件的優化能力,就可以解決以往採購專用硬件服務器帶來的成本問題、推理速度與準確度平衡問題。使用 OpenVINO 工具套件來開展 AI 推理加速,深度學習模型能從 FP32 轉換成為使用 VNNI 進行優化的 INT8,成功地加快了影像信息系統中深度學習的推理速度。

使用 INT8 量化推理能充分利用 CPU 的計算能力提升推斷速度。

總的來説,從指令集到加速庫,CPU 在支持深度模型上已經做了很多優化,常規的模型只使用 CPU 進行訓練與推斷已經是非常不錯的選擇。這種選擇不僅具有極高的性價比,同時靈活性與穩定性還要遠遠超過其它計算設備,畢竟 CPU 內存、持久化儲存都能比較簡單地擴展。

所以,用 CPU 加速,AI 學習也能快又準。現在,你對英特爾 ® 至強 ® 可擴展處理器做 AI,是不是有了更多理解呢?

點擊【閲讀原文】,瞭解更多內容。

© THE END 

轉載請聯繫本公眾號獲得授權

投稿或尋求報道:[email protected]

「其他文章」