異構計算系列文章(一):定義、場景及侷限性

做者 | 顧鈞php

2020 開年,ZILLIZ 與 InfoQ 籌備了以異構計算爲專題的一系列文章。此篇文章做爲異構計算專題的開篇,總體性的介紹了異構計算的定義、場景與侷限性。在後續的專題文章中,咱們將深刻不一樣的 AI 應用場景進一步解釋異構計算的優點。

誕生伊始,計算機處理能力就處於高速發展中。及至最近十年,隨着大數據、區塊鏈、AI 等新技術的持續火爆,人們爲提高計算處理速度更是發展了多種不一樣的技術思路。大數據受惠於分佈式集羣技術,區塊鏈帶來了專用處理器(Application-Specific IC, ASIC)的春天,AI 則讓大衆聽到了「異構計算」這個計算機界的學術名詞。算法

「異構計算」(Heterogeneous computing),是指在系統中使用不一樣體系結構的處理器的聯合計算方式。在 AI 領域,常見的處理器包括:CPU(X86,Arm,RISC-V 等),GPU,FPGA 和 ASIC。(按照通用性從高到低排序)數據庫

AI 是一門較爲複雜、綜合的學科。在只有 CPU 平臺的狀況下,AI 開發者要學習的算法、模型、框架、編程語言已經很多。若是再考慮多個不一樣處理器平臺,狀況會變得更爲複雜。在展開討論不一樣的應用場景以前,咱們先了解一下什麼是「異構計算」。編程

異構計算服務器

首先須要明確的是,計算機體系結構≠硬件架構。體系結構不單包括硬件層面的實現,也包括軟件層面的考量。當 IBM 在 S/360 服務器中提出體系結構這個概念以前,每一代 IBM 服務器的硬件實現都會有所不一樣(其實今日的處理器硬件亦是如此)。由此帶來了各不相同的指令,以致於開發者編寫的軟件沒法在不一樣的 IBM 服務器上運行。架構

所以,經典的體系結構概念與軟硬件的界面——指令集有比較大的關係。一般來說,若是兩個處理器都能支持同一套指令集,那麼能夠認爲它們有相同的體系結構。比如 AMD 的 CPU 和 Intel 的 CPU 都屬於 X86 CPU。框架

雖然異構計算能帶來潛在的算力提高,但也會形成額外的開發成本。在進行異構計算開發以前,開發者須要進行幾個方面的評估。編程語言

第一,權衡代碼通用性與代碼性能。分佈式

今天的 AI 開發者恐怕只在較少的狀況下可能會直接使用指令集進行編程(例如,X86 CPU 的 AVX2 指令等),絕大多數狀況下,咱們用到的主要是些程序庫。然而程序庫在不一樣平臺上的實現依舊須要調用底層的指令集。在 AI 這樣須要高性能編程的領域,經常使用的 BLAS (Basic Linear Algebra Subprograms) 程序庫就有多種選擇:工具

即使只使用 CPU 進行計算,依然會面臨諸如 OpenBLAS 和 Intel MKL 之間的選擇。開發者須要根據具體需求謹慎評估通用性與性能之間的優先級。AI 這些年雖然很火,可是 AI 應用收益與開發成本的矛盾也一直較爲突出。

第二,考慮開發環境的成熟度。

雖然 AI 開發者可用的計算硬件有 CPU,GPU,FPGA,ASIC 等,目前開發環境比較成熟的是 CPU,GPU 和 FPGA。ASIC 在開發成熟度上目前較爲尷尬,由於應用專有芯片的開發依賴於所瞄準的應用是否已經達到了一個比較成熟的階段。而 AI 領域中,即使是最成熟的機器視覺(CV)也依然還在持續發展中。所以,ASIC 廠商要打造一個較爲穩定的開發環境面臨必定的挑戰。

這也無怪乎年初知名的「礦業」公司爆出了 AI 芯片團隊大規模裁人的消息。

第三,考慮技術普及程度。

越普及的技術硬件成本越低,人才儲備也更爲充足。這一點上, FPGA 就比較佔劣勢,畢竟通常人不多機會接觸 FPGA 硬件。

所以,目前異構計算開發仍然以 CPU 結合 GPU 爲主。

尋找異構計算場景

要真正發揮異構計算的優點,必須得尋找合適的場景。不然 GPU 等協處理器並不老是能帶來性能的提高。咱們先來回想一下 GPU 最典型、最擅長的應用場景——大型 3D 遊戲是怎麼樣的:

  1. 把遊戲數據載入顯存
  2. 在用戶遊戲的過程當中,顯卡始終在進行高速運算

以上看起來好像是一段廢話,但要理解 GPU 等協處理器的特色,這段廢話值得反覆回味。GPU 的優點場景在於:

  1. 必定量的數據。若是數據量過小,那麼 GPU 可能會比 CPU 慢。如何判斷這個臨界點也很簡單,能夠利用 Python 的 Pandas dataframe 和 RAPIDS 的 cuDF 進行一個對比測試。
  2. 數據量不能太大,顯存必定要裝得下。一旦發生顯存對外的 I/O(哪怕是內存和顯存之間的),處理速度依然會受到很大影響。
  3. 須要有持續的工做流發送給 GPU 處理。計算核心更多的 GPU 啓動代價比 CPU 高得多。

看似矛盾的第一點和第二點說明,要找到異構計算的優點場景並不容易。事實上,一個計算任務的處理時間包括計算與 I/O(CPU 訪問內存也算在內)兩部分。高算力的 AI 處理器能夠幫你加速計算的部分,但礙於服務器架構,異構計算也會帶來一些額外的 I/O 開銷。所以,問題的關鍵在於一個程序的處理時間到底是花在計算上更多,仍是花在 I/O 上更多。

在 Linux 系統下,咱們能夠經過 perf 工具(Linux kernel profiling)來了解一個處理任務執行時的 CPU 計算繁忙程度。

(引用自:https://perf.wiki.kernel.org/...

在上面的示例中,IPC(Instructions Per Second)僅爲 0.679,要知道現代的 CPU 單核 IPC 理論峯值能夠達到 10。通常認爲,運行時 IPC 若是低於 1,說明正在運行的工做流在 I/O(CPU 讀取內存)上花的時間更多。在這種狀況下,異構計算帶來的提高就不太可能像硬件廠商宣傳的那樣達到 10 倍,甚至 100 倍。

前面提到「異構計算也會帶來一些額外的 I/O 開銷」。這主要受限於以 CPU 爲核心的系統架構,其餘協處理器只能經過 PCI/E 鏈接到系統。當須要把數據從硬盤載入到顯存的時候:(假設使用 PCI/E 硬盤)

  1. 數據從硬盤通過 PCI/E 複製到內存
  2. 數據從內存通過 PCI/E 複製到顯存

在這種狀況下,數據從硬盤載入顯存的速度只有 PCI/E 傳輸速度的一半。爲了解決這個問題,GPU 廠商開發了 GPUDirect Storage 技術,這樣能夠直接把數據從硬盤加載到顯存。

(引用自:https://devblogs.nvidia.com/g...

通常企業級計算顯卡的顯存大小爲 16GB 或 32GB,而通常企業級 CPU 的內存上限能夠達到 768GB 或 1TB。在海量數據的場景下,如何利用異構算力須要仔細的設計,否則異構計算產生的 I/O 開銷可能會拔苗助長。

異構計算在 AI 中的應用

異構計算的優點與侷限都很是突出。在 AI 的全流程中,開發者逐漸在如下階段中找到了異構計算的場景。

  • 數據準備階段

不一樣於傳統大數據應用,AI 應用的數據不但包括通常的結構化數據,也包含了大量非結構化數據(如圖片、視頻、聲音、文本等)。針對海量結構化數據的處理,由於一般 I/O 佔比遠高於計算佔比,所以這部分數據的處理依舊以 CPU 爲主。不過,今天的 CPU 也提供了 AVX2 向量指令集進行 SIMD 計算(單指令多數據)。

但在非結構數據,尤爲是圖片、視頻等的轉解碼處理上,異構芯片的優點仍是比較明顯。

  • 模型訓練、調優階段

目前的深度學習模型主要是基於張量(tensor based)模型,不少 AI 處理器會着重增強本身的乘累加(MACC,基礎的矩陣計算操做)處理能力。模型訓練是整個 AI 流程中異構計算最爲有優點的部分。GPU,TPU 和其餘一些 ASIC 都能在這裏發揮做用。

回想一下前文中討論過的遊戲場景,模型訓練是否是和它很像呢?

  • 運行時階段

運行時的任務主要包括模型推理,向量類似度搜索等。

模型推理自己並不須要像模型訓練那樣進行大規模計算,但模型推理每每涉及多種不一樣類型的硬件部署平臺。所以,模型推理中的異構計算首要任務不是融合算力,而是考慮代碼的跨平臺通用性以下降開發成本。業界已經有一些開源模型推理框架來解決代碼的跨平臺通用性問題,好比 Linux 基金會旗下的 Adlik 和 微軟的 ONNX RT。

向量類似度搜索,是圖片、視頻搜索、推薦系統、問答系統中的經常使用技術。因爲要搜索的特徵向量規模每每會達到上億甚至十億級,搜索時的 I/O 比重很高,異構計算在搜索時的幫助會比較有限。可是在創建向量類似度索引時倒是一個典型的計算密集型任務,異構計算能大幅提高索引建立速度。供開發者參考的開源項目有 Facebook Faiss、Spotify Annoy、NMSLIB 以及 Linux 基金會旗下的 Milvus 等。

做者簡介:

顧鈞,畢業於北京大學,在數據庫相關領域有 15 年經驗。目前任職於 ZILLIZ,負責 Milvus 開源向量搜索引擎的社區建設與推廣。

本專題爲ZILLIZ 與infoQ 的合做專題 ,文章出處請見:

異構計算系列文章(一):定義、場景及侷限性-InfoQ​www.infoq.cn

相關文章
相關標籤/搜索